PageSourceSearch

https://botfaqtor.ru/yandex-clickfraud/js/app.min.2116312.js

js botfaqtor.ru collected 2026-10-03 19:17:47 UTC 47,339 bytes, 1,034 lines download raw bytes

1/* PLUGINS */
2// graph-tabs
3class GraphTabs {
4  constructor(selector, options) {
5    let defaultOptions = {
6      isChanged: () => {}
7    }
8    this.options = Object.assign(defaultOptions, options);
9    this.selector = selector;
10    this.tabs = document.querySelector(`[data-tabs="${selector}"]`);
11    if (this.tabs) {
12      this.tabList = this.tabs.querySelector('.tabs__nav');
13      this.tabsBtns = this.tabList.querySelectorAll('.tabs__nav-btn');
14      this.tabsPanels = this.tabs.querySelectorAll('.tabs__panel');
15    } else {
16      // console.error('Селектор data-tabs не существует!');
17      return;
18    }
19
20    this.check();
21    this.init();
22    this.events();
23  }
24
25  check() {
26    if (document.querySelectorAll(`[data-tabs="${this.selector}"]`).length > 1) {
27      console.error('Количество элементов с одинаковым data-tabs больше одного!');
28      return;
29    }
30
31    if (this.tabsBtns.length !== this.tabsPanels.length) {
32      console.error('Количество кнопок и элементов табов не совпадает!');
33      return;
34    }
35  }
36
37  init() {
38    this.tabList.setAttribute('role', 'tablist');
39
40    this.tabsBtns.forEach((el, i) => {
41      el.setAttribute('role', 'tab');
42      el.setAttribute('tabindex', '-1');
43      el.setAttribute('id', `${this.selector}${i + 1}`);
44      el.classList.remove('tabs__nav-btn--active');
45    });
46
47    this.tabsPanels.forEach((el, i) => {
48      el.setAttribute('role', 'tabpanel');
49      el.setAttribute('tabindex', '-1');
50      el.setAttribute('aria-labelledby', this.tabsBtns[i].id);
51      el.classList.remove('tabs__panel--active');
52    });
53
54    this.tabsBtns[0].classList.add('tabs__nav-btn--active');
55    this.tabsBtns[0].removeAttribute('tabindex');
56    this.tabsBtns[0].setAttribute('aria-selected', 'true');
57    this.tabsPanels[0].classList.add('tabs__panel--active');
58  }
59
60  events() {
61    this.tabsBtns.forEach((el, i) => {
62      el.addEventListener('click', (e) => {
63        let currentTab = this.tabList.querySelector('[aria-selected]');
64
65        if (e.currentTarget !== currentTab) {
66          this.switchTabs(e.currentTarget, currentTab);
67        }
68      });
69
70      el.addEventListener('keydown', (e) => {
71        let index = Array.prototype.indexOf.call(this.tabsBtns, e.currentTarget);
72
73        let dir = null;
74
75        if (e.which === 37) {
76          dir = index - 1;
77        } else if (e.which === 39) {
78          dir = index + 1;
79        } else if (e.which === 40) {
80          dir = 'down';
81        } else {
82          dir = null;
83        }
84
85        if (dir !== null) {
86          if (dir === 'down') {
87            this.tabsPanels[i].focus();
88          } else if (this.tabsBtns[dir]) {
89            this.switchTabs(this.tabsBtns[dir], e.currentTarget);
90          }
91        }
92      });
93    });
94  }
95
96  switchTabs(newTab, oldTab = this.tabs.querySelector('[aria-selected]')) {
97    newTab.focus();
98    newTab.removeAttribute('tabindex');
99    newTab.setAttribute('aria-selected', 'true');
100
101    oldTab.removeAttribute('aria-selected');
102    oldTab.setAttribute('tabindex', '-1');
103
104    let index = Array.prototype.indexOf.call(this.tabsBtns, newTab);
105    let oldIndex = Array.prototype.indexOf.call(this.tabsBtns, oldTab);
106
107    this.tabsPanels[oldIndex].classList.remove('tabs__panel--active');
108    this.tabsPanels[index].classList.add('tabs__panel--active');
109
110    this.tabsBtns[oldIndex].classList.remove('tabs__nav-btn--active');
111    this.tabsBtns[index].classList.add('tabs__nav-btn--active');
112
113    this.options.isChanged(this);
114  }
115};
116// lazysizes
117/*! lazysizes - v5.3.2 */
118
119!function(e){var t=function(u,D,f){"use strict";var k,H;if(function(){var e;var t={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",fastLoadedClass:"ls-is-cached",iframeLoadMode:0,srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:true,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:true,ricTimeout:0,throttleDelay:125};H=u.lazySizesConfig||u.lazysizesConfig||{};for(e in t){if(!(e in H)){H[e]=t[e]}}}(),!D||!D.getElementsByClassName){return{init:function(){},cfg:H,noSupport:true}}var O=D.documentElement,i=u.HTMLPictureElement,P="addEventListener",$="getAttribute",q=u[P].bind(u),I=u.setTimeout,U=u.requestAnimationFrame||I,o=u.requestIdleCallback,j=/^picture$/i,r=["load","error","lazyincluded","_lazyloaded"],a={},G=Array.prototype.forEach,J=function(e,t){if(!a[t]){a[t]=new RegExp("(\\s|^)"+t+"(\\s|$)")}return a[t].test(e[$]("class")||"")&&a[t]},K=function(e,t){if(!J(e,t)){e.setAttribute("class",(e[$]("class")||"").trim()+" "+t)}},Q=function(e,t){var a;if(a=J(e,t)){e.setAttribute("class",(e[$]("class")||"").replace(a," "))}},V=function(t,a,e){var i=e?P:"removeEventListener";if(e){V(t,a)}r.forEach(function(e){t[i](e,a)})},X=function(e,t,a,i,r){var n=D.createEvent("Event");
vendor: 5,660 bytes, line 119
119if(!a){a={}}a.instance=k;n.initEvent(t,!i,!r);n.detail=a;e.dispatchEvent(n);return n},Y=function(e,t){var a;if(!i&&(a=u.picturefill||H.pf)){if(t&&t.src&&!e[$]("srcset")){e.setAttribute("srcset",t.src)}a({reevaluate:true,elements:[e]})}else if(t&&t.src){e.src=t.src}},Z=function(e,t){return(getComputedStyle(e,null)||{})[t]},s=function(e,t,a){a=a||e.offsetWidth;while(a<H.minSize&&t&&!e._lazysizesWidth){a=t.offsetWidth;t=t.parentNode}return a},ee=function(){var a,i;var t=[];var r=[];var n=t;var s=function(){var e=n;n=t.length?r:t;a=true;i=false;while(e.length){e.shift()()}a=false};var e=function(e,t){if(a&&!t){e.apply(this,arguments)}else{n.push(e);if(!i){i=true;(D.hidden?I:U)(s)}}};e._lsFlush=s;return e}(),te=function(a,e){return e?function(){ee(a)}:function(){var e=this;var t=arguments;ee(function(){a.apply(e,t)})}},ae=function(e){var a;var i=0;var r=H.throttleDelay;var n=H.ricTimeout;var t=function(){a=false;i=f.now();e()};var s=o&&n>49?function(){o(t,{timeout:n});if(n!==H.ricTimeout){n=H.ricTimeout}}:te(function(){I(t)},true);return function(e){var t;if(e=e===true){n=33}if(a){return}a=true;t=r-(f.now()-i);if(t<0){t=0}if(e||t<9){s()}else{I(s,t)}}},ie=function(e){var t,a;var i=99;var r=function(){t=null;e()};var n=function(){var e=f.now()-a;if(e<i){I(n,i-e)}else{(o||r)(r)}};return function(){a=f.now();if(!t){t=I(n,i)}}},e=function(){var v,m,c,h,e;var y,z,g,p,C,b,A;var n=/^img$/i;var d=/^iframe$/i;var E="onscroll"in u&&!/(gle|ing)bot/.test(navigator.userAgent);var _=0;var w=0;var M=0;var N=-1;var L=function(e){M--;if(!e||M<0||!e.target){M=0}};var x=function(e){if(A==null){A=Z(D.body,"visibility")=="hidden"}return A||!(Z(e.parentNode,"visibility")=="hidden"&&Z(e,"visibility")=="hidden")};var W=function(e,t){var a;var i=e;var r=x(e);g-=t;b+=t;p-=t;C+=t;while(r&&(i=i.offsetParent)&&i!=D.body&&i!=O){r=(Z(i,"opacity")||1)>0;if(r&&Z(i,"overflow")!="visible"){a=i.getBoundingClientRect();r=C>a.left&&p<a.right&&b>a.top-1&&g<a.bottom+1}}return r};var t=function(){var e,t,a,i,r,n,s,o,l,u,f,c;var d=k.elements;if((h=H.loadMode)&&M<8&&(e=d.length)){t=0;N++;for(;t<e;t++){if(!d[t]||d[t]._lazyRace){continue}if(!E||k.prematureUnveil&&k.prematureUnveil(d[t])){R(d[t]);continue}if(!(o=d[t][$]("data-expand"))||!(n=o*1)){n=w}if(!u){u=!H.expand||H.expand<1?O.clientHeight>500&&O.clientWidth>500?500:370:H.expand;k._defEx=u;f=u*H.expFactor;c=H.hFac;A=null;if(w<f&&M<1&&N>2&&h>2&&!D.hidden){w=f;N=0}else if(h>1&&N>1&&M<6){w=u}else{w=_}}if(l!==n){y=innerWidth+n*c;z=innerHeight+n;s=n*-1;l=n}a=d[t].getBoundingClientRect();if((b=a.bottom)>=s&&(g=a.top)<=z&&(C=a.right)>=s*c&&(p=a.left)<=y&&(b||C||p||g)&&(H.loadHidden||x(d[t]))&&(m&&M<3&&!o&&(h<3||N<4)||W(d[t],n))){R(d[t]);r=true;if(M>9){break}}else if(!r&&m&&!i&&M<4&&N<4&&h>2&&(v[0]||H.preloadAfterLoad)&&(v[0]||!o&&(b||C||p||g||d[t][$](H.sizesAttr)!="auto"))){i=v[0]||d[t]}}if(i&&!r){R(i)}}};var a=ae(t);var S=function(e){var t=e.target;if(t._lazyCache){delete t._lazyCache;return}L(e);K(t,H.loadedClass);Q(t,H.loadingClass);V(t,B);X(t,"lazyloaded")};var i=te(S);var B=function(e){i({target:e.target})};var T=function(e,t){var a=e.getAttribute("data-load-mode")||H.iframeLoadMode;if(a==0){e.contentWindow.location.replace(t)}else if(a==1){e.src=t}};var F=function(e){var t;var a=e[$](H.srcsetAttr);if(t=H.customMedia[e[$]("data-media")||e[$]("media")]){e.setAttribute("media",t)}if(a){e.setAttribute("srcset",a)}};var s=te(function(t,e,a,i,r){var n,s,o,l,u,f;if(!(u=X(t,"lazybeforeunveil",e)).defaultPrevented){if(i){if(a){K(t,H.autosizesClass)}else{t.setAttribute("sizes",i)}}s=t[$](H.srcsetAttr);n=t[$](H.srcAttr);if(r){o=t.parentNode;l=o&&j.test(o.nodeName||"")}f=e.firesLoad||"src"in t&&(s||n||l);u={target:t};K(t,H.loadingClass);if(f){clearTimeout(c);c=I(L,2500);V(t,B,true)}if(l){G.call(o.getElementsByTagName("source"),F)}if(s){t.setAttribute("srcset",s)}else if(n&&!l){if(d.test(t.nodeName)){T(t,n)}else{t.src=n}}if(r&&(s||l)){Y(t,{src:n})}}if(t._lazyRace){delete t._lazyRace}Q(t,H.lazyClass);ee(function(){var e=t.complete&&t.naturalWidth>1;if(!f||e){if(e){K(t,H.fastLoadedClass)}S(u);t._lazyCache=true;I(function(){if("_lazyCache"in t){delete t._lazyCache}},9)}if(t.loading=="lazy"){M--}},true)});var R=function(e){if(e._lazyRace){return}var t;var a=n.test(e.nodeName);var i=a&&(e[$](H.sizesAttr)||e[$]("sizes"));var r=i=="auto";if((r||!m)&&a&&(e[$]("src")||e.srcset)&&!e.complete&&!J(e,H.errorClass)&&J(e,H.lazyClass)){return}t=X(e,"lazyunveilread").detail;if(r){re.updateElem(e,true,e.offsetWidth)}e._lazyRace=true;M++;s(e,t,r,i,a)};var r=ie(function(){H.loadMode=3;a()});var o=function(){if(H.loadMode==3){H.loadMode=2}r()};var l=function(){if(m){return}if(f.now()-e<999){I(l,999);return}m=true;H.loadMode=3;a();q("scroll",o,true)};return{_:function(){e=f.now();k.elements=D.getElementsByClassName(H.lazyClass);v=D.getElementsByClassName(H.lazyClass+" "+H.preloadClass);q("scroll",a,true);q("resize",a,true);q("pageshow",function(e){if(e.persisted){var t=D.querySelectorAll("."+H.loadingClass);if(t.length&&t.forEach){U(function(){t.forEach(function(e){if(e.complete){R(e)}})})}}});if(u.MutationObserver){new MutationObserver(a).observe(O,{childList:true,subtree:true,attributes:true})}else{O[P]("DOMNodeInserted",a,true);O[P]("DOMAttrModified",a,true);setInterval(a,999)}q("hashchange",a,true);["focus","mouseover","click","load","transitionend","animationend"].forEach(function(e){D[P](e,a,true)});if(/d$|^c/.test(D.readyState)){l()}else{q("load",l);D[P]("DOMContentLoaded",a);I(l,2e4)}if(k.elements.length){t();ee._lsFlush()}else{a()}},checkElems:a,unveil:R,_aLSL:o}}(),re=function(){var a;var n=te(function(e,t,a,i){var r,n,s;e._lazysizesWidth=i;i+="px";e.setAttribute("sizes",i);
119if(j.test(t.nodeName||"")){r=t.getElementsByTagName("source");for(n=0,s=r.length;n<s;n++){r[n].setAttribute("sizes",i)}}if(!a.detail.dataAttr){Y(e,a.detail)}});var i=function(e,t,a){var i;var r=e.parentNode;if(r){a=s(e,r,a);i=X(e,"lazybeforesizes",{width:a,dataAttr:!!t});if(!i.defaultPrevented){a=i.detail.width;if(a&&a!==e._lazysizesWidth){n(e,r,i,a)}}}};var e=function(){var e;var t=a.length;if(t){e=0;for(;e<t;e++){i(a[e])}}};var t=ie(e);return{_:function(){a=D.getElementsByClassName(H.autosizesClass);q("resize",t)},checkElems:t,updateElem:i}}(),t=function(){if(!t.i&&D.getElementsByClassName){t.i=true;re._();e._()}};return I(function(){H.init&&t()}),k={cfg:H,autoSizer:re,loader:e,init:t,uP:Y,aC:K,rC:Q,hC:J,fire:X,gW:s,rAF:ee}}(e,e.document,Date);e.lazySizes=t,"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:{});;
120/*! lazysizes - v5.3.2 */
121
122!function(e,t){var a=function(){t(e.lazySizes),e.removeEventListener("lazyunveilread",a,!0)};t=t.bind(null,e,e.document),"object"==typeof module&&module.exports?t(require("lazysizes")):"function"==typeof define&&define.amd?define(["lazysizes"],t):e.lazySizes?a():e.addEventListener("lazyunveilread",a,!0)}(window,function(e,z,c){"use strict";var g,y,b,f,r,l,s,v,m;e.addEventListener&&(g=c.cfg,y=/\s+/g,b=/\s*\|\s+|\s+\|\s*/g,f=/^(.+?)(?:\s+\[\s*(.+?)\s*\])(?:\s+\[\s*(.+?)\s*\])?$/,r=/^\s*\(*\s*type\s*:\s*(.+?)\s*\)*\s*$/,l=/\(|\)|'/,s={contain:1,cover:1},v=function(e,t){var a;t&&((a=t.match(r))&&a[1]?e.setAttribute("type",a[1]):e.setAttribute("media",g.customMedia[t]||t))},m=function(e){var t,a,r,i,s;e.target._lazybgset&&(a=(t=e.target)._lazybgset,(r=t.currentSrc||t.src)&&(i=l.test(r)?JSON.stringify(r):r,(s=c.fire(a,"bgsetproxy",{src:r,useSrc:i,fullSrc:null})).defaultPrevented||(a.style.backgroundImage=s.detail.fullSrc||"url("+s.detail.useSrc+")")),t._lazybgsetLoading&&(c.fire(a,"_lazyloaded",{},!1,!0),delete t._lazybgsetLoading))},addEventListener("lazybeforeunveil",function(e){var t,a,r,i,s,l,n,d,u,o;!e.defaultPrevented&&(t=e.target.getAttribute("data-bgset"))&&(u=e.target,(o=z.createElement("img")).alt="",o._lazybgsetLoading=!0,e.detail.firesLoad=!0,a=t,r=u,i=o,s=z.createElement("picture"),l=r.getAttribute(g.sizesAttr),n=r.getAttribute("data-ratio"),d=r.getAttribute("data-optimumx"),r._lazybgset&&r._lazybgset.parentNode==r&&r.removeChild(r._lazybgset),Object.defineProperty(i,"_lazybgset",{value:r,writable:!0}),Object.defineProperty(r,"_lazybgset",{value:s,writable:!0}),a=a.replace(y," ").split(b),s.style.display="none",i.className=g.lazyClass,1!=a.length||l||(l="auto"),a.forEach(function(e){var t,a=z.createElement("source");l&&"auto"!=l&&a.setAttribute("sizes",l),(t=e.match(f))?(a.setAttribute(g.srcsetAttr,t[1]),v(a,t[2]),v(a,t[3])):a.setAttribute(g.srcsetAttr,e),s.appendChild(a)}),l&&(i.setAttribute(g.sizesAttr,l),r.removeAttribute(g.sizesAttr),r.removeAttribute("sizes")),d&&i.setAttribute("data-optimumx",d),n&&i.setAttribute("data-ratio",n),s.appendChild(i),r.appendChild(s),setTimeout(function(){c.loader.unveil(o),c.rAF(function(){c.fire(o,"_lazyloaded",{},!0,!0),o.complete&&m({target:o})})}))}),z.addEventListener("load",m,!0),e.addEventListener("lazybeforesizes",function(e){var t,a,r,i;e.detail.instance==c&&e.target._lazybgset&&e.detail.dataAttr&&(t=e.target._lazybgset,r=t,i=(getComputedStyle(r)||{getPropertyValue:function(){}}).getPropertyValue("background-size"),!s[i]&&s[r.style.backgroundSize]&&(i=r.style.backgroundSize),s[a=i]&&(e.target._lazysizesParentFit=a,c.rAF(function(){e.target.setAttribute("data-parent-fit",a),e.target._lazysizesParentFit&&delete e.target._lazysizesParentFit})))},!0),z.documentElement.addEventListener("lazybeforesizes",function(e){var t,a;!e.defaultPrevented&&e.target._lazybgset&&e.detail.instance==c&&(e.detail.width=(t=e.target._lazybgset,a=c.gW(t,t.parentNode),(!t._lazysizesWidth||a>t._lazysizesWidth)&&(t._lazysizesWidth=a),t._lazysizesWidth))}))});;
123// accordion
124// accordion
125const accordions = document.querySelectorAll('.accordion');
126accordions.forEach(el => {
127    el.addEventListener('click', (e) => {
128        const self = e.currentTarget;
129        const control = self.querySelector('.accordion__control');
130        const content = self.querySelector('.accordion__content');
131
132        self.classList.toggle('open');
133
134        // если открыт аккордеон
135        if (self.classList.contains('open')) {
136            control.setAttribute('aria-expanded', true);
137            content.setAttribute('aria-hidden', false);
138            content.style.maxHeight = content.scrollHeight + 'px';
139        } else {
140            control.setAttribute('aria-expanded', false);
141            content.setAttribute('aria-hidden', true);
142            content.style.maxHeight = null;
143        }
144    });
145});;
146/* graph-modal */
147class GraphModal {
148  constructor(options) {
149    let defaultOptions = {
150      isOpen: () => {},
151      isClose: () => {},
152    }
153    this.options = Object.assign(defaultOptions, options);
154    this.modal = document.querySelector('.graph-modal');
155    this.speed = 300;
156    this.animation = 'fade';
157    this._reOpen = false;
158    this._nextContainer = false;
159    this.modalContainer = false;
160    this.isOpen = false;
161    this.previousActiveElement = false;
162    this._focusElements = [
163      'a[href]',
164      'input',
165      'select',
166      'textarea',
167      'button',
168      'iframe',
169      '[contenteditable]',
170      '[tabindex]:not([tabindex^="-"])'
171    ];
172    this._fixBlocks = document.querySelectorAll('.fix-block');
173    this.events();
174  }
175
176  events() {
177    if (this.modal) {
178      document.addEventListener('click', function (e) {
179        const clickedElement = e.target.closest(`[data-graph-path]`);
180        if (clickedElement) {
181          let target = clickedElement.dataset.graphPath;
182          let animation = clickedElement.dataset.graphAnimation;
183          let speed = clickedElement.dataset.graphSpeed;
184          this.animation = animation ? animation : 'fade';
185          this.speed = speed ? parseInt(speed) : 300;
186          this._nextContainer = document.querySelector(`[data-graph-target="${target}"]`);
187          this.open();
188          return;
189        }
190
191        if (e.target.closest('.js-modal-close')) {
192          this.close();
193          return;
194        }
195      }.bind(this));
196
197      window.addEventListener('keydown', function (e) {
198        if (e.keyCode == 27 && this.isOpen) {
199          this.close();
200        }
201
202        if (e.which == 9 && this.isOpen) {
203          this.focusCatch(e);
204          return;
205        }
206      }.bind(this));
207
208      document.addEventListener('click', function (e) {
209        if (e.target.classList.contains('graph-modal') && e.target.classList.contains("is-open")) {
210          this.close();
211        }
212      }.bind(this));
213    }
214
215  }
216
217  open(selector) {
218    this.previousActiveElement = document.activeElement;
219
220    if (this.isOpen) {
221      this.reOpen = true;
222      this.close();
223      return;
224    }
225
226    this.modalContainer = this._nextContainer;
227
228    if (selector) {
229      this.modalContainer = document.querySelector(`[data-graph-target="${selector}"]`);
230    }
231
232    this.modalContainer.scrollTo(0, 0)
233
234    this.modal.style.setProperty('--transition-time', `${this.speed / 1000}s`);
235    this.modal.classList.add('is-open');
236
237    document.body.style.scrollBehavior = 'auto';
238    document.documentElement.style.scrollBehavior = 'auto';
239
240    this.disableScroll();
241
242    this.modalContainer.classList.add('graph-modal-open');
243    this.modalContainer.classList.add(this.animation);
244
245    setTimeout(() => {
246      this.options.isOpen(this);
247      this.modalContainer.classList.add('animate-open');
248      this.isOpen = true;
249      this.focusTrap();
250    }, this.speed);
251  }
252
253  close() {
254    if (this.modalContainer) {
255      this.modalContainer.classList.remove('animate-open');
256      this.modalContainer.classList.remove(this.animation);
257      this.modal.classList.remove('is-open');
258      this.modalContainer.classList.remove('graph-modal-open');
259
260      this.enableScroll();
261
262      document.body.style.scrollBehavior = 'auto';
263      document.documentElement.style.scrollBehavior = 'auto';
264
265      this.options.isClose(this);
266      this.isOpen = false;
267      this.focusTrap();
268
269      if (this.reOpen) {
270        this.reOpen = false;
271        this.open();
272      }
273    }
274  }
275
276  focusCatch(e) {
277    const nodes = this.modalContainer.querySelectorAll(this._focusElements);
278    const nodesArray = Array.prototype.slice.call(nodes);
279    const focusedItemIndex = nodesArray.indexOf(document.activeElement)
280    if (e.shiftKey && focusedItemIndex === 0) {
281      nodesArray[nodesArray.length - 1].focus();
282      e.preventDefault();
283    }
284    if (!e.shiftKey && focusedItemIndex === nodesArray.length - 1) {
285      nodesArray[0].focus();
286      e.preventDefault();
287    }
288  }
289
290  focusTrap() {
291    const nodes = this.modalContainer.querySelectorAll(this._focusElements);
292    if (this.isOpen) {
293      if (nodes.length) nodes[0].focus();
294    } else {
295      this.previousActiveElement.focus();
296    }
297  }
298
299  disableScroll() {
300    let pagePosition = window.scrollY;
301    this.lockPadding();
302        if ($(window).width() < 900) {
303          document.body.classList.add('disable-scroll');
304          document.body.dataset.position = pagePosition;
305          document.body.style.top = -pagePosition + 'px';
306        }
307  }
308
309  enableScroll() {
310    let pagePosition = parseInt(document.body.dataset.position, 10);
311    this.unlockPadding();
312    document.body.style.top = 'auto';
313    document.body.classList.remove('disable-scroll');
314    window.scrollTo({
315      top: pagePosition,
316      left: 0
317    });
318    document.body.removeAttribute('data-position');
319  }
320
321  lockPadding() {
322    let paddingOffset = window.innerWidth - document.body.offsetWidth + 'px';
323    this._fixBlocks.forEach((el) => {
324      el.style.paddingRight = paddingOffset;
325    });
326    document.body.style.paddingRight = paddingOffset;
327  }
328
329  unlockPadding() {
330    this._fixBlocks.forEach((el) => {
331      el.style.paddingRight = '0px';
332    });
333    document.body.style.paddingRight = '0px';
334  }
335}
336
337// lazymap
338
339if(document.querySelector(".lazy-map-container")) {
340    const mapContainer = document.querySelector(".lazy-map-container");
341    const spinner = mapContainer.querySelector('.loader');
342    let mapLoaded = false;
343
344    function initMap() {
345        if (mapLoaded) return;
346
347        ymaps.ready(init);
348        mapLoaded = true;
349    }
350
351    function checkMapVisibility() {
352        const rect = mapContainer.getBoundingClientRect();
353        const isVisible = (
354            rect.top <= window.innerHeight &&
355            rect.bottom >= 0
356        );
357
358        if (isVisible && !mapLoaded) {
359            // Загружаем API Яндекс.Карт только когда карта видна
360            loadScript("https://api-maps.yandex.ru/2.1/?lang=ru_RU", initMap);
361            window.removeEventListener('scroll', checkMapVisibility);
362        }
363    }
364
365    // Проверяем при загрузке страницы
366    checkMapVisibility();
367    // И при скролле
368    window.addEventListener('scroll', checkMapVisibility);
369
370    // Функция загрузки скрипта
371    function loadScript(url, callback) {
372        var script = document.createElement("script");
373        script.onload = function() {
374            callback();
375        };
376        script.src = url;
377        document.head.appendChild(script);
378    }
379
380    // Инициализация карты
381    function init() {
382        var myMap = new ymaps.Map('map', {
383            center: [55.780975, 37.613861],
384            zoom: 16,
385            controls: []
386        });
387
388        var myPlacemark = new ymaps.Placemark([55.780975, 37.613861], {
389            hintContent: 'г. Москва, ул. Щепкина, д.28, офис 413',
390            balloonContent: 'г. Москва, ул. Щепкина, д.28, офис 413'
391        }, {
392            iconLayout: 'default#image',
393            iconImageHref: 'images/dist/map.png',
394            iconImageSize: [62, 62],
395            iconImageOffset: [-15, -42]
396        });
397
398        var zoomControl = new ymaps.control.ZoomControl({
399            options: {
400                size: "auto",
401                position: {
402                    top: 120,
403                    left: 15
404                }
405            }
406        });
407
408        myMap.controls.add(zoomControl);
409        myMap.geoObjects.add(myPlacemark);
410
411        // Ждем загрузки тайлов
412        var layer = myMap.layers.get(0).get(0);
413        waitForTilesLoad(layer).then(function() {
414            spinner.classList.remove('is-active');
415        });
416    };
417
418    function waitForTilesLoad(layer) {
419        return new ymaps.vow.Promise(function(resolve, reject) {
420            var tc = getTileContainer(layer),
421                readyAll = true;
422            tc.tiles.each(function(tile, number) {
423                if (!tile.isReady()) {
424                    readyAll = false;
425                }
426            });
427            if (readyAll) {
428                resolve();
429            } else {
430                tc.events.once("ready", function() {
431                    resolve();
432                });
433            }
434        });
435    }
436
437    function getTileContainer(layer) {
438        for (var k in layer) {
439            if (layer.hasOwnProperty(k)) {
440                if (
441                    layer[k] instanceof ymaps.layer.tileContainer.CanvasContainer ||
442                    layer[k] instanceof ymaps.layer.tileContainer.DomContainer
443                ) {
444                    return layer[k];
445                }
446            }
447        }
448        return null;
449    }
450}
451
452
453/* smooth scroll */
454// собираем все якоря; устанавливаем время анимации и количество кадров
455const anchors = [].slice.call(document.querySelectorAll('a[href*="#"]')),
456animationTime = 300,
457framesCount = 20;
458anchors.forEach(function(item) {
459// каждому якорю присваиваем обработчик события
460item.addEventListener('click', function(e) {
461// убираем стандартное поведение
462e.preventDefault();
463// для каждого якоря берем соответствующий ему элемент и определяем его координату Y
464let coordY = document.querySelector(item.getAttribute('href')).getBoundingClientRect().top + window.pageYOffset;
465// запускаем интервал, в котором
466let scroller = setInterval(function() {
467// считаем на сколько скроллить за 1 такт
468let scrollBy = coordY / framesCount;
469// если к-во пикселей для скролла за 1 такт больше расстояния до элемента
470// и дно страницы не достигнуто
471if(scrollBy > window.pageYOffset - coordY && window.innerHeight + window.pageYOffset < document.body.offsetHeight) {
472    // то скроллим на к-во пикселей, которое соответствует одному такту
473    window.scrollBy(0, scrollBy);
474    } else {
475    // иначе добираемся до элемента и выходим из интервала
476    window.scrollTo(0, coordY);
477    clearInterval(scroller);
478    }
479    // время интервала равняется частному от времени анимации и к-ва кадров
480    }, animationTime / framesCount);
481    });
482});;
483/* alt ref */
484function altRef($link)
485{
486    window.open($link);
487};
488
489
490/* SECTIONS */
491// not jQuery
492document.addEventListener('DOMContentLoaded', () => {
493	/* ---------------------- MENU ---------------------------- */
494	/* ---------------------- MENU ---------------------------- */
495if(document.querySelector('.header__toggle-burger')){
496    let burgerIcon = document.querySelector('.header__toggle-burger');
497    let closeIcon = document.querySelector('.header__toggle-close');
498    let menu = document.querySelector('.header__panel');
499    let scrollObject = document.querySelector('.header__panel');
500    burgerIcon.addEventListener('click', function(){
501        closeIcon.classList.remove('hidden');
502        burgerIcon.classList.add('hidden');
503        menu.classList.add('header__panel--open');
504        // scrollLock.disablePageScroll(scrollObject);
505    })
506    closeIcon.addEventListener('click', function(){
507        closeIcon.classList.add('hidden');
508        burgerIcon.classList.remove('hidden');
509        menu.classList.remove('header__panel--open');
510        // scrollLock.enablePageScroll(scrollObject);
511    })
512    // dropdown
513    let dropdowns = document.querySelectorAll('.nav__dropdown');
514    dropdowns.forEach(dropdown => {
515        document.addEventListener('click', (e) => {
516            if(!e.composedPath().includes(dropdown)){
517                dropdown.classList.remove('nav__dropdown--open');
518            }
519        });
520        dropdown.addEventListener('click', function(){
521            dropdown.classList.toggle('nav__dropdown--open');
522        });
523    });
524}
525    /* ---------------------- TELEGRAM POPUP ---------------------------- */
526    function getCookie(name) {
527    let cookie_arr = document.cookie.split('; ');
528    let cookie_obj = {};
529
530    for (let i=0; i<cookie_arr.length; i++) {
531        let nv = cookie_arr[i].split('=');
532        cookie_obj[nv[0]] = nv[1];
533    }
534
535    return cookie_obj[name];
536}
537
538let overlay_div = document.getElementById('tg-alert');
539
540if ( getCookie('hide_popup') == 'yes' ) {
541    overlay_div.style.display='none';
542}
543
544// При нажатии на кнопку ставим cookie, которая будет запрещать показ
545// модального окна
546document.getElementById('hide_popup')
547.addEventListener('click', function() {
548    // Ставим cookie на минуту.
549    var date = new Date(new Date().getTime() + 60 * 1000 * 43200);
550    document.cookie = "hide_popup=yes; path=/; expires=" + date.toUTCString();
551
552    // и сразу же скрываем окно
553    overlay_div.style.display='none';
554});;
555    /* ---------------------- PROT TABS ---------------------------- */
556    const tabs1 = new GraphTabs('tab', {
557    isChanged: (tabs) => {
558      console.log(tabs);
559    }
560});;
561    /* ---------------------- SERVICES ---------------------------- */
562    let serviceTabsSelectHeader = document.querySelector('.service__tabs-select-header');
563let serviceTabsSelectBody = document.querySelector('.service__tabs-select-body');
564let serviceTabsSelectDesc = document.querySelector('.service__tabs-select-desc');
565let thisTabClicked;
566
567
568serviceTabsSelectHeader.addEventListener('click', function(){
569  serviceTabsSelectBody.classList.toggle('service__tabs-select-body_active');
570  serviceTabsSelectHeader.classList.toggle('service__tabs-select-header_active');
571});
572
573
574const tabsService = new GraphTabs('service-tab', {
575    isChanged: (tabs) => {
576      clickedTabContent = document.querySelector('.service .tabs__nav-btn--active').innerHTML;
577      clickedTabDescription = document.querySelector('.service .tabs__panel--active .service__tabs-item-title').innerHTML;
578      serviceTabsSelectHeader.innerHTML = clickedTabContent;
579      serviceTabsSelectDesc.innerHTML = clickedTabDescription;
580
581      serviceTabsSelectBody.classList.remove('service__tabs-select-body_active');
582      serviceTabsSelectHeader.classList.remove('service__tabs-select-header_active');
583
584      if (document.documentElement.clientWidth < 768) {
585        document.querySelector('.service').scrollIntoView();
586      }
587    }
588});
589
590
591
592
593if (document.documentElement.clientWidth < 768) {
594  const sAccordions = document.querySelectorAll('.service__item');
595  sAccordions.forEach(el => {
596      el.addEventListener('click', (e) => {
597          const self = e.currentTarget;
598          const control = self.querySelector('.service__item-top');
599          const content = self.querySelector('.service__item-content');
600
601          self.classList.toggle('service__item_open');
602
603          // если открыт аккордеон
604          if (self.classList.contains('service__item_open')) {
605              control.setAttribute('aria-expanded', true);
606              content.setAttribute('aria-hidden', false);
607              content.style.maxHeight = content.scrollHeight + 'px';
608          } else {
609              control.setAttribute('aria-expanded', false);
610              content.setAttribute('aria-hidden', true);
611              content.style.maxHeight = null;
612          }
613      });
614  });
615
616
617  var timeout_id = setTimeout(function(){
618    let serviceTabsSelect = document.querySelector('.service__tabs-select');
619    serviceTabsSelect.classList.remove('service__tabs-select_start');
620    let serviceSection = document.querySelector('.service');
621    let serviceSectionOffset = serviceSection.offsetTop;
622    let serviceBox = document.querySelectorAll('.service__box');
623    let posTop;
624
625    document.addEventListener('scroll', function(){
626      posTop = window.pageYOffset;
627      if(posTop >= (serviceSectionOffset)){
628        serviceTabsSelect.classList.add('service__tabs-select_fixed');
629        for(let i = 0; serviceBox.length > i; i++){
630          serviceBox[i].classList.add('service__box_open');
631        }
632      }
633      else if(posTop <= (serviceSectionOffset)) {
634        serviceTabsSelect.classList.remove('service__tabs-select_fixed');
635        for(let i = 0; serviceBox.length > i; i++){
636          serviceBox[i].classList.remove('service__box_open');
637        }
638      }
639    });
640  }, 2000);
641
642};
643	/* ROLL NETWORK */
644    // roll-network
645let icoRollNetwork = document.querySelector('.ico-roll-network');
646let blockRoll = document.querySelector('.block-roll');
647let messageList = document.querySelector('.message-list');
648let chatChatIcon = document.querySelector('.chat-chat-icon');
649
650icoRollNetwork.addEventListener('click', function () {
651    blockRoll.classList.toggle("open-is");
652    return false;
653});
654messageList.addEventListener('click', function () {
655    blockRoll.classList.remove("open-is");
656    return false;
657});
658chatChatIcon.addEventListener('click', function () {
659    blockRoll.classList.remove("open-is");
660    return false;
661});
662
663let rollNetwork = document.querySelector('.roll-network');
664function getScrollPercentage() {
665    let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
666    let windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
667    let documentHeight = Math.max(
668        document.body.scrollHeight, document.body.offsetHeight, document.body.clientHeight,
669        document.documentElement.scrollHeight, document.documentElement.offsetHeight, document.documentElement.clientHeight
670    );
671    return ((scrollTop / (documentHeight - windowHeight)) * 100);
672}
673document.addEventListener("DOMContentLoaded", function() {
674    window.onscroll = function() {
675        if(getScrollPercentage() > 97){
676            rollNetwork.classList.add('roll-network_scrollbottom');
677        }
678        if(getScrollPercentage() < 97){
679            rollNetwork.classList.remove('roll-network_scrollbottom');
680        }
681    };
682});;
683	/* */
684    const pricenew2Tabs = new GraphTabs('pricenew2-tabs', {
685    isChanged: (tabs) => {
686      console.log(tabs);
687    }
688});;
689
690
691
692	let $modalScroll = document.querySelector('.graph-modal');
693	const modal = new GraphModal({
694		isOpen: (modal) => {
695			// scrollLock.disablePageScroll($modalScroll);
696		},
697		isClose: () => {
698			// scrollLock.enablePageScroll($modalScroll);
699		}
700	});
701});
702// jQuery
703$(document).ready(function() {
704	/* SCRIPTS */
705	// refcookies
706	/**
707 * Minified by jsDelivr using Terser v3.14.1.
708 * Original file: /npm/[email protected]/src/js.cookie.js
709 *
710 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
711 */
712!function(e){var n;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var t=window.Cookies,o=window.Cookies=e();o.noConflict=function(){return window.Cookies=t,o}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var t=arguments[e];for(var o in t)n[o]=t[o]}return n}function n(e){return e.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}return function t(o){function r(){}function i(n,t,i){if("undefined"!=typeof document){"number"==typeof(i=e({path:"/"},r.defaults,i)).expires&&(i.expires=new Date(1*new Date+864e5*i.expires)),i.expires=i.expires?i.expires.toUTCString():"";try{var c=JSON.stringify(t);/^[\{\[]/.test(c)&&(t=c)}catch(e){}t=o.write?o.write(t,n):encodeURIComponent(String(t)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=encodeURIComponent(String(n)).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var f="";for(var u in i)i[u]&&(f+="; "+u,!0!==i[u]&&(f+="="+i[u].split(";")[0]));return document.cookie=n+"="+t+f}}function c(e,t){if("undefined"!=typeof document){for(var r={},i=document.cookie?document.cookie.split("; "):[],c=0;c<i.length;c++){var f=i[c].split("="),u=f.slice(1).join("=");t||'"'!==u.charAt(0)||(u=u.slice(1,-1));try{var a=n(f[0]);if(u=(o.read||o)(u,a)||n(u),t)try{u=JSON.parse(u)}catch(e){}if(r[a]=u,e===a)break}catch(e){}}return e?r[e]:r}}return r.set=i,r.get=function(e){return c(e,!1)},r.getJSON=function(e){return c(e,!0)},r.remove=function(n,t){i(n,"",e(t,{expires:-1}))},r.defaults={},r.withConverter=t,r}(function(){})});
713//# sourceMappingURL=/sm/b0ce608ffc029736e9ac80a8dd6a7db2da8e1d45d2dcfc92043deb2214aa30d8.map;
714	//Получаем GET
715    function getGet(name) {
716        var s = window.location.search;
717        s = s.match(new RegExp(name + '=([^&=]+)'));
718        return s ? s[1] : false;
719    }
720    if (getGet('ref')) {
721        var ref = getGet('ref');
722        Cookies.set('ref', ref, {
723            domain: '.botfaqtor.ru',
724            expires: 30
725        });
726    }
727    var cookiesRef = Cookies.get('ref');
728    $(".header__connect").click(function () {
729        if (cookiesRef) {
730			location.href = 'https://my.botfaqtor.ru/signin?service=yandex-clickfraud';
731			//location.href='https://my.botfaqtor.ru/signin?service=yandex-clickfraud&ref='+cookiesRef;
732		} else {
733			location.href = 'https://my.botfaqtor.ru/signin?service=yandex-clickfraud';
734		}
735		return false;
736    });
737	// Результат замера источников трафика
738	$.getJSON("json/top-direct-platforms.json", function (data) {
739		$.each(data.Items, function (i, Items) {
740			var i = i+1;
741
742			var HumanPercent = Items.HumanPercent;
743			var UntargetedPercent = Items.UntargetedPercent;
744			var BotPercent = Items.BotPercent;
745			var FraudPercent = Items.FraudPercent;
746
747
748			$(".jsplatforms").append('<tr>'
749			+ '<td>'+i+'</td>'
750			+ '<td><div class="lable"><label class="checkbox favicon"><img alt=""src="https://s2.googleusercontent.com/s2/favicons?domain_url=' + Items.UtmKey + '"></label></div><label class="text-labl">' + Items.UtmKey + '</label></td>'
751			+ '<td class="text-center">' + Math.round(HumanPercent) + '%</td>'
752			+ '<td class="text-center">' + Math.round(UntargetedPercent) + '%</td>'
753			+ '<td class="text-center">' + Math.round(FraudPercent) + '%</td>'
754			+ '<td class="text-center">' + Math.round(BotPercent) + '%</td>'
755			+ '</tr>');
756		});
757	});
758
759	$(".calculator input").keyup(function () {
760    $(this).val(thousandSeparator($(this).val().replace(/[^0-9]/g, "")));
761    var yandex = $("[name='yandex']").val().replace(/\s/g, '');
762    var google = $("[name='google']").val().replace(/\s/g, '');
763    var vk = $("[name='vk']").val().replace(/\s/g, '');
764    var priceyandex = $("[name='priceyandex']").val().replace(/\s/g, '');
765    var pricegoogle = $("[name='pricegoogle']").val().replace(/\s/g, '');
766    var pricevk = $("[name='pricevk']").val().replace(/\s/g, '');
767    //var theme = $(".theme option").prop('selected', true).change().attr('data');
768    var theme = "";
769
770    $( ".calculator select option:selected" ).each(function() {
771        theme += $( this ).attr('data') + " ";
772    });
773
774
775
776    if(priceyandex == ''){
777        if(theme == undefined){
778            resultyandex = (yandex / 100 * theme)*50;
779        }else{
780            resultyandex = (yandex / 100 * 25)*50;
781        }
782    }else{
783        if(theme == undefined){
784            resultyandex = (yandex / 100 * theme)*priceyandex;
785        }else{
786            resultyandex = (yandex / 100 * 25)*priceyandex;
787        }
788    }
789
790    if(pricegoogle == ''){
791        if(theme == undefined){
792            resultgoogle = (google / 100 * theme)*50;
793        }else{
794            resultgoogle = (google / 100 * 25)*50;
795        }
796    }else{
797        if(theme == undefined){
798            resultgoogle = (google / 100 * theme)*pricegoogle;
799        }else{
800            resultgoogle = (google / 100 * 25)*pricegoogle;
801        }
802    }
803
804    if(pricevk == ''){
805        if(theme == undefined){
806            resultvk = (vk / 100 * theme)*50;
807        }else{
808            resultvk = (vk / 100 * 25)*50;
809        }
810    }else{
811        if(theme == undefined){
812            resultvk = (vk / 100 * theme)*pricevk;
813        }else{
814            resultvk = (vk / 100 * 25)*pricevk;
815        }
816    }
817
818
819
820    resultSUM = resultyandex+resultgoogle+resultvk;
821    var sumyear = resultSUM*12
822
823
824    if(sumyear || resultSUM){
825        $('.year span').text(thousandSeparator(Math.ceil(sumyear)));
826        $('.month span').text(thousandSeparator(Math.ceil(resultSUM)));
827    }else{
828        $('.year span').text('0');
829        $('.month span').text('0');
830    }
831
832});
833
834
835
836
837$(function () {
838    var $calc = $('.calc__wrapper'); // если у вас обёртка .calculator — замените селектор
839
840    function thousandSeparator(str) {
841        var parts = (str + '').split('.'),
842            main = parts[0],
843            len = main.length,
844            output = '',
845            i = len - 1;
846
847        while (i >= 0) {
848            output = main.charAt(i) + output;
849            if ((len - i) % 3 === 0 && i > 0) {
850                output = ' ' + output;
851            }
852            --i;
853        }
854
855        if (parts.length > 1) {
856            output += '.' + parts[1];
857        }
858
859        return output;
860    }
861
862    function toNumber(value) {
863        return parseFloat(String(value).replace(/\s/g, '').replace(',', '.')) || 0;
864    }
865
866    function recalc() {
867        var yandex = toNumber($("[name='yandex']", $calc).val());
868        var priceyandex = toNumber($("[name='priceyandex']", $calc).val());
869
870        var theme = parseFloat(
871            $("select[name='theme'] option:selected", $calc).attr('data')
872        ) || 0;
873
874        if (!theme) {
875            $('.year span', $calc).text('0');
876            $('.month span', $calc).text('0');
877            return;
878        }
879
880        // Если цена клика не заполнена — берём 50, как было в старом скрипте
881        var clickPrice = priceyandex || 50;
882
883        var resultyandex = (yandex / 100 * theme) * clickPrice;
884
885        var resultSUM = resultyandex;
886        var sumyear = resultSUM * 12;
887
888        if (sumyear || resultSUM) {
889            $('.year span', $calc).text(thousandSeparator(Math.ceil(sumyear)));
890            $('.month span', $calc).text(thousandSeparator(Math.ceil(resultSUM)));
891        } else {
892            $('.year span', $calc).text('0');
893            $('.month span', $calc).text('0');
894        }
895    }
896
897    $calc.on(
898        'change input',
899        "select[name='theme'], input[name='yandex'], input[name='priceyandex']",
900        recalc
901    );
902
903    recalc();
904});
905
906	/* BFQUIZ */
907    const fbTabs = new GraphTabs('bfquiz__fb-tab', {
908    isChanged: (tabs) => {
909      console.log(tabs);
910    }
911});
912
913setTimeout(function() {
914    $bfquizOpenButton = document.querySelector('.bfquiz-open-button');
915    $bfquizOpenButton.click();
916}, 15000);
917
918/* MAILER */
919var getUrlParameter = function getUrlParameter(sParam) {
920  var sPageURL = window.location.search.substring(1),
921      sURLVariables = sPageURL.split('&'),
922      sParameterName,
923      i;
924
925  for (i = 0; i < sURLVariables.length; i++) {
926      sParameterName = sURLVariables[i].split('=');
927
928      if (sParameterName[0] === sParam) {
929          return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
930      }
931  }
932};
933function getFormData($form) {
934  var config = {};
935  $form.serializeArray().map(function (item) {
936      if (config[item.name]) {
937          if (typeof (config[item.name]) === "string") {
938              config[item.name] = [config[item.name]];
939          }
940          config[item.name].push(item.value);
941      } else {
942          config[item.name] = item.value;
943      }
944  });
945  var Id = getUrlParameter("id");
946  config["Id"] = Id;
947  var Id = getUrlParameter("h");
948  config["Href"] = Id;
949  var Id = getUrlParameter("r");
950  config["Ref"] = Id;
951  return config;
952}
953$('#bfContactsForm').submit(function (e) {
954  $form = $(this);
955  var formData = JSON.stringify(getFormData($form));
956  formData = JSON.parse(formData);
957  formData.Phone = '+' + formData.Phone.replace(/\D/g,'');
958
959        ym(49731991, 'getClientID', function(clientID) {
960          formData.YandexClientId = clientID;
961          formData = JSON.stringify(formData);
962          $.ajax({
963              type: 'POST',
964              url: 'https://server.botfaqtor.ru/api/Account/quiz-connection-request',
965              contentType: 'application/json; charset=utf-8',
966              cache: false,
967              data: formData,
968              success: function () {
969                  window.location.replace("https://my.botfaqtor.ru/yandex-clickfraud-v3/ty.html");
970              },
971              statusCode: {
972                  400: function(){
973                      alert('Пользователь с таким email уже существует');
974                  }
975              }
976          });
977        });
978  e.preventDefault();
979});
980$('#bfContactsForm2').submit(function (e) {
981  $form = $(this);
982  var formData = JSON.stringify(getFormData($form));
983  formData = JSON.parse(formData);
984  formData.Phone = '+' + formData.Phone.replace(/\D/g,'');
985
986        ym(49731991, 'getClientID', function(clientID) {
987          formData.YandexClientId = clientID;
988          formData = JSON.stringify(formData);
989          $.ajax({
990              type: 'POST',
991              url: 'https://server.botfaqtor.ru/api/Account/quiz-connection-request',
992              contentType: 'application/json; charset=utf-8',
993              cache: false,
994              data: formData,
995              success: function () {
996                  window.location.replace("https://my.botfaqtor.ru/yandex-clickfraud-v3/ty.html");
997              },
998              statusCode: {
999                  400: function(){
1000                      alert('Пользователь с таким email уже существует');
1001                  }
1002              }
1003          });
1004        });
1005  e.preventDefault();
1006});
1007$('#bfContactsForm3').submit(function (e) {
1008  $form = $(this);
1009  var formData = JSON.stringify(getFormData($form));
1010  formData = JSON.parse(formData);
1011  formData.Phone = '+' + formData.Phone.replace(/\D/g,'');
1012
1013        ym(49731991, 'getClientID', function(clientID) {
1014          formData.YandexClientId = clientID;
1015          formData = JSON.stringify(formData);
1016          $.ajax({
1017              type: 'POST',
1018              url: 'https://server.botfaqtor.ru/api/Account/quiz-connection-request',
1019              contentType: 'application/json; charset=utf-8',
1020              cache: false,
1021              data: formData,
1022              success: function () {
1023                  window.location.replace("https://my.botfaqtor.ru/yandex-clickfraud-v3/ty.html");
1024              },
1025              statusCode: {
1026                  400: function(){
1027                      alert('Пользователь с таким email уже существует');
1028                  }
1029              }
1030          });
1031        });
1032  e.preventDefault();
1033});;
1034});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.