Skip to content

Instantly share code, notes, and snippets.

@johnd0e
Last active May 16, 2021 15:56
Show Gist options
  • Save johnd0e/d7c58f4bcb19c40dc68760a44c847785 to your computer and use it in GitHub Desktop.
Save johnd0e/d7c58f4bcb19c40dc68760a44c847785 to your computer and use it in GitHub Desktop.
IITC plugin: Yandex maps jsapi loader
// ==UserScript==
// @author johnd0e
// @name IITC plugin: Yandex maps jsapi loader (debug)
// @category Map Tiles
// @version 0.1.0
// @description Loads local copy of jsapi script in case when online one is not available (e.g. blocked by provider).
// @namespace https://gist.github.com/johnd0e
// @homepageURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785
// @supportURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785#new_comment_field
// @updateURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader-debug.meta.js
// @downloadURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader-debug.user.js
// @id yandex-maps-api-loader
// @match https://intel.ingress.com/*
// @grant none
// ==/UserScript==
function wrapper(plugin_info) {
// ensure plugin framework is there, even if iitc is not yet loaded
if(typeof window.plugin !== 'function') window.plugin = function() {};
// https://api-maps.yandex.ru/2.1/?mode=debug&lang=ru_RU
function setup () {
if (window.plugin.mapYandex) {
window.plugin.mapYandex.options.apiUrl = 'https://api-maps.yandex.com/{version}/';
window.plugin.mapYandex.options.apiParams = { mode: 'debug' };
}
}
setup.priority = 'high';
setup.info = plugin_info; //add the script info data to the function as a property
if(!window.bootPlugins) window.bootPlugins = [];
window.bootPlugins.push(setup);
// if IITC has already booted, immediately run the 'setup' function
if(window.iitcLoaded && typeof setup === 'function') setup();
} // wrapper end
// inject code into site context
var script = document.createElement('script');
var info = {};
if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description };
script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');'));
(document.body || document.head || document.documentElement).appendChild(script);
// ==UserScript==
// @author johnd0e
// @name IITC plugin: Yandex maps jsapi loader
// @category Map Tiles
// @version 0.1.0
// @description Loads local copy of jsapi script in case when online one is not available (e.g. blocked by provider).
// @namespace https://gist.github.com/johnd0e
// @homepageURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785
// @supportURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785#new_comment_field
// @updateURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.meta.js
// @downloadURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.user.js
// @id yandex-maps-api-loader
// @match https://intel.ingress.com/*
// @grant none
// ==/UserScript==
function wrapper(plugin_info) {
// ensure plugin framework is there, even if iitc is not yet loaded
if(typeof window.plugin !== 'function') window.plugin = function() {};
// https://api-maps.yandex.ru/2.1/?lang=ru_RU
function setup () {
if (window.plugin.mapYandex) {
window.plugin.mapYandex.options.apiUrl = 'https://gist.githack.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/ymaps-jsapi.js';
}
}
setup.priority = 'high';
setup.info = plugin_info; //add the script info data to the function as a property
if(!window.bootPlugins) window.bootPlugins = [];
window.bootPlugins.push(setup);
// if IITC has already booted, immediately run the 'setup' function
if(window.iitcLoaded && typeof setup === 'function') setup();
} // wrapper end
// inject code into site context
var script = document.createElement('script');
var info = {};
if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description };
script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');'));
(document.body || document.head || document.documentElement).appendChild(script);
// ==UserScript==
// @author johnd0e
// @name IITC plugin: Yandex maps jsapi loader
// @category Layer
// @version 0.1.0
// @description Loads local copy of jsapi script in case when online one is not available (e.g. blocked by provider).
// @namespace https://gist.github.com/johnd0e
// @homepageURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785
// @supportURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785#new_comment_field
// @updateURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.meta.js
// @downloadURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.user.js
// @id yandex-maps-api-loader
// @match https://intel.ingress.com/*
// @grant none
// ==/UserScript==
function wrapper(plugin_info) {
// ensure plugin framework is there, even if iitc is not yet loaded
if(typeof window.plugin !== 'function') window.plugin = function() {};
function onerror (resolve, reject) {
try {
// https://api-maps.yandex.ru/2.1/?lang=ru_RU
// (should be updated from time to time)
(function ymapsInit(e){var n=this,t={ns:{},supports:{},env:e},r=.01;t.performance=function(e){function n(){E=E||setTimeout(t,_)}function t(){clearTimeout(E),E=null;var e=r();if(e){var t=s+"/vars="+e+"/*";if(!a||!navigator.sendBeacon(o,t)){var i=new Image,u=(new Date).getTime()+Math.round(100*Math.random());i.src=o+"/rnd="+u+t}n()}}function r(){var e=[];return i(e,v),i(e,p),e.join(",")}function i(e,n){for(var t in n)if(n.hasOwnProperty(t)&&n[t].length&&(e.push(t+"="+n[t].shift()),e.length>=g))return}var o,s,a,u,c={exports:{}},l=(c.exports,window.performance||Object.create(null)),d=l.now?l.now.bind(l):function(){return Date.now()},f=l.getEntriesByType?function(e){return l.getEntriesByType("resource").filter(function(n){return n.name===e})[0]}:function(){},p={},v={},h={initjs:"i",mapjs:"m",combine_s:"cs",combine_m:"cm",combine_l:"cl"},m={eval:"e",duration:"d",cached:"c",encodedSize:"esz",decodedSize:"dsz",responseDuration:"res",requestDuration:"req"},y={statistics:{combine:{total:0,size:0,modules:0}},initTimings:{},now:d,getResourceTimings:function(e){return f(e)||{}},init:function(e){o=e.url,s="/pid=443/cid=73188/dtype=stred"+e.data,a=Boolean(e.useSendBeacon&&navigator.sendBeacon),u=e.enable,y.initTimings=y.getResourceTimings(e.initUrl),y.saveResourceTimings("initjs",y.initTimings,{size:!1,cached:!1})},saveMeasure:function(e,t){if(u){var r=/^@/.test(e);if(r){var i=e.replace(/^@/,"").split(".");e=(h[i[0]]||i[0])+"."+(m[i[1]]||i[1])}if(t=Math.round(t),!isNaN(t)){var o=r?p:v;o[e]=o[e]||[],o[e].push(t),n()}}},startMeasure:function(e,n){n="undefined"==typeof n?d():n;var t=!1;return{finish:function(r){t||(r="undefined"==typeof r?d():r,y.saveMeasure(e,r-n),t=!0)}}},saveResourceTimings:function(e,n,t){var r="object"==typeof n?n:f(n);if(r&&(t=t||{},e=e.replace(/^@?/,"@"),this.saveMeasure(e+".duration",r.duration),r.responseStart)){var i=0===r.transferSize?1:0;this.saveMeasure(e+".responseDuration",r.responseEnd-r.responseStart),this.saveMeasure(e+".requestDuration",r.responseStart-r.requestStart),t.cached!==!1&&this.saveMeasure(e+".cached",i),t.size===!1||i||(this.saveMeasure(e+".encodedSize",r.encodedBodySize/1024),this.saveMeasure(e+".decodedSize",r.decodedBodySize/1024))}}},g=40,_=5e3,E=null;return window.addEventListener("beforeunload",function(){y.saveMeasure("combine.total",y.statistics.combine.total),y.saveMeasure("combine.modules",y.statistics.combine.modules),y.saveMeasure("combine.size",y.statistics.combine.size/1024),t()}),c.exports=y,c.exports}();var i=t.performance.startMeasure("@initjs.eval");t.count=function(e){function n(){r.push(arguments)}var t={exports:{}},r=(t.exports,[]),i=null,o=function(){(i||n).apply(null,arguments)};return o.provideImplementation=function(e){if(i)throw new Error("ym.count: implementation was already provided.");i=e(r)},t.exports=o,t.exports}(),t.vow=t.ns.vow=function(e){var t,r={exports:{}};r.exports;return function(e){var n,i=function(){var n=[],t=function(e){return n.push(e),1===n.length},r=function(){var e=n,t=0,r=n.length;for(n=[];t<r;)e[t++]()};if("function"==typeof setImmediate)return function(e){t(e)&&setImmediate(r)};if("object"==typeof process&&process.nextTick)return function(e){t(e)&&process.nextTick(r)};var i=e.MutationObserver||e.WebKitMutationObserver;if(i){var o=1,s=document.createTextNode("");return new i(r).observe(s,{characterData:!0}),function(e){t(e)&&(s.data=o*=-1)}}if(e.postMessage){var a=!0;if(e.attachEvent){var u=function(){a=!1};e.attachEvent("onmessage",u),e.postMessage("__checkAsync","*"),e.detachEvent("onmessage",u)}if(a){var c="__promise"+Math.random()+"_"+new Date,l=function(e){e.data===c&&(e.stopPropagation&&e.stopPropagation(),r())};return e.addEventListener?e.addEventListener("message",l,!0):e.attachEvent("onmessage",l),function(n){t(n)&&e.postMessage(c,"*")}}}var d=e.document;if("onreadystatechange"in d.createElement("script")){var f=function(){var e=d.createElement("script");e.onreadystatechange=function(){e.parentNode.removeChild(e),e=e.onreadystatechange=null,r()},(d.documentElement||d.body).appendChild(e)};return function(e){t(e)&&f()}}return function(e){t(e)&&setTimeout(r,0)}}(),o=function(e){i(function(){throw e})},s=function(e){return"function"==typeof e},a=function(e){return null!==e&&"object"==typeof e},u=Object.prototype.toString,c=Array.isArray||function(e){return"[object Array]"===u.call(e)},l=function(e){for(var n=[],t=0,r=e.length;t<r;)n.push(t++);return n},d=Object.keys||function(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(t);return n},f=function(e){var n=function(n){this.name=e,this.message=n};return n.prototype=new Error,n},p=function(e,n){return function(t){e.call(this,t,n)}},v=function(){this._promise=new m};v.prototype={promise:function(){return this._promise},resolve:function(e){this._promise.isResolved()||this._promise._resolve(e)},reject:function(e){this._promise.isResolved()||(_.isPromise(e)?(e=e.then(function(e){var n=_.defer();return n.reject(e),n.promise()}),this._promise._resolve(e)):this._promise._reject(e))},notify:function(e){this._promise.isResolved()||this._promise._notify(e)}};var h={PENDING:0,RESOLVED:1,FULFILLED:2,REJECTED:3},m=function(e){if(this._value=n,this._status=h.PENDING,this._fulfilledCallbacks=[],this._rejectedCallbacks=[],this._progressCallbacks=[],e){var t=this,r=e.length;e(function(e){t.isResolved()||t._resolve(e)},r>1?function(e){t.isResolved()||t._reject(e)}:n,r>2?function(e){t.isResolved()||t._notify(e)}:n)}};m.prototype={valueOf:function(){return this._value},isResolved:function(){return this._status!==h.PENDING},isFulfilled:function(){return this._status===h.FULFILLED},isRejected:function(){return this._status===h.REJECTED},then:function(e,n,t,r){var i=new v;return this._addCallbacks(i,e,n,t,r),i.promise()},"catch":function(e,t){return this.then(n,e,t)},fail:function(e,t){return this.then(n,e,t)},always:function(e,n){var t=this,r=function(){return e.call(this,t)};return this.then(r,r,n)},progress:function(e,t){return this.then(n,n,e,t)},spread:function(e,n,t){return this.then(function(n){return e.apply(this,n)},n,t)},done:function(e,n,t,r){this.then(e,n,t,r).fail(o)},delay:function(e){var n,t=this.then(function(t){var r=new v;return n=setTimeout(function(){r.resolve(t)},e),r.promise()});return t.always(function(){clearTimeout(n)}),t},timeout:function(e){var n=new v,t=setTimeout(function(){n.reject(new _.TimedOutError("timed out"))},e);return this.then(function(e){n.resolve(e)},function(e){n.reject(e)}),n.promise().always(function(){clearTimeout(t)}),n.promise()},_vow:!0,_resolve:function(e){if(!(this._status>h.RESOLVED)){if(e===this)return void this._reject(TypeError("Can't resolve promise with itself"));if(this._status=h.RESOLVED,e&&e._vow)return void(e.isFulfilled()?this._fulfill(e.valueOf()):e.isRejected()?this._reject(e.valueOf()):e.then(this._fulfill,this._reject,this._notify,this));if(a(e)||s(e)){var n;try{n=e.then}catch(t){return void this._reject(t)}if(s(n)){var r=this,i=!1;try{n.call(e,function(e){i||(i=!0,r._resolve(e))},function(e){i||(i=!0,r._reject(e))},function(e){r._notify(e)})}catch(t){i||this._reject(t)}return}}this._fulfill(e)}},_fulfill:function(e){this._status>h.RESOLVED||(this._status=h.FULFILLED,this._value=e,this._callCallbacks(this._fulfilledCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_reject:function(e){this._status>h.RESOLVED||(this._status=h.REJECTED,this._value=e,this._callCallbacks(this._rejectedCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_notify:function(e){this._callCallbacks(this._progressCallbacks,e)},_addCallbacks:function(e,t,r,i,o){r&&!s(r)?(o=r,r=n):i&&!s(i)&&(o=i,i=n);var a;this.isRejected()||(a={defer:e,fn:s(t)?t:n,ctx:o},this.isFulfilled()?this._callCallbacks([a],this._value):this._fulfilledCallbacks.push(a)),this.isFulfilled()||(a={defer:e,fn:r,ctx:o},this.isRejected()?this._callCallbacks([a],this._value):this._rejectedCallbacks.push(a)),this._status<=h.RESOLVED&&this._progressCallbacks.push({defer:e,fn:i,ctx:o})},_callCallbacks:function(e,n){var t=e.length;if(t){var r=this.isResolved(),o=this.isFulfilled(),s=this.isRejected();i(function(){for(var i,a,u,c=0;c<t;)if(i=e[c++],a=i.defer,u=i.fn){var l,d=i.ctx;try{l=d?u.call(d,n):u(n)}catch(f){a.reject(f);continue}r?a.resolve(l):a.notify(l)}else o?a.resolve(n):s?a.reject(n):a.notify(n)})}}};var y={cast:function(e){return _.cast(e)},all:function(e){return _.all(e)},race:function(e){return _.anyResolved(e)},resolve:function(e){return _.resolve(e)},reject:function(e){return _.reject(e)}};for(var g in y)y.hasOwnProperty(g)&&(m[g]=y[g]);var _={Deferred:v,Promise:m,defer:function(){return new v},when:function(e,n,t,r,i){return _.cast(e).then(n,t,r,i)},fail:function(e,t,r){return _.when(e,n,t,r)},always:function(e,n,t){return _.when(e).always(n,t)},progress:function(e,n,t){return _.when(e).progress(n,t)},spread:function(e,n,t,r){return _.when(e).spread(n,t,r)},done:function(e,n,t,r,i){_.when(e).done(n,t,r,i)},isPromise:function(e){return a(e)&&s(e.then)},cast:function(e){return e&&e._vow?e:_.resolve(e)},valueOf:function(e){return e&&s(e.valueOf)?e.valueOf():e},isFulfilled:function(e){return!e||!s(e.isFulfilled)||e.isFulfilled()},isRejected:function(e){return!(!e||!s(e.isRejected))&&e.isRejected()},isResolved:function(e){return!e||!s(e.isResolved)||e.isResolved()},resolve:function(e){var n=_.defer();return n.resolve(e),n.promise()},fulfill:function(e){var n=_.defer(),t=n.promise();return n.resolve(e),t.isFulfilled()?t:t.then(null,function(e){return e})},reject:function(e){var n=_.defer();return n.reject(e),n.promise()},invoke:function(n,t){var r,i=Math.max(arguments.length-1,0);if(i){r=Array(i);for(var o=0;o<i;)r[o++]=arguments[o]}try{return _.resolve(r?n.apply(e,r):n.call(e))}catch(s){return _.reject(s)}},all:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=i;return _._forEach(e,function(e,t){o[r[t]]=e,--s||n.resolve(o)},n.reject,n.notify,n,r),n.promise()},allResolved:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=function(){--i||n.resolve(e)};return _._forEach(e,s,s,n.notify,n,r),n.promise()},allPatiently:function(e){return _.allResolved(e).then(function(){var n,t,r,i,o=c(e),s=o?l(e):d(e),a=s.length,u=0;if(!a)return o?[]:{};for(;u<a;)r=s[u++],i=e[r],_.isRejected(i)?(n||(n=o?[]:{}),o?n.push(i.valueOf()):n[r]=i.valueOf()):n||((t||(t=o?[]:{}))[r]=_.valueOf(i));if(n)throw n;return t})},any:function(e){var n=new v,t=e.length;if(!t)return n.reject(Error()),n.promise();var r,i=0;return _._forEach(e,n.resolve,function(e){i||(r=e),++i===t&&n.reject(r)},n.notify,n),n.promise()},anyResolved:function(e){var n=new v,t=e.length;return t?(_._forEach(e,n.resolve,n.reject,n.notify,n),n.promise()):(n.reject(Error()),n.promise())},delay:function(e,n){return _.resolve(e).delay(n)},timeout:function(e,n){return _.resolve(e).timeout(n)},_forEach:function(e,n,t,r,i,o){for(var s=o?o.length:e.length,a=0;a<s;)_.when(e[o?o[a]:a],p(n,a),t,r,i),++a},TimedOutError:f("TimedOut")};_.__nextTick__=i;var E=!0;"object"==typeof r&&"object"==typeof r.exports&&(r.exports=_,E=!1),"object"==typeof modules&&s(modules.define)&&(modules.define("vow",function(e){e(_)}),E=!1),"function"==typeof t&&(t(function(e,n,t){t.exports=_}),E=!1),E&&(e.vow=_)}("undefined"!=typeof window?window:n),r.exports}(),t.utils=function(e){function n(n){return e[n]}var t={exports:{}},r=t.exports,i=n("vow"),o=Object.prototype.hasOwnProperty;return r.nextTick=i.__nextTick__,i.__nextTick__=void 0,r.isArray=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},r.extend=Object.assign?Object.assign:function(e){for(var n=1,t=arguments.length;n<t;n++){var r=arguments[n];if(null!=r)for(var i in r)o.call(r,i)&&(e[i]=r[i])}return e},r.accessDeep=function(e,n){for(var t=n.split("."),r=0;r<t.length-1;r++){var i=t[r];e[i]=e[i]||{},e=e[i]}return{parent:e,name:t[t.length-1]}},r.createPackage=function(e,n,t){var i=r.registerImports({},e,n);return t&&(i.__expand={depends:e,imports:n}),i},r.registerImports=function(e,n,t){for(var i=0;i<n.length;i++)if(t[i].__expand)r.registerImports(e,t[i].__expand.depends,t[i].__expand.imports);else{var o=r.accessDeep(e,n[i]);o.parent[o.name]=t[i]}return e},t.exports}({vow:t.vow});var o=t.env.namespace?t.utils.accessDeep(n,t.env.namespace):null;o&&o.parent&&o.parent[o.name]&&o.parent[o.name].modules&&o.parent[o.name].ready&&console.error("(Yandex Maps JS API): api is already enabled on this page with same namespace."),function(){function e(e){return"undefined"==typeof d[e]?d[e]=n(e):d[e]}function n(e){return r(e)||r(f+o(e))||r(t.env.browser.cssPrefix+o(e))}function r(e){return"undefined"!=typeof i().style[e]?e:null}function i(){return u||(u=document.createElement("div"))}function o(e){return e?e.substr(0,1).toUpperCase()+e.substr(1):e}function s(n){var t=e(n);return t&&t!=n&&(t="-"+f+"-"+n),t}function a(n){return c[n]&&e("transitionProperty")?s(c[n]):null}var u,c={transform:"transform",opacity:"opacity",transitionTimingFunction:"transition-timing-function",userSelect:"user-select",height:"height"},l={},d={},f=t.env.browser.cssPrefix.toLowerCase();t.supports.css={checkProperty:e,checkTransitionProperty:function(e){return"undefined"==typeof l[e]?l[e]=a(e):l[e]},checkTransitionAvailability:a}}(),t.supports.csp={isSupported:"undefined"!=typeof Blob&&"undefined"!=typeof URL,isNonceSupported:t.env.browser.name&&t.env.browser.version?!(t.env.browser.name.search("Safari")!=-1&&parseInt(t.env.browser.version)<10):null},function(){function e(){if(!window.WebGLRenderingContext)return!1;var e={"Samsung Internet":!0,AndroidBrowser:!0},n="Webkit"==t.env.browser.engine&&+t.env.browser.engineVersion<537;return!n&&!e[t.env.browser.name]}function n(){if(!e())return null;var n,t;try{var r=document.createElement("canvas");t=r.getContext(n="webgl",i),t||(t=r.getContext(n="experimental-webgl",i),t||(n=null))}catch(o){n=null}return n?{contextName:n,context:t}:null}function r(e,n){e.width=226,e.height=256,n.fillStyle="#fff",n.fillRect(0,0,150,150),n.globalCompositeOperation="xor",n.fillStyle="#f00",n.fillRect(10,10,100,100),n.fillStyle="#0f0",n.fillRect(50,50,100,100);for(var t=n.getImageData(49,49,2,2),r=[],i=0;i<16;i++)r.push(t.data[i]);return"0x0x0x0x0x0x0x0x0x0x0x0x0x255x0x255"==r.join("x")}var i={failIfMajorPerformanceCaveat:!0,antialias:!1},o={};t.supports.graphics={hasSvg:function(){return"svg"in o||(o.svg=document.implementation&&document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")),o.svg},hasCanvas:function(){if(!("canvas"in o)){var e=document.createElement("canvas"),n="getContext"in e?e.getContext("2d"):null;o.canvas=!!n&&r(e,n)}return o.canvas},hasWebGl:function(){return"webgl"in o||(o.webgl=n()),o.webgl},redetect:function(){o={}},getWebGlContextName:function(){return o.webgl&&o.webgl.contextName}}}(),function(){function e(){var e=!0;"MacOS"==t.env.browser.osFamily&&/^10\.[0-8](\.|$)/.test(t.env.browser.osVersion)&&(e=!1,n("OldMac"));var o=["requestAnimationFrame","Worker","URL","Blob","XMLHttpRequest","Set","Map","WebAssembly"];o.forEach(function(t){window[t]||(e=!1,n(t))}),"function"!=typeof Math.trunc&&(e=!1,n("MathTrunc"));var s=t.supports.graphics.hasWebGl();if(!s||"webgl"!==s.contextName)return n("hasWebGl"),!1;var a=s.context;0==a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS)&&(e=!1,n("MAX_VERTEX_TEXTURE_IMAGE_UNITS")),a.getExtension("OES_vertex_array_object")||(e=!1,n("OES_vertex_array_object")),a.getExtension("OES_standard_derivatives")||(e=!1,n("OES_standard_derivatives"));var u=a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT);if(u&&0!=u.precision||(e=!1,n("highp")),!r()){var c=i();e=!1,t.count("error",{path:["vectorEngine.drawPointsError",t.env.browser.platform,t.env.browser.name,c.vendor,c.renderer].join("."),share:1})}return e}function n(e){var n=i();t.count("error",{path:["vectorEngine.reasonsVectorNotSupported",e,t.env.browser.platform,t.env.browser.name,n.vendor,n.renderer].join("."),share:.1})}function r(){var e=document.createElement("canvas");e.width=1,e.height=1;var n=e.getContext("webgl",{alpha:!1,depth:!1,antialias:!1}),t=n.createShader(n.VERTEX_SHADER);n.shaderSource(t,"#version 100\nattribute vec2 p;\nvoid main() {\n gl_Position = vec4(p,0,1);\n gl_PointSize = 1.0;\n}"),n.compileShader(t);var r=n.createShader(n.FRAGMENT_SHADER);n.shaderSource(r,"#version 100\nvoid main() {\n gl_FragColor = vec4(1, 0, 0, 1);\n}"),n.compileShader(r);var i=n.createProgram();n.attachShader(i,t),n.attachShader(i,r),n.bindAttribLocation(i,0,"p"),n.linkProgram(i);var o=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,o),n.bufferData(n.ARRAY_BUFFER,new Float32Array([0,0]),n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.clearColor(0,1,0,1),n.clear(n.COLOR_BUFFER_BIT),n.useProgram(i),n.drawArrays(n.POINTS,0,1);var s=new Uint8Array(4);return n.readPixels(0,0,1,1,n.RGBA,n.UNSIGNED_BYTE,s),255===s[0]}function i(){var e={},n=t.supports.graphics.hasWebGl();if(!n)return e;var r=n.context,i=r.getExtension("WEBGL_debug_renderer_info");return i&&(e.vendor=r.getParameter(i.UNMASKED_VENDOR_WEBGL).replace(/\W/g,"_"),e.renderer=r.getParameter(i.UNMASKED_RENDERER_WEBGL).replace(/\W/g,"_")),e}var o;t.supports.vector={isSupported:function(){return void 0===o&&(o=e()),o}}}(),t.supports.printPatchNeeded=!t.supports.css.checkProperty("printColorAdjust"),t.logger=function(e){function n(e,n){var r="";return t.env.debug&&(r+="("+e+"): "),r+=n}var r={exports:{}},i=(r.exports,"Yandex Maps JS API");return r.exports={assert:function(e,r){e||t.env.debug&&console.log(n(i,r))},log:function(e){t.env.debug&&console.log(n(i,e))},notice:function(e){t.env.debug&&console.info(n(i,e))},warning:function(e){t.env.debug&&console.warn(n(i,e))},error:function(e){console.error(n(i,e))},exception:function(e,t){throw new Error(n(e,t))}},r.exports}(),function(){var e=t.env.browser;e.documentMode=document.documentMode,e.isIE="MSIE"==e.name||"IEMobile"==e.name,e.isEdge="Edge"==e.engine,e.isChromium=e.base&&"chromium"==e.base.toLocaleLowerCase(),e.isSafari="Safari"==e.name;var n="Edge"==e.engine||"MSIE"==e.name&&e.osVersion>6.1||"IEMobile"==e.name&&e.engineVersion>=6;n?e.eventMapper="pointer":e.eventMapper="touchMouse",e.androidBrokenBuild="AndroidBrowser"==e.name&&"534.30"==e.engineVersion;var r=window.devicePixelRatio||screen.deviceXDPI&&screen.deviceXDPI/96||1,i="iOS"===e.osFamily||"Safari"===e.name||"WebKit"===e.engine&&"Safari"===e.base;"MSIE"==e.name||"IEMobile"==e.name||"Android"==e.osFamily&&"Gecko"==e.engine||i||r>1&&r<2?e.graphicsRenderEngine="svg":e.graphicsRenderEngine="canvas",e.transformTransition="Android"==e.osFamily||"iOS"==e.osFamily||"MSIE"==e.name||e.isChromium,e.css3DTransform="WebKit"==e.engine&&!("Android"==e.osFamily&&parseFloat(e.osVersion)<3)||"Gecko"==e.engine&&parseInt(e.engineVersion.split(".")[0])>=10,e.unsupported="OperaMini"==e.name}();var s=function(e){function n(n){return e[n]}function t(e){this._config=e,this._sandbox=this._config.createSandbox(this),this._definitionsByName=Object.create(null),this._definitionsByStorage=Object.create(null),this._remoteLoadingAllowed=d.defer(),this._initialized=this._remoteLoadingAllowed.promise().then(function(){return this._loadBundle(this._config.initialBudleName)},this)}function r(e,n,t,r,i,o,s,a,u){this.state=e,this.alias=null,this.name=n,this.storage=t,this.key=r,this.depends=i,this.dynamicDepends=a,this.declaration=o,this.context=s,this.exports=e===m.DEFINED?u:void 0,this.resolvingPromise=void 0,this.fetchingDeferred=void 0}function i(e,n){if(!e.dynamicDepends)return h;var t=[];for(var r in e.dynamicDepends)if(p.call(e.dynamicDepends,r))for(var i=0,o=n.length;i<o;i++){var a=n[i];if(void 0!==a){var u=e.dynamicDepends[r](a);s(u)&&t.push(u)}}return t}function o(e,n,t){return p.call(e.dynamicDepends,n)?e.dynamicDepends[n].call(null,t):v}function s(e){return"string"==typeof e||u(e)}function a(e){return e&&"object"==typeof e?e.key+"@"+e.storage:String(e)}function u(e){return null!=e&&"object"==typeof e&&"string"==typeof e.key&&"string"==typeof e.storage}function c(e){var n=f.isArray(e);return"object"==typeof e&&!n&&p.call(e,"modules")?{modules:f.isArray(e.modules)?e.modules:[e.modules],data:e.data}:n?{modules:e}:{modules:[e]}}var l={exports:{}},d=(l.exports,n("vow")),f=n("./ym.utils"),p=Object.prototype.hasOwnProperty,v={},h=Object.freeze([]),m={MENTIONED:1,QUEUED:2,FETCHING:3,DECLARED:4,RESOLVING:5,ERROR:6,DEFINED:7};return l.exports=t,t.prototype.allowRemoteLoading=function(){this._remoteLoadingAllowed.resolve()},t.prototype.isDefined=function(e){return Boolean(this._findDefinition(e))},t.prototype.preload=function(e){return e},t.prototype.define=function(e,n,t,i){var o,s,a,u;if("object"==typeof e){var c=e;e=c.name,s=c.storage,o=c.key,n=c.depends,t=c.declaration,i=c.context,a=c.dynamicDepends,u=c.exports}else 2===arguments.length&&(t=n,n=null);var l=new r(m.DECLARED,e,s,o,n,t,i,a,u);this._define(l)},t.prototype.defineSync=function(e){var n=new r(m.DEFINED,e.name,e.storage,e.key,null,null,null,null,e.module);this._define(n)},t.prototype._define=function(e){function n(){var n=new Error("ymaps.modules: redefinition of "+e.name);throw console.error(n),n}var t=this._definitionsByName[e.name];if(t){if(t.state>=m.DECLARED)return;return t.state!==m.FETCHING&&n(),t.state=m.DECLARED,t.declaration=e.declaration,t.context=e.context,t.storage=e.storage,t.key=e.key,e.depends&&("function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),t.depends=e.depends),t.dynamicDepends=e.dynamicDepends,void(t.exports=e.exports)}"function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),e.depends=e.depends||h,this._definitionsByName[e.name]=e,this._saveDefinitionToStorage(e)},t.prototype._resolve=function(e,n){if(!e.dynamicDepends){if(e.state===m.DEFINED)return d.resolve(e.exports);if(e.state===m.ERROR)return d.reject(e.exports)}e.state<m.RESOLVING&&!e.resolvingPromise&&(e.resolvingPromise=this._resolveCore(e,n).always(function(n){return e.resolvingPromise=void 0,n}));var t=i(e,[n]);return d.all([e.resolvingPromise,this._require(t,n)]).then(function(){return e.state===m.DEFINED?d.resolve(e.exports):d.reject(e.exports)})},t.prototype._resolveCore=function(e,n){return this._fetchModule(e,n).then(function(){return e.state=m.RESOLVING,this._require(e.depends,n)},this).then(function(n){function t(n,t){e.state===m.RESOLVING&&(e.state=t?m.ERROR:m.DEFINED,e.exports=t||n),i&&i.resolve(),t&&console.warn("ymaps.modules: provide(undefined, error) is deprecated and will be removed, throw instead. Module `"+e.name+"`.")}var r,i;t.async=function(n){e.state===m.RESOLVING&&(r=n.then(function(e){t(e)},function(e){t(void 0,e)}))},t.provide=t,t.provideAsync=t.async,t.dynamicDepends=e.dynamicDepends?{getValue:function(n,t){var r=o(e,n,t);return r===v?d.reject(new Error("ymaps.modules: dynamic dependency `"+n+"` is not declared.")):s(r)?this._require([r],t):d.resolve([r])}.bind(this),getValueSync:function(n,t){var r=o(e,n,t);if(!s(r))return r;var i=this._findDefinition(r);return i?this._requireSingleSync(i,t):void 0}.bind(this)}:null;var a=e.context||{name:e.name,depends:e.depends};try{e.declaration.apply(a,[t].concat(n))}catch(u){return e.state=m.ERROR,void(e.exports=u)}return r?r:e.state!==m.DEFINED&&e.state!==m.ERROR?(console.warn("ymaps.modules: asynchronous provide is deprecated and will be removed. Module `"+e.name+"`."),i=d.defer(),i.promise()):void 0},this)},t.prototype.require=function(e,n,t,r){var i="object"==typeof e&&!f.isArray(e),o=1===arguments.length;i&&(n=e.successCallback,t=e.errorCallback,r=e.context,o=!n&&!t),e=c(e);var s=this._require(e.modules,e.data);return o?s:void s.spread(n,t,r)},t.prototype.requireSync=function(e){if(e=c(e),1!==e.modules.length)throw new Error("ymaps.modules: only one module can be required synchronously.");var n=this._findDefinition(e.modules[0]);return n&&this._requireSingleSync(n,e.data)},t.prototype._requireSingleSync=function(e,n){for(var t=i(e,[n]),r=0,o=t.length;r<o;r++){var s=this._findDefinition(t[r]);if(!s||!this._requireSingleSync(s,n))return}return e.state===m.DEFINED?e.exports:void 0},t.prototype._require=function(e,n){var t=e.map(function(e){return this._requireSingle(e,n)},this);return d.all(t)},t.prototype._requireSingle=function(e,n){var t=this._findDefinition(e);return t?this._resolve(t,n):this._initialized.then(function(){var t=this._findDefinition(e);return t?this._resolve(t,n):d.reject(new Error("ymaps.modules: module `"+a(e)+"` is not defined."))},this)},t.prototype._findDefinition=function(e){if("undefined"!=typeof e)return"string"==typeof e?this._definitionsByName[e]:this._definitionsByStorage[e.storage]&&this._definitionsByStorage[e.storage][e.key]},t.prototype._saveDefinitionToStorage=function(e,n){if(e.key&&e.storage){n=n||{key:e.key,storage:e.storage};for(var t=f.isArray(n.key)?n.key:[n.key],r=0,i=t.length;r<i;r++)this._definitionsByStorage[n.storage]=this._definitionsByStorage[n.storage]||{},this._definitionsByStorage[n.storage][t[r]]=e}},t.prototype._fetchModule=function(e){return e.state>=m.DECLARED?d.resolve():this._loadFullBundle()},t.prototype._loadFullBundle=function(){if(!this._fullBundlePromise){for(var e in this._definitionsByName)this._definitionsByName[e].state===m.MENTIONED&&(this._definitionsByName[e].state=m.FETCHING);this._fullBundlePromise=this._loadBundle("full")}return this._fullBundlePromise},t.prototype._loadBundle=function(e){return this._config.fetchBundle(e).then(function(e){function n(){return d.delay().then(function(){var e=i.splice(0,o);if(e.forEach(function(e){e(t)}),i.length>0)return n()})}e.missingModules.forEach(function(e){var n=new r(m.MENTIONED,e,(void 0),(void 0),[],null,null,(void 0));this._definitionsByName[e]=n},this);var t=this._sandbox,i=e.modules,o=400;return n()},this)["catch"](function(n){throw console.error('ymaps: Failed to bundle "'+e+'".'+(n?n.stack||n.message||"":"")),n})},t.prototype._loadModulesMap=function(){return this._config.fetchMap().spread(function(e,n){this._processLoadedMap(e),n()},this)},l.exports}({vow:t.vow,"./ym.utils":t.utils}),a=t.env.server.url+"/"+t.env.server.path.replace(/\/$/,"")+"/images/";t.modules=new s({dependenciesContext:t,initialBudleName:t.env.preload.bundle,fetchBundle:function(e){var r=("__ymaps_"+t.env.namespace+"_"+Date.now()).replace(/\W/g,"_");n[r]=t.ns;var i=document.createElement("script");i.src=t.env.bundles.BASE+t.env.bundles[e],i.setAttribute("data-ymaps-api-ns",r),i.setAttribute("data-ymaps-api-version","2.1.78"),i.async=!0;var o=t.vow.defer();return i.onerror=o.reject.bind(o),t.ns.__provideBundle=o.resolve.bind(o),document.head.appendChild(i),o.promise().always(function(e){return delete n[r],e})},createSandbox:function(e){var n=Object.create(e);return n.importImages=function(e){return{get:function(n){return a+e[n].src}}},t.utils.extend({},t,{modules:n})}}),t.ns.load=function(e,n,r,i){return"function"==typeof e?n?t.ns.ready(["package.full"],e,n):t.ns.ready(["package.full"],e):("string"==typeof e&&(e=[e]),t.ns.ready.apply(this,arguments))},function(){function e(e){return function(){console.warn("{NS}.modules.{FN} is not a public API and will be removed from {NS}.modules.".replace(/\{NS\}/g,t.env.namespace).replace(/\{FN\}/g,e));var n=t.modules[e].apply(t.modules,arguments);return n===t.modules?t.ns.modules:n}}t.ns.modules={require:function(){return t.modules.require.apply(t.modules,arguments)},isDefined:function(){return t.modules.isDefined.apply(t.modules,arguments)},requireSync:function(){return t.modules.requireSync.apply(t.modules,arguments)},define:function(e,n,r,i){return t.modules.define.apply(t.modules,arguments),t.ns.modules},defineSync:e("defineSync"),getDefinition:e("getDefinition"),getState:e("getState"),setOptions:e("setOptions"),flush:e("flush"),nextTick:e("nextTick"),watchResolving:e("watchResolving"),__modules:t.modules}}(),function(e){function n(){l&&(t.performance.saveMeasure("ymaps.readyDelay",t.performance.now()-t.performance.initTimings.responseEnd),l=!1);var e=t.performance.startMeasure("ymaps.ready"),n={};arguments.length&&(1!=arguments.length||"object"!=typeof arguments[0]||arguments[0].length?"function"!=typeof arguments[0]?(n.require="string"==typeof arguments[0]?[arguments[0]]:arguments[0],n.successCallback=arguments[1],n.errorCallback=arguments[2]&&"function"==typeof arguments[2]?arguments[2]:null,n.context=arguments[2]&&"object"==typeof arguments[2]?arguments[2]:arguments[3]):(n.successCallback=arguments[0],n.errorCallback=arguments[1]&&"function"==typeof arguments[1]?arguments[1]:null,n.context=arguments[1]&&"object"==typeof arguments[1]?arguments[1]:arguments[2]):n=arguments[0]);var r=n.require||[],i=o.all([t.modules.require(r),u,c]).spread(function(n){return t.utils.registerImports(t.ns,r,n),e.finish(),t.ns});return i.then(n.successCallback&&function(e){setTimeout(n.successCallback.bind(n.context),0,e)},n.errorCallback&&function(e){setTimeout(n.errorCallback.bind(n.context),0,e)}),i}function r(n,t){if(n){var r=i(e,n);r&&setTimeout(function(){r.method.call(r.context,t)})}}function i(e,n){var t=e;n=n.split(".");for(var r=0,i=n.length-1;r<i;r++)if(t=t[n[r]],!t)return;return{method:t[n[i]],context:t}}var o=t.vow,s=[].concat(["package.system"],t.env.preload.load.split(",").filter(Boolean)),a=t.performance.startMeasure("ymaps.preload"),u=t.modules.require(s).then(function(e){t.utils.registerImports(t.ns,s,e),a.finish(),r(t.env.preload.onLoad,t.ns)},function(e){return r(t.env.preload.onError,e),o.reject(e)}),c="complete"===document.readyState||"interactive"===document.readyState?o.resolve():new o.Promise(function(e){document.addEventListener("DOMContentLoaded",e,!1),document.addEventListener("load",e,!1)});t.ns.ready=n;var l=!0}(this),t.env.server.params.csp&&!t.supports.csp.isSupported&&t.logger.warning("CSP is not suported in this browser"),t.modules.define("vectorEngine.loadEngine",["vow","Hotspot","Monitor","collection.Item","event.Manager","hotspot.layer.Hint","hotspot.layer.optionMapper","interactivityModel.EventController","interactivityModel.layer","option.Manager","poi.BalloonManager","util.shapeFactory"],function(e,n){function r(){var e=n.defer(),r=document.createElement("script");return r.onload=e.resolve.bind(e),r.onerror=e.reject.bind(e),r.src=t.env.hosts.vectorIndex.replace("{{version}}",t.env.vectorVersion),t.env.vectorEngineFileName&&(r.src=r.src.replace("vector.min.js",t.env.vectorEngineFileName)),document.head.insertAdjacentElement("afterbegin",r),e.promise()["catch"](function(){return n.reject(new Error("Failed to load vector engine"))})}if("ymaps"!==t.env.namespace)throw new Error("Vector supports only `ymaps` namespace.");if(null==t.env.vectorVersion)throw new Error("No vector version.");var i=null;e(function(){return i=i||r()})}),t.modules.define("vectorEngine.preload",[],function(e){t.supports.vector.isSupported()&&t.modules.require(["vectorEngine.loadEngine"]).spread(function(e){e()}),e({})}),t.modules.allowRemoteLoading(),o&&(o.parent[o.name]=t.ns),t.performance.init({url:t.env.hosts.api.statCounter+"/counter",data:"/path="+t.env.version.replace(/\W/g,"_")+"."+t.env.browser.platform,enable:"all"==t.env.counters||Math.random()<r&&!t.env.server.params.debug,initUrl:document.currentScript&&document.currentScript.src,useSendBeacon:!t.env.server.params.csp}),t.env.hasValidApiKey||(t.env.apikey=void 0,"undefined"!=typeof t.env.hasValidApiKey&&console.warn("(Yandex Maps JS API): Invalid API key")),i.finish()})({"vectorVersion":"5.15.2","vectorVersionTimestamp":1620814269072,"cacheVersion":null,"type":"production","flags":[],"server":{"url":"https://api-maps.yandex.ru/2.1.78","path":"build/release","params":{"mode":"release","ns":"ymaps","csp":null}},"preload":{"load":"package.full","bundle":"full"},"mode":"release","debug":false,"namespace":"ymaps","enterprise":false,"hasApiKeyParam":false,"browser":{"name":"Chrome","version":"90.0.4430.93","base":"Chromium","engine":"WebKit","engineVersion":"537.36","osName":"Windows 10","osFamily":"Windows","osVersion":"10.0","isMobile":false,"isTablet":false,"multiTouch":false,"platform":"Desktop","cssPrefix":"Webkit"},"lang":"ru_RU","languageCode":"ru","countryCode":"RU","hosts":{"api":{"main":"https://api-maps.yandex.ru/","ua":"https://yandex.ru/legal/maps_termsofuse/?lang={{lang}}","maps":"https://yandex.ru/maps/","statCounter":"https://yandex.ru/clck/","services":{"coverage":"https://api-maps.yandex.ru/services/coverage/","geocode":"https://geocode-maps.yandex.ru/","geoxml":"https://api-maps.yandex.ru/services/geoxml/","inception":"https://api-maps.yandex.ru/services/inception/","panoramaLocate":"https://api-maps.yandex.ru/services/panoramas/","search":"https://api-maps.yandex.ru/services/search/","suggest":"https://suggest-maps.yandex.ru/","regions":"https://api-maps.yandex.ru/services/regions/","route":"https://api-maps.yandex.ru/services/route/"}},"layers":{"map":"https://core-renderer-tiles.maps.yandex.net/tiles?l=map&%c&%l","mapj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=mapj&%c&%l&experimental_disable_toponym_hotspots=true","sat":"https://core-sat.maps.yandex.net/tiles?l=sat&%c&%l","skl":"https://core-renderer-tiles.maps.yandex.net/tiles?l=skl&%c&%l","sklj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=sklj&%c&%l","stv":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=stv&%c&v=%v&%l&format=png","sta":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=sta&%c&v=%v&%l&format=png","staHotspot":"https://core-stv-renderer.maps.yandex.net/2.x/tiles?l=stj&%c&v=%v&format=js","staHotspotKey":"%c&l=stj&tm=%v","carparks":"https://core-carparks-renderer-lots.maps.yandex.net/"},"metro_RU":"https://yandex.ru/metro/","metro_UA":"https://yandex.ua/metro/","metro_BY":"https://yandex.by/metro/","metro_US":"https://yandex.com/metro/","traffic":"https://core-jams-rdr-cache.maps.yandex.net/","trafficInfo":"https://core-jams-info.maps.yandex.net/","trafficArchive":"https://core-jams-rdr-hist.maps.yandex.net/","vectorIndex":"https://yastatic.net/s3/mapsapi-v3/vector/{{version}}/out/vector.min.js","vectorTiles":"https://core-renderer-tiles.maps.yandex.net/vmap2/tiles?lang={{lang}}&x={{x}}&y={{y}}&z={{z}}&zmin={{zmin}}&zmax={{zmax}}&v={{version}}","vectorImages":"https://core-renderer-tiles.maps.yandex.net/vmap2/icons?id={{id}}&scale={{scale}}","vectorMeshes":"https://core-renderer-tiles.maps.yandex.net/vmap2/meshes?id={{id}}","vectorGlyphs":"https://core-renderer-tiles.maps.yandex.net/vmap2/glyphs?lang={{lang}}&font_id={{fontId}}&range={{range}}","indoorTiles":"https://core-renderer-tiles.maps.yandex.net/","panoramasTiles":"https://pano.maps.yandex.net/%s/%z.%x.%y","taxiRouteInfo":"https://taxi-routeinfo.taxi.yandex.net/taxi_info?clid=yamaps&apikey=f6d7c076e16e4d53a928961595e76215&rll={rll}"},"layers":{"map":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sat":{"version":"3.786.0"},"skl":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"stv":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"sta":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"trf":{"version":"1620814200","scaled":true},"carparks":{"version":"","scaled":true,"hotspotZoomRange":[0,23]}},"geolocation":{"longitude":31.482771,"latitude":49.02753,"isHighAccuracy":false,"span":{"longitude":18.090408,"latitude":7.214737}},"token":"a005daa235b407b431a9b150bb3ea073","distribution":{},"version":"2.1.78","majorVersion":"2.1","cssPrefix":"ymaps-2-1-78-","tag":"2.1.78-11","coordinatesOrder":"latlong","bundles":{"panoramas":"/release/panoramas-8d02ed1377a16bfcc73b4950c04e42d8bed31c02.js","full":"/release/full-ffb813a29f30feadb63b5654242d042b7b6a91aa.js","BASE":"https://yastatic.net/s3/front-maps-static/maps-front-jsapi-v2-1/2.1.78-11/build"}}, null)
resolve();
} catch (e) {
console.error(e);
reject('API loading failed');
}
}
function setup () {
L.Yandex.include({
_loadScript: function (url) {
return new Promise(function (resolve, reject) {
var script = document.createElement('script');
script.onload = resolve;
script.onerror = function () {
console.warn('Error loading Yandex maps jsapi. Trying to load embedded script...')
loadlocal(resolve, reject);
};
script.src = url;
document.body.appendChild(script);
});
}
});
}
setup.priority = 'low';
setup.info = plugin_info; //add the script info data to the function as a property
if(!window.bootPlugins) window.bootPlugins = [];
window.bootPlugins.push(setup);
// if IITC has already booted, immediately run the 'setup' function
if(window.iitcLoaded && typeof setup === 'function') setup();
} // wrapper end
// inject code into site context
var script = document.createElement('script');
var info = {};
if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description };
script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');'));
(document.body || document.head || document.documentElement).appendChild(script);
(function ymapsInit (env) {
var global = this;
var ym = {
ns: {},
supports: {},
env: env
};
var PERFORMANCE_SHARE = 0.01;
ym.performance = (function (deps) {
var module = { exports: {} }, exports = module.exports, define;
function require (name) { return deps[name]; }
var performance = window.performance || Object.create(null);
var now = performance.now ? performance.now.bind(performance) : function () { return Date.now(); };
var getResourceTimings = !performance.getEntriesByType ? function () {} :
function getResourceTimings (url) {
return performance.getEntriesByType('resource').filter(function (x) { return x.name === url; })[0];
};
var url, dataBase, useSendBeacon, enable;
var pendingResourceMeasures = {};
var pendingMeasures = {};
var RESOURCE_MAP = { initjs: 'i', mapjs: 'm', combine_s: 'cs', combine_m: 'cm', combine_l: 'cl' };
var TIMING_MAP = { eval: 'e', duration: 'd', cached: 'c', encodedSize: 'esz', decodedSize: 'dsz', responseDuration: 'res', requestDuration: 'req' };
var ymPerformance = {
statistics: {
combine: {
total: 0,
size: 0,
modules: 0
}
},
initTimings: {},
now: now,
getResourceTimings: function (url) { return getResourceTimings(url) || {}; },
init: function (options) {
url = options.url;
dataBase = '/pid=443/cid=73188/dtype=stred' + options.data;
useSendBeacon = Boolean(options.useSendBeacon && navigator.sendBeacon);
enable = options.enable;
ymPerformance.initTimings = ymPerformance.getResourceTimings(options.initUrl);
ymPerformance.saveResourceTimings('initjs', ymPerformance.initTimings, { size: false, cached: false });
},
/** Saves measure to count it later. Prioritizes non-resources over resources (name starts with @). */
saveMeasure: function (name, value) {
if (!enable) {
return;
}
var isResource = /^@/.test(name);
if (isResource) {
// Make resources name shorter.
var parts = name.replace(/^@/, '').split('.');
name = (RESOURCE_MAP[parts[0]] || parts[0]) + '.' + (TIMING_MAP[parts[1]] || parts[1]);
}
value = Math.round(value);
if (!isNaN(value)) {
var pending = isResource ? pendingResourceMeasures : pendingMeasures;
pending[name] = pending[name] || [];
pending[name].push(value);
enqueueFlush();
}
},
startMeasure: function (name, start) {
start = typeof start === 'undefined' ? now() : start;
var finished = false;
return {
finish: function (end) {
if (!finished) {
end = typeof end === 'undefined' ? now() : end;
ymPerformance.saveMeasure(name, end - start);
finished = true;
}
}
};
},
/** Saves all available measures for resource. */
saveResourceTimings: function (name, filterOrTimings, options) {
var timings = typeof filterOrTimings === 'object' ? filterOrTimings : getResourceTimings(filterOrTimings);
if (!timings) {
return;
}
options = options || {};
name = name.replace(/^@?/, '@');
this.saveMeasure(name + '.duration', timings.duration);
if (!timings.responseStart) {
// Timing-Allow-Origin is not working, nothing to measure.
return;
}
var cached = timings.transferSize === 0 ? 1 : 0;
this.saveMeasure(name + '.responseDuration', timings.responseEnd - timings.responseStart);
this.saveMeasure(name + '.requestDuration', timings.responseStart - timings.requestStart);
if (options.cached !== false) {
this.saveMeasure(name + '.cached', cached);
}
if (options.size !== false && !cached) {
this.saveMeasure(name + '.encodedSize', timings.encodedBodySize / 1024);
this.saveMeasure(name + '.decodedSize', timings.decodedBodySize / 1024);
}
}
};
var BATCH_SIZE = 40;
var BATCH_TIMEOUT = 5000;
var nextFlushTimer = null;
function enqueueFlush () {
nextFlushTimer = nextFlushTimer || setTimeout(flush, BATCH_TIMEOUT);
}
function flush () {
clearTimeout(nextFlushTimer);
nextFlushTimer = null;
var batch = getNextBatch();
if (!batch) {
return;
}
var data = dataBase + '/vars=' + batch + '/*';
if (!useSendBeacon || !navigator.sendBeacon(url, data)) {
var img = new Image();
var rnd = (new Date()).getTime() + Math.round(Math.random() * 100);
img.src = url + '/rnd=' + rnd + data;
}
enqueueFlush();
}
function getNextBatch () {
var batch = [];
// Prioritize non-resource measures over resource measures.
fillBatch(batch, pendingMeasures);
fillBatch(batch, pendingResourceMeasures);
return batch.join(',');
}
function fillBatch (batch, measures) {
for (var key in measures) {
if (measures.hasOwnProperty(key) && measures[key].length) {
batch.push(key + '=' + measures[key].shift());
if (batch.length >= BATCH_SIZE) {
return;
}
}
}
}
window.addEventListener('beforeunload', function () {
ymPerformance.saveMeasure('combine.total', ymPerformance.statistics.combine.total);
ymPerformance.saveMeasure('combine.modules', ymPerformance.statistics.combine.modules);
ymPerformance.saveMeasure('combine.size', ymPerformance.statistics.combine.size / 1024);
flush();
});
module.exports = ymPerformance;
return module.exports;
})();
var initEvalMeasure = ym.performance.startMeasure('@initjs.eval');
ym.count = (function (deps) {
var module = { exports: {} }, exports = module.exports, define;
function require (name) { return deps[name]; }
// Store counts in queue until real counter is loaded.
var queue = [];
function enqueueCount () { queue.push(arguments); }
// Add another level of indirection because Sandbox runs modules not with
// ym itself, but with its clone.
var countImplementation = null;
var count = function () {
(countImplementation || enqueueCount).apply(null, arguments);
};
// Replace queue counter with real implementation.
count.provideImplementation = function (getImplementation) {
if (countImplementation) {
throw new Error('ym.count: implementation was already provided.');
}
countImplementation = getImplementation(queue);
};
module.exports = count;
return module.exports;
})();
ym.vow = ym.ns.vow = (function (deps) {
var module = { exports: {} }, exports = module.exports, define;
function require (name) { return deps[name]; }
/**
* @module vow
* @author Filatov Dmitry <dfilatov@yandex-team.ru>
* @version 0.4.13
* @license
* Dual licensed under the MIT and GPL licenses:
* * http://www.opensource.org/licenses/mit-license.php
* * http://www.gnu.org/licenses/gpl.html
*/
(function(global) {
var undef,
nextTick = (function() {
var fns = [],
enqueueFn = function(fn) {
fns.push(fn);
return fns.length === 1;
},
callFns = function() {
var fnsToCall = fns, i = 0, len = fns.length;
fns = [];
while(i < len) {
fnsToCall[i++]();
}
};
if(typeof setImmediate === 'function') { // ie10, nodejs >= 0.10
return function(fn) {
enqueueFn(fn) && setImmediate(callFns);
};
}
if(typeof process === 'object' && process.nextTick) { // nodejs < 0.10
return function(fn) {
enqueueFn(fn) && process.nextTick(callFns);
};
}
var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; // modern browsers
if(MutationObserver) {
var num = 1,
node = document.createTextNode('');
new MutationObserver(callFns).observe(node, { characterData : true });
return function(fn) {
enqueueFn(fn) && (node.data = (num *= -1));
};
}
if(global.postMessage) {
var isPostMessageAsync = true;
if(global.attachEvent) {
var checkAsync = function() {
isPostMessageAsync = false;
};
global.attachEvent('onmessage', checkAsync);
global.postMessage('__checkAsync', '*');
global.detachEvent('onmessage', checkAsync);
}
if(isPostMessageAsync) {
var msg = '__promise' + Math.random() + '_' +new Date,
onMessage = function(e) {
if(e.data === msg) {
e.stopPropagation && e.stopPropagation();
callFns();
}
};
global.addEventListener?
global.addEventListener('message', onMessage, true) :
global.attachEvent('onmessage', onMessage);
return function(fn) {
enqueueFn(fn) && global.postMessage(msg, '*');
};
}
}
var doc = global.document;
if('onreadystatechange' in doc.createElement('script')) { // ie6-ie8
var createScript = function() {
var script = doc.createElement('script');
script.onreadystatechange = function() {
script.parentNode.removeChild(script);
script = script.onreadystatechange = null;
callFns();
};
(doc.documentElement || doc.body).appendChild(script);
};
return function(fn) {
enqueueFn(fn) && createScript();
};
}
return function(fn) { // old browsers
enqueueFn(fn) && setTimeout(callFns, 0);
};
})(),
throwException = function(e) {
nextTick(function() {
throw e;
});
},
isFunction = function(obj) {
return typeof obj === 'function';
},
isObject = function(obj) {
return obj !== null && typeof obj === 'object';
},
toStr = Object.prototype.toString,
isArray = Array.isArray || function(obj) {
return toStr.call(obj) === '[object Array]';
},
getArrayKeys = function(arr) {
var res = [],
i = 0, len = arr.length;
while(i < len) {
res.push(i++);
}
return res;
},
getObjectKeys = Object.keys || function(obj) {
var res = [];
for(var i in obj) {
obj.hasOwnProperty(i) && res.push(i);
}
return res;
},
defineCustomErrorType = function(name) {
var res = function(message) {
this.name = name;
this.message = message;
};
res.prototype = new Error();
return res;
},
wrapOnFulfilled = function(onFulfilled, idx) {
return function(val) {
onFulfilled.call(this, val, idx);
};
};
/**
* @class Deferred
* @exports vow:Deferred
* @description
* The `Deferred` class is used to encapsulate newly-created promise object along with functions that resolve, reject or notify it.
*/
/**
* @constructor
* @description
* You can use `vow.defer()` instead of using this constructor.
*
* `new vow.Deferred()` gives the same result as `vow.defer()`.
*/
var Deferred = function() {
this._promise = new Promise();
};
Deferred.prototype = /** @lends Deferred.prototype */{
/**
* Returns the corresponding promise.
*
* @returns {vow:Promise}
*/
promise : function() {
return this._promise;
},
/**
* Resolves the corresponding promise with the given `value`.
*
* @param {*} value
*
* @example
* ```js
* var defer = vow.defer(),
* promise = defer.promise();
*
* promise.then(function(value) {
* // value is "'success'" here
* });
*
* defer.resolve('success');
* ```
*/
resolve : function(value) {
this._promise.isResolved() || this._promise._resolve(value);
},
/**
* Rejects the corresponding promise with the given `reason`.
*
* @param {*} reason
*
* @example
* ```js
* var defer = vow.defer(),
* promise = defer.promise();
*
* promise.fail(function(reason) {
* // reason is "'something is wrong'" here
* });
*
* defer.reject('something is wrong');
* ```
*/
reject : function(reason) {
if(this._promise.isResolved()) {
return;
}
if(vow.isPromise(reason)) {
reason = reason.then(function(val) {
var defer = vow.defer();
defer.reject(val);
return defer.promise();
});
this._promise._resolve(reason);
}
else {
this._promise._reject(reason);
}
},
/**
* Notifies the corresponding promise with the given `value`.
*
* @param {*} value
*
* @example
* ```js
* var defer = vow.defer(),
* promise = defer.promise();
*
* promise.progress(function(value) {
* // value is "'20%'", "'40%'" here
* });
*
* defer.notify('20%');
* defer.notify('40%');
* ```
*/
notify : function(value) {
this._promise.isResolved() || this._promise._notify(value);
}
};
var PROMISE_STATUS = {
PENDING : 0,
RESOLVED : 1,
FULFILLED : 2,
REJECTED : 3
};
/**
* @class Promise
* @exports vow:Promise
* @description
* The `Promise` class is used when you want to give to the caller something to subscribe to,
* but not the ability to resolve or reject the deferred.
*/
/**
* @constructor
* @param {Function} resolver See https://github.com/domenic/promises-unwrapping/blob/master/README.md#the-promise-constructor for details.
* @description
* You should use this constructor directly only if you are going to use `vow` as DOM Promises implementation.
* In other case you should use `vow.defer()` and `defer.promise()` methods.
* @example
* ```js
* function fetchJSON(url) {
* return new vow.Promise(function(resolve, reject, notify) {
* var xhr = new XMLHttpRequest();
* xhr.open('GET', url);
* xhr.responseType = 'json';
* xhr.send();
* xhr.onload = function() {
* if(xhr.response) {
* resolve(xhr.response);
* }
* else {
* reject(new TypeError());
* }
* };
* });
* }
* ```
*/
var Promise = function(resolver) {
this._value = undef;
this._status = PROMISE_STATUS.PENDING;
this._fulfilledCallbacks = [];
this._rejectedCallbacks = [];
this._progressCallbacks = [];
if(resolver) { // NOTE: see https://github.com/domenic/promises-unwrapping/blob/master/README.md
var _this = this,
resolverFnLen = resolver.length;
resolver(
function(val) {
_this.isResolved() || _this._resolve(val);
},
resolverFnLen > 1?
function(reason) {
_this.isResolved() || _this._reject(reason);
} :
undef,
resolverFnLen > 2?
function(val) {
_this.isResolved() || _this._notify(val);
} :
undef);
}
};
Promise.prototype = /** @lends Promise.prototype */ {
/**
* Returns the value of the fulfilled promise or the reason in case of rejection.
*
* @returns {*}
*/
valueOf : function() {
return this._value;
},
/**
* Returns `true` if the promise is resolved.
*
* @returns {Boolean}
*/
isResolved : function() {
return this._status !== PROMISE_STATUS.PENDING;
},
/**
* Returns `true` if the promise is fulfilled.
*
* @returns {Boolean}
*/
isFulfilled : function() {
return this._status === PROMISE_STATUS.FULFILLED;
},
/**
* Returns `true` if the promise is rejected.
*
* @returns {Boolean}
*/
isRejected : function() {
return this._status === PROMISE_STATUS.REJECTED;
},
/**
* Adds reactions to the promise.
*
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified
* @param {Object} [ctx] Context of the callbacks execution
* @returns {vow:Promise} A new promise, see https://github.com/promises-aplus/promises-spec for details
*/
then : function(onFulfilled, onRejected, onProgress, ctx) {
var defer = new Deferred();
this._addCallbacks(defer, onFulfilled, onRejected, onProgress, ctx);
return defer.promise();
},
/**
* Adds only a rejection reaction. This method is a shorthand for `promise.then(undefined, onRejected)`.
*
* @param {Function} onRejected Callback that will be called with a provided 'reason' as argument after the promise has been rejected
* @param {Object} [ctx] Context of the callback execution
* @returns {vow:Promise}
*/
'catch' : function(onRejected, ctx) {
return this.then(undef, onRejected, ctx);
},
/**
* Adds only a rejection reaction. This method is a shorthand for `promise.then(null, onRejected)`. It's also an alias for `catch`.
*
* @param {Function} onRejected Callback to be called with the value after promise has been rejected
* @param {Object} [ctx] Context of the callback execution
* @returns {vow:Promise}
*/
fail : function(onRejected, ctx) {
return this.then(undef, onRejected, ctx);
},
/**
* Adds a resolving reaction (for both fulfillment and rejection).
*
* @param {Function} onResolved Callback that will be invoked with the promise as an argument, after the promise has been resolved.
* @param {Object} [ctx] Context of the callback execution
* @returns {vow:Promise}
*/
always : function(onResolved, ctx) {
var _this = this,
cb = function() {
return onResolved.call(this, _this);
};
return this.then(cb, cb, ctx);
},
/**
* Adds a progress reaction.
*
* @param {Function} onProgress Callback that will be called with a provided value when the promise has been notified
* @param {Object} [ctx] Context of the callback execution
* @returns {vow:Promise}
*/
progress : function(onProgress, ctx) {
return this.then(undef, undef, onProgress, ctx);
},
/**
* Like `promise.then`, but "spreads" the array into a variadic value handler.
* It is useful with the `vow.all` and the `vow.allResolved` methods.
*
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected
* @param {Object} [ctx] Context of the callbacks execution
* @returns {vow:Promise}
*
* @example
* ```js
* var defer1 = vow.defer(),
* defer2 = vow.defer();
*
* vow.all([defer1.promise(), defer2.promise()]).spread(function(arg1, arg2) {
* // arg1 is "1", arg2 is "'two'" here
* });
*
* defer1.resolve(1);
* defer2.resolve('two');
* ```
*/
spread : function(onFulfilled, onRejected, ctx) {
return this.then(
function(val) {
return onFulfilled.apply(this, val);
},
onRejected,
ctx);
},
/**
* Like `then`, but terminates a chain of promises.
* If the promise has been rejected, this method throws it's "reason" as an exception in a future turn of the event loop.
*
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified
* @param {Object} [ctx] Context of the callbacks execution
*
* @example
* ```js
* var defer = vow.defer();
* defer.reject(Error('Internal error'));
* defer.promise().done(); // exception to be thrown
* ```
*/
done : function(onFulfilled, onRejected, onProgress, ctx) {
this
.then(onFulfilled, onRejected, onProgress, ctx)
.fail(throwException);
},
/**
* Returns a new promise that will be fulfilled in `delay` milliseconds if the promise is fulfilled,
* or immediately rejected if the promise is rejected.
*
* @param {Number} delay
* @returns {vow:Promise}
*/
delay : function(delay) {
var timer,
promise = this.then(function(val) {
var defer = new Deferred();
timer = setTimeout(
function() {
defer.resolve(val);
},
delay);
return defer.promise();
});
promise.always(function() {
clearTimeout(timer);
});
return promise;
},
/**
* Returns a new promise that will be rejected in `timeout` milliseconds
* if the promise is not resolved beforehand.
*
* @param {Number} timeout
* @returns {vow:Promise}
*
* @example
* ```js
* var defer = vow.defer(),
* promiseWithTimeout1 = defer.promise().timeout(50),
* promiseWithTimeout2 = defer.promise().timeout(200);
*
* setTimeout(
* function() {
* defer.resolve('ok');
* },
* 100);
*
* promiseWithTimeout1.fail(function(reason) {
* // promiseWithTimeout to be rejected in 50ms
* });
*
* promiseWithTimeout2.then(function(value) {
* // promiseWithTimeout to be fulfilled with "'ok'" value
* });
* ```
*/
timeout : function(timeout) {
var defer = new Deferred(),
timer = setTimeout(
function() {
defer.reject(new vow.TimedOutError('timed out'));
},
timeout);
this.then(
function(val) {
defer.resolve(val);
},
function(reason) {
defer.reject(reason);
});
defer.promise().always(function() {
clearTimeout(timer);
});
return defer.promise();
},
_vow : true,
_resolve : function(val) {
if(this._status > PROMISE_STATUS.RESOLVED) {
return;
}
if(val === this) {
this._reject(TypeError('Can\'t resolve promise with itself'));
return;
}
this._status = PROMISE_STATUS.RESOLVED;
if(val && !!val._vow) { // shortpath for vow.Promise
val.isFulfilled()?
this._fulfill(val.valueOf()) :
val.isRejected()?
this._reject(val.valueOf()) :
val.then(
this._fulfill,
this._reject,
this._notify,
this);
return;
}
if(isObject(val) || isFunction(val)) {
var then;
try {
then = val.then;
}
catch(e) {
this._reject(e);
return;
}
if(isFunction(then)) {
var _this = this,
isResolved = false;
try {
then.call(
val,
function(val) {
if(isResolved) {
return;
}
isResolved = true;
_this._resolve(val);
},
function(err) {
if(isResolved) {
return;
}
isResolved = true;
_this._reject(err);
},
function(val) {
_this._notify(val);
});
}
catch(e) {
isResolved || this._reject(e);
}
return;
}
}
this._fulfill(val);
},
_fulfill : function(val) {
if(this._status > PROMISE_STATUS.RESOLVED) {
return;
}
this._status = PROMISE_STATUS.FULFILLED;
this._value = val;
this._callCallbacks(this._fulfilledCallbacks, val);
this._fulfilledCallbacks = this._rejectedCallbacks = this._progressCallbacks = undef;
},
_reject : function(reason) {
if(this._status > PROMISE_STATUS.RESOLVED) {
return;
}
this._status = PROMISE_STATUS.REJECTED;
this._value = reason;
this._callCallbacks(this._rejectedCallbacks, reason);
this._fulfilledCallbacks = this._rejectedCallbacks = this._progressCallbacks = undef;
},
_notify : function(val) {
this._callCallbacks(this._progressCallbacks, val);
},
_addCallbacks : function(defer, onFulfilled, onRejected, onProgress, ctx) {
if(onRejected && !isFunction(onRejected)) {
ctx = onRejected;
onRejected = undef;
}
else if(onProgress && !isFunction(onProgress)) {
ctx = onProgress;
onProgress = undef;
}
var cb;
if(!this.isRejected()) {
cb = { defer : defer, fn : isFunction(onFulfilled)? onFulfilled : undef, ctx : ctx };
this.isFulfilled()?
this._callCallbacks([cb], this._value) :
this._fulfilledCallbacks.push(cb);
}
if(!this.isFulfilled()) {
cb = { defer : defer, fn : onRejected, ctx : ctx };
this.isRejected()?
this._callCallbacks([cb], this._value) :
this._rejectedCallbacks.push(cb);
}
if(this._status <= PROMISE_STATUS.RESOLVED) {
this._progressCallbacks.push({ defer : defer, fn : onProgress, ctx : ctx });
}
},
_callCallbacks : function(callbacks, arg) {
var len = callbacks.length;
if(!len) {
return;
}
var isResolved = this.isResolved(),
isFulfilled = this.isFulfilled(),
isRejected = this.isRejected();
nextTick(function() {
var i = 0, cb, defer, fn;
while(i < len) {
cb = callbacks[i++];
defer = cb.defer;
fn = cb.fn;
if(fn) {
var ctx = cb.ctx,
res;
try {
res = ctx? fn.call(ctx, arg) : fn(arg);
}
catch(e) {
defer.reject(e);
continue;
}
isResolved?
defer.resolve(res) :
defer.notify(res);
}
else if(isFulfilled) {
defer.resolve(arg);
}
else if(isRejected) {
defer.reject(arg);
}
else {
defer.notify(arg);
}
}
});
}
};
/** @lends Promise */
var staticMethods = {
/**
* Coerces the given `value` to a promise, or returns the `value` if it's already a promise.
*
* @param {*} value
* @returns {vow:Promise}
*/
cast : function(value) {
return vow.cast(value);
},
/**
* Returns a promise, that will be fulfilled only after all the items in `iterable` are fulfilled.
* If any of the `iterable` items gets rejected, then the returned promise will be rejected.
*
* @param {Array|Object} iterable
* @returns {vow:Promise}
*/
all : function(iterable) {
return vow.all(iterable);
},
/**
* Returns a promise, that will be fulfilled only when any of the items in `iterable` are fulfilled.
* If any of the `iterable` items gets rejected, then the returned promise will be rejected.
*
* @param {Array} iterable
* @returns {vow:Promise}
*/
race : function(iterable) {
return vow.anyResolved(iterable);
},
/**
* Returns a promise that has already been resolved with the given `value`.
* If `value` is a promise, the returned promise will have `value`'s state.
*
* @param {*} value
* @returns {vow:Promise}
*/
resolve : function(value) {
return vow.resolve(value);
},
/**
* Returns a promise that has already been rejected with the given `reason`.
*
* @param {*} reason
* @returns {vow:Promise}
*/
reject : function(reason) {
return vow.reject(reason);
}
};
for(var prop in staticMethods) {
staticMethods.hasOwnProperty(prop) &&
(Promise[prop] = staticMethods[prop]);
}
var vow = /** @exports vow */ {
Deferred : Deferred,
Promise : Promise,
/**
* Creates a new deferred. This method is a factory method for `vow:Deferred` class.
* It's equivalent to `new vow.Deferred()`.
*
* @returns {vow:Deferred}
*/
defer : function() {
return new Deferred();
},
/**
* Static equivalent to `promise.then`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified
* @param {Object} [ctx] Context of the callbacks execution
* @returns {vow:Promise}
*/
when : function(value, onFulfilled, onRejected, onProgress, ctx) {
return vow.cast(value).then(onFulfilled, onRejected, onProgress, ctx);
},
/**
* Static equivalent to `promise.fail`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Function} onRejected Callback that will be invoked with a provided reason after the promise has been rejected
* @param {Object} [ctx] Context of the callback execution
* @returns {vow:Promise}
*/
fail : function(value, onRejected, ctx) {
return vow.when(value, undef, onRejected, ctx);
},
/**
* Static equivalent to `promise.always`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Function} onResolved Callback that will be invoked with the promise as an argument, after the promise has been resolved.
* @param {Object} [ctx] Context of the callback execution
* @returns {vow:Promise}
*/
always : function(value, onResolved, ctx) {
return vow.when(value).always(onResolved, ctx);
},
/**
* Static equivalent to `promise.progress`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Function} onProgress Callback that will be invoked with a provided value after the promise has been notified
* @param {Object} [ctx] Context of the callback execution
* @returns {vow:Promise}
*/
progress : function(value, onProgress, ctx) {
return vow.when(value).progress(onProgress, ctx);
},
/**
* Static equivalent to `promise.spread`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected
* @param {Object} [ctx] Context of the callbacks execution
* @returns {vow:Promise}
*/
spread : function(value, onFulfilled, onRejected, ctx) {
return vow.when(value).spread(onFulfilled, onRejected, ctx);
},
/**
* Static equivalent to `promise.done`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified
* @param {Object} [ctx] Context of the callbacks execution
*/
done : function(value, onFulfilled, onRejected, onProgress, ctx) {
vow.when(value).done(onFulfilled, onRejected, onProgress, ctx);
},
/**
* Checks whether the given `value` is a promise-like object
*
* @param {*} value
* @returns {Boolean}
*
* @example
* ```js
* vow.isPromise('something'); // returns false
* vow.isPromise(vow.defer().promise()); // returns true
* vow.isPromise({ then : function() { }); // returns true
* ```
*/
isPromise : function(value) {
return isObject(value) && isFunction(value.then);
},
/**
* Coerces the given `value` to a promise, or returns the `value` if it's already a promise.
*
* @param {*} value
* @returns {vow:Promise}
*/
cast : function(value) {
return value && !!value._vow?
value :
vow.resolve(value);
},
/**
* Static equivalent to `promise.valueOf`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @returns {*}
*/
valueOf : function(value) {
return value && isFunction(value.valueOf)? value.valueOf() : value;
},
/**
* Static equivalent to `promise.isFulfilled`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @returns {Boolean}
*/
isFulfilled : function(value) {
return value && isFunction(value.isFulfilled)? value.isFulfilled() : true;
},
/**
* Static equivalent to `promise.isRejected`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @returns {Boolean}
*/
isRejected : function(value) {
return value && isFunction(value.isRejected)? value.isRejected() : false;
},
/**
* Static equivalent to `promise.isResolved`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @returns {Boolean}
*/
isResolved : function(value) {
return value && isFunction(value.isResolved)? value.isResolved() : true;
},
/**
* Returns a promise that has already been resolved with the given `value`.
* If `value` is a promise, the returned promise will have `value`'s state.
*
* @param {*} value
* @returns {vow:Promise}
*/
resolve : function(value) {
var res = vow.defer();
res.resolve(value);
return res.promise();
},
/**
* Returns a promise that has already been fulfilled with the given `value`.
* If `value` is a promise, the returned promise will be fulfilled with the fulfill/rejection value of `value`.
*
* @param {*} value
* @returns {vow:Promise}
*/
fulfill : function(value) {
var defer = vow.defer(),
promise = defer.promise();
defer.resolve(value);
return promise.isFulfilled()?
promise :
promise.then(null, function(reason) {
return reason;
});
},
/**
* Returns a promise that has already been rejected with the given `reason`.
* If `reason` is a promise, the returned promise will be rejected with the fulfill/rejection value of `reason`.
*
* @param {*} reason
* @returns {vow:Promise}
*/
reject : function(reason) {
var defer = vow.defer();
defer.reject(reason);
return defer.promise();
},
/**
* Invokes the given function `fn` with arguments `args`
*
* @param {Function} fn
* @param {...*} [args]
* @returns {vow:Promise}
*
* @example
* ```js
* var promise1 = vow.invoke(function(value) {
* return value;
* }, 'ok'),
* promise2 = vow.invoke(function() {
* throw Error();
* });
*
* promise1.isFulfilled(); // true
* promise1.valueOf(); // 'ok'
* promise2.isRejected(); // true
* promise2.valueOf(); // instance of Error
* ```
*/
invoke : function(fn, args) {
var len = Math.max(arguments.length - 1, 0),
callArgs;
if(len) { // optimization for V8
callArgs = Array(len);
var i = 0;
while(i < len) {
callArgs[i++] = arguments[i];
}
}
try {
return vow.resolve(callArgs?
fn.apply(global, callArgs) :
fn.call(global));
}
catch(e) {
return vow.reject(e);
}
},
/**
* Returns a promise, that will be fulfilled only after all the items in `iterable` are fulfilled.
* If any of the `iterable` items gets rejected, the promise will be rejected.
*
* @param {Array|Object} iterable
* @returns {vow:Promise}
*
* @example
* with array:
* ```js
* var defer1 = vow.defer(),
* defer2 = vow.defer();
*
* vow.all([defer1.promise(), defer2.promise(), 3])
* .then(function(value) {
* // value is "[1, 2, 3]" here
* });
*
* defer1.resolve(1);
* defer2.resolve(2);
* ```
*
* @example
* with object:
* ```js
* var defer1 = vow.defer(),
* defer2 = vow.defer();
*
* vow.all({ p1 : defer1.promise(), p2 : defer2.promise(), p3 : 3 })
* .then(function(value) {
* // value is "{ p1 : 1, p2 : 2, p3 : 3 }" here
* });
*
* defer1.resolve(1);
* defer2.resolve(2);
* ```
*/
all : function(iterable) {
var defer = new Deferred(),
isPromisesArray = isArray(iterable),
keys = isPromisesArray?
getArrayKeys(iterable) :
getObjectKeys(iterable),
len = keys.length,
res = isPromisesArray? [] : {};
if(!len) {
defer.resolve(res);
return defer.promise();
}
var i = len;
vow._forEach(
iterable,
function(value, idx) {
res[keys[idx]] = value;
if(!--i) {
defer.resolve(res);
}
},
defer.reject,
defer.notify,
defer,
keys);
return defer.promise();
},
/**
* Returns a promise, that will be fulfilled only after all the items in `iterable` are resolved.
*
* @param {Array|Object} iterable
* @returns {vow:Promise}
*
* @example
* ```js
* var defer1 = vow.defer(),
* defer2 = vow.defer();
*
* vow.allResolved([defer1.promise(), defer2.promise()]).spread(function(promise1, promise2) {
* promise1.isRejected(); // returns true
* promise1.valueOf(); // returns "'error'"
* promise2.isFulfilled(); // returns true
* promise2.valueOf(); // returns "'ok'"
* });
*
* defer1.reject('error');
* defer2.resolve('ok');
* ```
*/
allResolved : function(iterable) {
var defer = new Deferred(),
isPromisesArray = isArray(iterable),
keys = isPromisesArray?
getArrayKeys(iterable) :
getObjectKeys(iterable),
i = keys.length,
res = isPromisesArray? [] : {};
if(!i) {
defer.resolve(res);
return defer.promise();
}
var onResolved = function() {
--i || defer.resolve(iterable);
};
vow._forEach(
iterable,
onResolved,
onResolved,
defer.notify,
defer,
keys);
return defer.promise();
},
allPatiently : function(iterable) {
return vow.allResolved(iterable).then(function() {
var isPromisesArray = isArray(iterable),
keys = isPromisesArray?
getArrayKeys(iterable) :
getObjectKeys(iterable),
rejectedPromises, fulfilledPromises,
len = keys.length, i = 0, key, promise;
if(!len) {
return isPromisesArray? [] : {};
}
while(i < len) {
key = keys[i++];
promise = iterable[key];
if(vow.isRejected(promise)) {
rejectedPromises || (rejectedPromises = isPromisesArray? [] : {});
isPromisesArray?
rejectedPromises.push(promise.valueOf()) :
rejectedPromises[key] = promise.valueOf();
}
else if(!rejectedPromises) {
(fulfilledPromises || (fulfilledPromises = isPromisesArray? [] : {}))[key] = vow.valueOf(promise);
}
}
if(rejectedPromises) {
throw rejectedPromises;
}
return fulfilledPromises;
});
},
/**
* Returns a promise, that will be fulfilled if any of the items in `iterable` is fulfilled.
* If all of the `iterable` items get rejected, the promise will be rejected (with the reason of the first rejected item).
*
* @param {Array} iterable
* @returns {vow:Promise}
*/
any : function(iterable) {
var defer = new Deferred(),
len = iterable.length;
if(!len) {
defer.reject(Error());
return defer.promise();
}
var i = 0, reason;
vow._forEach(
iterable,
defer.resolve,
function(e) {
i || (reason = e);
++i === len && defer.reject(reason);
},
defer.notify,
defer);
return defer.promise();
},
/**
* Returns a promise, that will be fulfilled only when any of the items in `iterable` is fulfilled.
* If any of the `iterable` items gets rejected, the promise will be rejected.
*
* @param {Array} iterable
* @returns {vow:Promise}
*/
anyResolved : function(iterable) {
var defer = new Deferred(),
len = iterable.length;
if(!len) {
defer.reject(Error());
return defer.promise();
}
vow._forEach(
iterable,
defer.resolve,
defer.reject,
defer.notify,
defer);
return defer.promise();
},
/**
* Static equivalent to `promise.delay`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Number} delay
* @returns {vow:Promise}
*/
delay : function(value, delay) {
return vow.resolve(value).delay(delay);
},
/**
* Static equivalent to `promise.timeout`.
* If `value` is not a promise, then `value` is treated as a fulfilled promise.
*
* @param {*} value
* @param {Number} timeout
* @returns {vow:Promise}
*/
timeout : function(value, timeout) {
return vow.resolve(value).timeout(timeout);
},
_forEach : function(promises, onFulfilled, onRejected, onProgress, ctx, keys) {
var len = keys? keys.length : promises.length,
i = 0;
while(i < len) {
vow.when(
promises[keys? keys[i] : i],
wrapOnFulfilled(onFulfilled, i),
onRejected,
onProgress,
ctx);
++i;
}
},
TimedOutError : defineCustomErrorType('TimedOut')
};
vow.__nextTick__ = nextTick;
var defineAsGlobal = true;
if(typeof module === 'object' && typeof module.exports === 'object') {
module.exports = vow;
defineAsGlobal = false;
}
if(typeof modules === 'object' && isFunction(modules.define)) {
modules.define('vow', function(provide) {
provide(vow);
});
defineAsGlobal = false;
}
if(typeof define === 'function') {
define(function(require, exports, module) {
module.exports = vow;
});
defineAsGlobal = false;
}
defineAsGlobal && (global.vow = vow);
})(typeof window !== 'undefined'? window : global);
return module.exports;
})();
ym.utils = (function (deps) {
var module = { exports: {} }, exports = module.exports, define;
function require (name) { return deps[name]; }
var vow = require('vow');
var hop = Object.prototype.hasOwnProperty;
exports.nextTick = vow.__nextTick__;
vow.__nextTick__ = undefined;
exports.isArray = Array.isArray ? Array.isArray : function (obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
};
exports.extend = Object.assign ? Object.assign : function objectAssign (target) {
for (var i = 1, l = arguments.length; i < l; i++) {
var object = arguments[i];
if (object == null) {
continue;
}
for (var key in object) {
if (hop.call(object, key)) {
target[key] = object[key];
}
}
}
return target;
};
exports.accessDeep = function (target, path) {
var parts = path.split('.');
for (var i = 0; i < parts.length - 1; i++) {
var part = parts[i];
target[part] = target[part] || {};
target = target[part];
}
return {parent: target, name: parts[parts.length - 1]};
};
exports.createPackage = function (depends, imports, expandWhenRegistered) {
var result = exports.registerImports({}, depends, imports);
if (expandWhenRegistered) {
result.__expand = { depends: depends, imports: imports };
}
return result;
};
exports.registerImports = function (target, depends, imports) {
for (var i = 0; i < depends.length; i++) {
if (imports[i].__expand) {
exports.registerImports(target, imports[i].__expand.depends, imports[i].__expand.imports);
} else {
var access = exports.accessDeep(target, depends[i]);
access.parent[access.name] = imports[i];
}
}
return target;
};
return module.exports;
})({ vow: ym.vow });
var nsAccess = ym.env.namespace ? ym.utils.accessDeep(global, ym.env.namespace) : null;
if (
nsAccess &&
nsAccess.parent &&
nsAccess.parent[nsAccess.name] &&
nsAccess.parent[nsAccess.name].modules &&
nsAccess.parent[nsAccess.name].ready
) {
console.error('(Yandex Maps JS API): api is already enabled on this page with same namespace.');
}
(function () {
var testDiv;
var transitableProperties = {
transform: 'transform',
opacity: 'opacity',
transitionTimingFunction: 'transition-timing-function',
//TODO - нет никакой реакции на эти значения
userSelect: 'user-select',
height: 'height'
};
var transitionPropertiesCache = {};
var cssPropertiesCache = {};
var browserPrefix = ym.env.browser.cssPrefix.toLowerCase();
function checkCssProperty (name) {
/* eslint-disable no-return-assign */
return typeof cssPropertiesCache[name] == 'undefined' ?
cssPropertiesCache[name] = checkDivStyle(name) :
cssPropertiesCache[name];
}
function checkDivStyle (name) {
return checkTestDiv(name) || //names
checkTestDiv(browserPrefix + upperCaseFirst(name)) || //mozNames
checkTestDiv(ym.env.browser.cssPrefix + upperCaseFirst(name)); //MozNames
}
function checkTestDiv (name) {
return typeof getTestDiv().style[name] != 'undefined' ? name : null;
}
function getTestDiv () {
return testDiv || (testDiv = document.createElement('div'));
}
function upperCaseFirst (str) {
return str ? str.substr(0, 1).toUpperCase() + str.substr(1) : str;
}
function checkCssTransitionProperty (name) {
var cssProperty = checkCssProperty(name);
if (cssProperty && cssProperty != name) {
cssProperty = '-' + browserPrefix + '-' + name;
}
return cssProperty;
}
function checkTransitionAvailability (name) {
if (transitableProperties[name] && checkCssProperty('transitionProperty')) {
return checkCssTransitionProperty(transitableProperties[name]);
}
return null;
}
ym.supports.css = {
checkProperty: checkCssProperty,
checkTransitionProperty: function (name) {
/* eslint-disable no-return-assign */
return typeof transitionPropertiesCache[name] == 'undefined' ?
transitionPropertiesCache[name] = checkTransitionAvailability(name) :
transitionPropertiesCache[name];
},
checkTransitionAvailability: checkTransitionAvailability
};
})();
;
ym.supports.csp = {
isSupported: (typeof Blob != 'undefined') && (typeof URL != 'undefined'),
isNonceSupported: ym.env.browser.name && ym.env.browser.version ?
!(ym.env.browser.name.search('Safari') != -1 && parseInt(ym.env.browser.version) < 10) :
null
};
;
(function () {
var webGlContextSettings = {
failIfMajorPerformanceCaveat: true, // just to be sure
antialias: false // Firefox does not like offscreen canvas with AA
};
var tests = {};
function isWebGlCapable () {
// Test system support
if (window.WebGLRenderingContext) {
// test blacklists
/* eslint-disable quote-props */
var webglBrowserBlacklist = {
'Samsung Internet': true, // unstable
'AndroidBrowser': true // unstable
};
var isOldAndroid = ym.env.browser.engine == 'Webkit' &&
(+ym.env.browser.engineVersion < +537); // unstable
if (isOldAndroid || webglBrowserBlacklist[ym.env.browser.name]) {
return false;
}
} else {
// No system support
return false;
}
return true;
}
function detectWebGl () {
if (!isWebGlCapable()) {
return null;
}
var contextName, context;
try {
var canvas = document.createElement('canvas');
context = canvas.getContext(contextName = 'webgl', webGlContextSettings);
if (!context) {
context = canvas.getContext(contextName = 'experimental-webgl', webGlContextSettings); // IE
if (!context) {
contextName = null;
}
}
} catch (e) {
// suppress warnings at FF
contextName = null;
}
return contextName ? { contextName: contextName, context: context } : null;
}
// Test globalCompositeOperation to work properly
function testCanvas (sandbox, ctx) {
sandbox.width = 226;
sandbox.height = 256;
ctx.fillStyle = '#fff';
ctx.fillRect(0, 0, 150, 150);
ctx.globalCompositeOperation = 'xor';
ctx.fillStyle = '#f00';
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = '#0f0';
ctx.fillRect(50, 50, 100, 100);
var data = ctx.getImageData(49, 49, 2, 2),
test = [];
for (var i = 0; i < 16; i++) {
test.push(data.data[i]);
}
return test.join('x') == '0x0x0x0x0x0x0x0x0x0x0x0x0x255x0x255';
}
ym.supports.graphics = {
hasSvg: function () {
if (!('svg' in tests)) {
tests.svg = document.implementation &&
document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1');
}
return tests.svg;
},
hasCanvas: function () {
if (!('canvas' in tests)) {
var sandbox = document.createElement('canvas'),
canvas = ('getContext' in sandbox) ? sandbox.getContext('2d') : null;
tests.canvas = canvas ? testCanvas(sandbox, canvas) : false;
}
return tests.canvas;
},
hasWebGl: function () {
if (!('webgl' in tests)) {
tests.webgl = detectWebGl();
}
return tests.webgl;
},
redetect: function () {
tests = {};
},
getWebGlContextName: function () {
return tests.webgl && tests.webgl.contextName;
}
};
})();
;
(function () {
var isCompatibleBrowser;
ym.supports.vector = {
isSupported: function isSupported () {
if (isCompatibleBrowser === undefined) {
isCompatibleBrowser = detectFeatures();
}
return isCompatibleBrowser;
}
};
function detectFeatures () {
// We need to do all checks to collect full statistics.
// That's why we don't return 'false' after the first fail.
// MAPSAPI-13769
var result = true;
if (
ym.env.browser.osFamily == 'MacOS' &&
/^10\.[0-8](\.|$)/.test(ym.env.browser.osVersion)
) {
// Disable vector for old MacOSes. See MAPSAPI-14050
result = false;
countReasonsVectorNotSupported('OldMac');
}
var fieldsToCheck = [
'requestAnimationFrame',
'Worker',
'URL',
'Blob',
'XMLHttpRequest',
'Set',
'Map',
'WebAssembly'
];
fieldsToCheck.forEach(function (field) {
if (!window[field]) {
result = false;
countReasonsVectorNotSupported(field);
}
});
if (typeof Math.trunc !== 'function') {
result = false;
countReasonsVectorNotSupported('MathTrunc');
}
var webGlData = ym.supports.graphics.hasWebGl();
if (!webGlData || webGlData.contextName !== 'webgl') {
countReasonsVectorNotSupported('hasWebGl');
// If we can't use webgl context, we can't perform other checks.
return false;
}
var glContext = webGlData.context;
if (glContext.getParameter(glContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS) == 0) {
result = false;
countReasonsVectorNotSupported('MAX_VERTEX_TEXTURE_IMAGE_UNITS');
}
if (!glContext.getExtension('OES_vertex_array_object')) {
result = false;
countReasonsVectorNotSupported('OES_vertex_array_object');
}
if (!glContext.getExtension('OES_standard_derivatives')) {
result = false;
countReasonsVectorNotSupported('OES_standard_derivatives');
}
var fragmentHighPrecision = glContext.getShaderPrecisionFormat(
glContext.FRAGMENT_SHADER,
glContext.HIGH_FLOAT
);
if (
!fragmentHighPrecision ||
fragmentHighPrecision.precision == 0
) {
result = false;
countReasonsVectorNotSupported('highp');
}
if (!testPoints()) {
var debugInfo = getRendererDebugInfo();
result = false;
ym.count('error', {
path: [
'vectorEngine.drawPointsError',
ym.env.browser.platform,
ym.env.browser.name,
debugInfo.vendor,
debugInfo.renderer
].join('.'),
share: 1
});
}
return result;
}
function countReasonsVectorNotSupported (errorType) {
var debugInfo = getRendererDebugInfo();
ym.count('error', {
path: [
'vectorEngine.reasonsVectorNotSupported',
errorType,
ym.env.browser.platform,
ym.env.browser.name,
debugInfo.vendor,
debugInfo.renderer
].join('.'),
share: 0.1
});
}
// MAPSAPI-13729
function testPoints () {
var canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
var gl = canvas.getContext('webgl', { alpha: false, depth: false, antialias: false });
var vShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(
vShader,
'#version 100\n' +
'attribute vec2 p;\n' +
'void main() {\n' +
' gl_Position = vec4(p,0,1);\n' +
' gl_PointSize = 1.0;\n' +
'}'
);
gl.compileShader(vShader);
var fShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(
fShader,
'#version 100\n' +
'void main() {\n' +
' gl_FragColor = vec4(1, 0, 0, 1);\n' +
'}'
);
gl.compileShader(fShader);
var program = gl.createProgram();
gl.attachShader(program, vShader);
gl.attachShader(program, fShader);
gl.bindAttribLocation(program, 0, 'p');
gl.linkProgram(program);
var vb = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vb);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
gl.clearColor(0, 1, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(program);
gl.drawArrays(gl.POINTS, 0, 1);
var data = new Uint8Array(4);
gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, data);
return data[0] === 255;
}
function getRendererDebugInfo () {
var result = {};
var webGlData = ym.supports.graphics.hasWebGl();
if (!webGlData) {
return result;
}
var glContext = webGlData.context;
var debugInfo = glContext.getExtension('WEBGL_debug_renderer_info');
if (debugInfo) {
result.vendor = glContext.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL).replace(/\W/g, '_');
result.renderer = glContext.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL).replace(/\W/g, '_');
}
return result;
}
})();
;
ym.supports.printPatchNeeded = !ym.supports.css.checkProperty('printColorAdjust');
ym.logger = (function (deps) {
var module = { exports: {} }, exports = module.exports, define;
function require (name) { return deps[name]; }
var moduleName = 'Yandex Maps JS API';
function getMessage (moduleName, _arg) {
var str = '';
if (ym.env.debug) {
str += '(' + moduleName + '): ';
}
str += _arg;
return str;
}
module.exports = {
assert: function (condition, _arg) {
if (!condition) {
if (ym.env.debug) {
console.log(getMessage(moduleName, _arg));
}
}
},
log: function (_arg) {
if (ym.env.debug) {
console.log(getMessage(moduleName, _arg));
}
},
notice: function (_arg) {
if (ym.env.debug) {
console.info(getMessage(moduleName, _arg));
}
},
warning: function (_arg) {
if (ym.env.debug) {
console.warn(getMessage(moduleName, _arg));
}
},
error: function (_arg) {
console.error(getMessage(moduleName, _arg));
},
exception: function (moduleName, _arg) {
throw new Error(getMessage(moduleName, _arg));
}
};
return module.exports;
})();
(function () {
var browser = ym.env.browser;
browser.documentMode = document.documentMode;
// Этот флаг, к сожалению, приходится постоянно использовать.
browser.isIE = (browser.name == 'MSIE' || browser.name == 'IEMobile');
browser.isEdge = (browser.engine == 'Edge');
browser.isChromium = browser.base && browser.base.toLocaleLowerCase() == 'chromium';
browser.isSafari = browser.name == 'Safari';
// Настройка маппинга.
var isPointerBrowser = browser.engine == 'Edge' ||
(browser.name == 'MSIE' && browser.osVersion > 6.1) ||
(browser.name == 'IEMobile' && browser.engineVersion >= 6);
if (isPointerBrowser) {
browser.eventMapper = 'pointer';
} else {
browser.eventMapper = 'touchMouse';
}
// В этой сборке Android Browser были был сломал transition - что-то с субпикселями.
browser.androidBrokenBuild = browser.name == 'AndroidBrowser' && browser.engineVersion == '534.30';
var pixelRatio = window.devicePixelRatio || (screen.deviceXDPI && screen.deviceXDPI / 96) || 1;
var isSafariBased = browser.osFamily === 'iOS' ||
browser.name === 'Safari' ||
// Базируется на сафари на айос девайсах
(browser.engine === 'WebKit' && browser.base === 'Safari');
if (
// В IE11 сломалась canvas графика.
browser.name == 'MSIE' ||
browser.name == 'IEMobile' ||
browser.osFamily == 'Android' && browser.engine == 'Gecko' ||
// В мобильном сафари падает графика из за ошибок с памятью
// Посколько определить айпад отдельно нельзя берем все сафари
isSafariBased ||
pixelRatio > 1 && pixelRatio < 2 // scale 125%
) {
browser.graphicsRenderEngine = 'svg';
} else {
browser.graphicsRenderEngine = 'canvas';
}
// Флаг поддержки transition для свойства transform.
browser.transformTransition =
browser.osFamily == 'Android' ||
browser.osFamily == 'iOS' ||
browser.name == 'MSIE' ||
// FF > 41 не синхронизирует транзишены
// (browser.engine && browser.engine.toLocaleLowerCase() == 'gecko') ||
browser.isChromium;
/* Флаг, показывающий наличие в браузере нормально работающей поддержки CSS 3D transforms.
* В данный момент 3d-преобразования поддерживают webkit-ы, кроме андроидного 2.x (Bada поддерживает).
* FF (Gecko) научился 3d с 10-й версии (https://developer.mozilla.org/en/CSS/-moz-transform#Browser_compatibility)
*/
browser.css3DTransform =
(browser.engine == 'WebKit' && !(browser.osFamily == 'Android' && parseFloat(browser.osVersion) < 3)) ||
(browser.engine == 'Gecko' && parseInt(browser.engineVersion.split('.')[0]) >= 10);
browser.unsupported = (browser.name == 'OperaMini');
})();
;
var ModuleSystem = (function (deps) {
var module = { exports: {} }, exports = module.exports, define;
function require (name) { return deps[name]; }
var vow = require('vow');
var utils = require('./ym.utils');
var hop = Object.prototype.hasOwnProperty;
var MISSING_DYNAMIC_VALUE = {};
// Empty array sentinel to reduce the number of empty arrays.
var EMPTY_ARRAY = Object.freeze([]);
var STATE = {
MENTIONED: 1, // Mentioned as missing in a partial bundle.
QUEUED: 2, // DEPRECATED: Queued to load via combine.
FETCHING: 3, // Currently being fetched in full bundle.
DECLARED: 4, // Declared (ym.modules.define was called).
RESOLVING: 5, // Was required explicitly or as dependency and resolving now.
ERROR: 6, // Something went wrong.
DEFINED: 7 // Module is fully defined and already provided its exports.
};
module.exports = ModuleSystem;
function ModuleSystem (config) {
this._config = config;
// Sandbox for modules.
this._sandbox = this._config.createSandbox(this);
// Fast module access. Using ES6 Map doesn't speed up anything.
this._definitionsByName = Object.create(null);
this._definitionsByStorage = Object.create(null); /* storage: { key: definition } */
// Give an ability to define modules before fetching any bundles.
this._remoteLoadingAllowed = vow.defer();
this._initialized = this._remoteLoadingAllowed.promise()
.then(function () { return this._loadBundle(this._config.initialBudleName); }, this)
}
function Definition (state, name, storage, key, depends, declaration, context, dynamicDepends, exports) {
// This is a little ugly to use, but makes it easier to track definitions in DevTools.
// Zero profit from performance point of view.
this.state = state;
this.alias = null;
this.name = name;
this.storage = storage;
this.key = key;
this.depends = depends;
this.dynamicDepends = dynamicDepends;
this.declaration = declaration;
this.context = context;
this.exports = state === STATE.DEFINED ? exports : undefined;
// Created lazily when needed.
this.resolvingPromise = undefined;
this.fetchingDeferred = undefined;
}
ModuleSystem.prototype.allowRemoteLoading = function () {
this._remoteLoadingAllowed.resolve();
};
ModuleSystem.prototype.isDefined = function (name) {
return Boolean(this._findDefinition(name));
};
ModuleSystem.prototype.preload = function (module) {
return module;
};
ModuleSystem.prototype.define = function (name, depends, declaration, context) {
var key, storage, dynamicDepends, exports;
if (typeof name === 'object') {
var def = name;
name = def.name;
storage = def.storage;
key = def.key;
depends = def.depends;
declaration = def.declaration;
context = def.context;
dynamicDepends = def.dynamicDepends;
exports = def.exports;
} else if (arguments.length === 2) {
declaration = depends;
depends = null;
}
var definition = new Definition(STATE.DECLARED, name, storage, key, depends, declaration, context, dynamicDepends, exports);
this._define(definition);
};
// Used by util.AsyncStorage.
ModuleSystem.prototype.defineSync = function (def) {
var definition = new Definition(STATE.DEFINED, def.name, def.storage, def.key, null, null, null, null, def.module);
this._define(definition);
};
ModuleSystem.prototype._define = function (definition) {
var existing = this._definitionsByName[definition.name];
if (existing) {
function throwRedefinitionError() {
var error = new Error('ymaps.modules: redefinition of ' + definition.name);
// eslint-disable-next-line no-console
console.error(error);
throw error;
}
if (existing.state >= STATE.DECLARED) {
// Already declared earlier in previous bundle or by the user. Do nothing.
return;
} else if (existing.state !== STATE.FETCHING) {
throwRedefinitionError();
}
existing.state = STATE.DECLARED;
existing.declaration = definition.declaration;
existing.context = definition.context;
// There is no info about missing module in bundle except name, so we need to copy more values.
existing.storage = definition.storage;
existing.key = definition.key;
if (definition.depends) {
// Dependencies may be declared via a function that resolves based on the current environment.
if (typeof definition.depends == 'function') {
definition.depends = definition.depends.call({ name: definition.name }, this._config.dependenciesContext);
}
existing.depends = definition.depends;
}
existing.dynamicDepends = definition.dynamicDepends;
existing.exports = definition.exports;
return;
}
// Dependencies may be declared via a function that resolves based on the current environment.
if (typeof definition.depends == 'function') {
definition.depends = definition.depends.call({ name: definition.name }, this._config.dependenciesContext);
}
definition.depends = definition.depends || EMPTY_ARRAY;
this._definitionsByName[definition.name] = definition;
this._saveDefinitionToStorage(definition);
};
ModuleSystem.prototype._resolve = function (definition, data) {
// Return immediately if the module is fully defined, to save precious time and memory.
if (!definition.dynamicDepends) {
if (definition.state === STATE.DEFINED) {
return vow.resolve(definition.exports);
} else if (definition.state === STATE.ERROR) {
return vow.reject(definition.exports);
}
}
// Can't go straight to RESOLVING, because we may need to fetch the module.
if (definition.state < STATE.RESOLVING && !definition.resolvingPromise) {
definition.resolvingPromise = this._resolveCore(definition, data)
.always(function (promise) {
definition.resolvingPromise = undefined;
return promise;
});
}
// Even if the module is already defined, we still need to load dynamic dependencies.
var dynamicDepends = getDynamicDepends(definition, [data]);
return vow.all([definition.resolvingPromise, this._require(dynamicDepends, data)])
.then(function () {
return definition.state === STATE.DEFINED ?
vow.resolve(definition.exports) :
vow.reject(definition.exports);
});
};
ModuleSystem.prototype._resolveCore = function (definition, data) {
// Fetch module and its dependencies.
return this._fetchModule(definition, data)
.then(function () {
definition.state = STATE.RESOLVING;
// Require all dependencies.
return this._require(definition.depends, data);
}, this)
.then(function defineModule (depends) {
var explicitAsyncProvisionPromise;
var implicitAsyncProvisionDeferred;
function provide (exports, error) {
if (definition.state === STATE.RESOLVING) {
definition.state = error ? STATE.ERROR : STATE.DEFINED;
definition.exports = error || exports;
}
if (implicitAsyncProvisionDeferred) {
implicitAsyncProvisionDeferred.resolve();
}
if (error) {
// eslint-disable-next-line no-console
console.warn('ymaps.modules: provide(undefined, error) is deprecated and will be removed, throw instead. Module `' + definition.name + '`.');
}
}
// Explicit async provision.
provide.async = function (promise) {
if (definition.state === STATE.RESOLVING) {
explicitAsyncProvisionPromise = promise
.then(
function (exports) { provide(exports); },
function (error) { provide(undefined, error); });
}
};
// Some modules are strange.
provide.provide = provide;
provide.provideAsync = provide.async;
provide.dynamicDepends = !definition.dynamicDepends ? null : {
getValue: function (key, data) {
var module = getDynamicDependency(definition, key, data);
if (module === MISSING_DYNAMIC_VALUE) {
return vow.reject(new Error('ymaps.modules: dynamic dependency `' + key + '` is not declared.'));
}
return isModuleReference(module) ?
this._require([module], data) :
vow.resolve([module]) ;
}.bind(this),
getValueSync: function (key, data) {
var module = getDynamicDependency(definition, key, data);
if (!isModuleReference(module)) {
return module;
}
var dependencyDefinition = this._findDefinition(module);
return dependencyDefinition ? this._requireSingleSync(dependencyDefinition, data) : undefined;
}.bind(this)
};
var context = definition.context || { name: definition.name, depends: definition.depends };
try {
definition.declaration.apply(context, [provide].concat(depends));
} catch (error) {
definition.state = STATE.ERROR;
definition.exports = error;
return;
}
// Wait for explicit asynchronous provision.
if (explicitAsyncProvisionPromise) {
return explicitAsyncProvisionPromise;
}
if (definition.state !== STATE.DEFINED && definition.state !== STATE.ERROR) {
// eslint-disable-next-line no-console
console.warn('ymaps.modules: asynchronous provide is deprecated and will be removed. Module `' + definition.name + '`.');
implicitAsyncProvisionDeferred = vow.defer();
return implicitAsyncProvisionDeferred.promise();
}
}, this);
};
ModuleSystem.prototype.require = function (names, cb, errorCb, thisArg) {
var extendedSyntax = typeof names === 'object' && !utils.isArray(names);
var returnPromise = arguments.length === 1;
if (extendedSyntax) {
cb = names.successCallback;
errorCb = names.errorCallback;
thisArg = names.context;
returnPromise = !cb && !errorCb;
}
names = normalizeRequiredNames(names);
var promise = this._require(names.modules, names.data);
if (returnPromise) {
return promise;
}
promise.spread(cb, errorCb, thisArg);
};
// Used by util.AsyncStorage.
ModuleSystem.prototype.requireSync = function (names) {
names = normalizeRequiredNames(names);
if (names.modules.length !== 1) {
throw new Error('ymaps.modules: only one module can be required synchronously.');
}
var definition = this._findDefinition(names.modules[0]);
return definition && this._requireSingleSync(definition, names.data);
};
ModuleSystem.prototype._requireSingleSync = function (definition, data) {
var depends = getDynamicDepends(definition, [data]);
for (var i = 0, l = depends.length; i < l; i++) {
var dependency = this._findDefinition(depends[i]);
if (!dependency || !this._requireSingleSync(dependency, data)) {
return undefined;
}
}
return definition.state === STATE.DEFINED ? definition.exports : undefined;
};
ModuleSystem.prototype._require = function (modules, data) {
var promises = modules.map(function (x) { return this._requireSingle(x, data); }, this);
return vow.all(promises);
};
ModuleSystem.prototype._requireSingle = function (name, data) {
var definition = this._findDefinition(name);
if (definition) {
return this._resolve(definition, data);
}
// Check if the module can be loaded via combine.
// Require placed above an actual define is fine, too. Promise.then behaves like nextTick.
return this._initialized
.then(function () {
var definition = this._findDefinition(name);
return definition ?
this._resolve(definition, data) :
vow.reject(new Error('ymaps.modules: module `' + getModuleNameForLogging(name) + '` is not defined.'));
}, this);
};
ModuleSystem.prototype._findDefinition = function (name) {
if (typeof name === 'undefined') {
return;
}
return typeof name === 'string' ?
this._definitionsByName[name] :
this._definitionsByStorage[name.storage] && this._definitionsByStorage[name.storage][name.key];
};
ModuleSystem.prototype._saveDefinitionToStorage = function (definition, explicit) {
if (!definition.key || !definition.storage) {
return;
}
explicit = explicit || { key: definition.key, storage: definition.storage };
var keys = utils.isArray(explicit.key) ? explicit.key : [explicit.key];
for (var i = 0, l = keys.length; i < l; i++) {
this._definitionsByStorage[explicit.storage] = this._definitionsByStorage[explicit.storage] || {};
this._definitionsByStorage[explicit.storage][keys[i]] = definition;
}
};
ModuleSystem.prototype._fetchModule = function (definition) {
return definition.state >= STATE.DECLARED ? vow.resolve() : this._loadFullBundle();
};
ModuleSystem.prototype._loadFullBundle = function () {
if (!this._fullBundlePromise) {
for (var moduleName in this._definitionsByName) {
if (this._definitionsByName[moduleName].state === STATE.MENTIONED) {
this._definitionsByName[moduleName].state = STATE.FETCHING;
}
}
this._fullBundlePromise = this._loadBundle('full');
}
return this._fullBundlePromise;
};
ModuleSystem.prototype._loadBundle = function (name) {
return this._config.fetchBundle(name)
.then(function (bundleContent) {
bundleContent.missingModules.forEach(function (name) {
// No need to count module dependencies, in static bundle case. We load all anyway.
var definition = new Definition(STATE.MENTIONED, name, undefined, undefined, [], null, null, undefined);
this._definitionsByName[name] = definition;
}, this);
var sandbox = this._sandbox;
// Split all modules into batches and execute them in separate macrotasks.
var modules = bundleContent.modules;
var batchSize = 400;
function executeNextBatches() {
return vow.delay().then(function () {
var batch = modules.splice(0, batchSize);
batch.forEach(function(f) {f(sandbox);});
if (modules.length > 0) {
return executeNextBatches();
}
});
}
return executeNextBatches();
}, this)
.catch(function (err) {
console.error('ymaps: Failed to bundle "' + name + '".' + (err ? err.stack || err.message || '': ''));
throw err;
});
};
ModuleSystem.prototype._loadModulesMap = function () {
return this._config.fetchMap()
.spread(function (data, onFinished) {
this._processLoadedMap(data);
onFinished();
}, this);
};
function getDynamicDepends (definition, dataList) {
if (!definition.dynamicDepends) {
return EMPTY_ARRAY;
}
var depends = [];
for (var fn in definition.dynamicDepends) {
if (!hop.call(definition.dynamicDepends, fn)) {
continue;
}
for (var i = 0, l = dataList.length; i < l; i++) {
var data = dataList[i];
if (data === undefined) {
continue;
}
var dep = definition.dynamicDepends[fn](data);
if (isModuleReference(dep)) {
depends.push(dep);
}
}
}
return depends;
}
function getDynamicDependency (definition, key, data) {
return hop.call(definition.dynamicDepends, key) ? definition.dynamicDepends[key].call(null, data) : MISSING_DYNAMIC_VALUE;
}
function isModuleReference (module) {
return typeof module === 'string' || isStorageEntry(module);
}
function getModuleNameForLogging (name) {
return name && typeof name === 'object' ? name.key + '@' + name.storage : String(name);
}
function isStorageEntry (module) {
return module != null && typeof module === 'object' && typeof module.key === 'string' && typeof module.storage === 'string';
}
/**
* Converts allowed formats listed below to the first one.
* 1. { modules: ['name', { key: 'x', storage: 'y' }], data: { foo: 'bar' } }
* 2. { modules: 'name', data: { foo: 'bar' } }
* 3. { key: 'x', storage: 'y' }
* 4. 'name'
*/
function normalizeRequiredNames (names) {
var isArray = utils.isArray(names);
if (typeof names === 'object' && !isArray && hop.call(names, 'modules')) {
return {
modules: utils.isArray(names.modules) ? names.modules : [names.modules],
data: names.data
};
}
return isArray ? { modules: names } : { modules: [names] };
}
return module.exports;
})({ vow: ym.vow, './ym.utils': ym.utils });
var IMAGES_URL = ym.env.server.url + '/' + ym.env.server.path.replace(/\/$/, '') + '/images/';
ym.modules = new ModuleSystem({
dependenciesContext: ym,
initialBudleName: ym.env.preload.bundle,
fetchBundle: function (name) {
// Store namespace in window with some unique name as an easy way to support any requested namespace.
var namespace = ('__ymaps_' + ym.env.namespace + '_' + Date.now()).replace(/\W/g, '_');
global[namespace] = ym.ns;
var script = document.createElement('script');
script.src = ym.env.bundles.BASE + ym.env.bundles[name];
script.setAttribute('data-ymaps-api-ns', namespace);
script.setAttribute('data-ymaps-api-version', '2.1.78');
script.async = true;
var deferred = ym.vow.defer();
script.onerror = deferred.reject.bind(deferred);
ym.ns.__provideBundle = deferred.resolve.bind(deferred);
document.head.appendChild(script);
return deferred.promise().always(function (promise) {
delete global[namespace];
return promise;
});
},
createSandbox: function (moduleSystemInstance) {
var modules = Object.create(moduleSystemInstance);
modules.importImages = function (imgParams) {
return { get: function (imageName) { return IMAGES_URL + imgParams[imageName].src; } };
};
return ym.utils.extend({}, ym, { modules: modules });
}
});
/**
* @deprecated To be removed in 2.2.
*/
ym.ns.load = function (moduleList, callback, errorCallback, context) {
if (typeof moduleList == 'function') {
if (callback) {
return ym.ns.ready(['package.full'], /* callback = */moduleList, /* context = */callback);
} else {
return ym.ns.ready(['package.full'], /* callback = */moduleList);
}
}
if (typeof moduleList == 'string') {
moduleList = [moduleList];
}
return ym.ns.ready.apply(this, arguments);
};
;
(function () {
ym.ns.modules = {
// Public API.
require: function () { return ym.modules.require.apply(ym.modules, arguments); },
isDefined: function () { return ym.modules.isDefined.apply(ym.modules, arguments); },
requireSync: function () { return ym.modules.requireSync.apply(ym.modules, arguments); },
define: function (name, depends, resolveCallback, context) {
ym.modules.define.apply(ym.modules, arguments);
return ym.ns.modules;
},
// Private API.
defineSync: deprecated('defineSync'),
getDefinition: deprecated('getDefinition'),
getState: deprecated('getState'),
setOptions: deprecated('setOptions'),
flush: deprecated('flush'),
nextTick: deprecated('nextTick'),
watchResolving: deprecated('watchResolving'),
__modules: ym.modules
};
/**
* Wraps ym.modules.fnName with a deprecation warning.
* @ignore
* @param {String} fnName
*/
function deprecated (fnName) {
return function () {
console.warn('{NS}.modules.{FN} is not a public API and will be removed from {NS}.modules.'
.replace(/\{NS\}/g, ym.env.namespace)
.replace(/\{FN\}/g, fnName));
var result = ym.modules[fnName].apply(ym.modules, arguments);
return result === ym.modules ? ym.ns.modules : result;
};
}
})();
;
(function (global) {
var vow = ym.vow;
var requestedEnvPreload = [].concat(['package.system'], ym.env.preload.load.split(',').filter(Boolean));
var preloadMeasure = ym.performance.startMeasure('ymaps.preload');
var envPreload = ym.modules.require(requestedEnvPreload)
.then(
function (values) {
ym.utils.registerImports(ym.ns, requestedEnvPreload, values);
preloadMeasure.finish();
callUserCallback(ym.env.preload.onLoad, ym.ns);
},
function (error) {
callUserCallback(ym.env.preload.onError, error);
return vow.reject(error);
}
);
var domReady = document.readyState === 'complete' || document.readyState === 'interactive' ? vow.resolve() :
new vow.Promise(function (resolve) {
document.addEventListener('DOMContentLoaded', resolve, false);
document.addEventListener('load', resolve, false);
});
ym.ns.ready = ready;
var isFirstReady = true;
function ready () {
if (isFirstReady) {
ym.performance.saveMeasure('ymaps.readyDelay', ym.performance.now() - ym.performance.initTimings.responseEnd);
isFirstReady = false;
}
var readyMeasure = ym.performance.startMeasure('ymaps.ready');
var params = {};
if (arguments.length) {
if (arguments.length == 1 && typeof arguments[0] == 'object' && !arguments[0].length) {
// Call with hash of params.
params = arguments[0];
} else if (typeof arguments[0] != 'function') {
// Call with modules list as first parameter.
params.require = typeof arguments[0] == 'string' ? [arguments[0]] : arguments[0];
params.successCallback = arguments[1];
params.errorCallback = arguments[2] && typeof arguments[2] == 'function' ? arguments[2] : null;
params.context = arguments[2] && typeof arguments[2] == 'object' ? arguments[2] : arguments[3];
} else {
// Call with regular signature: `successCallback[, errorCallback], context`.
params.successCallback = arguments[0];
params.errorCallback = arguments[1] && typeof arguments[1] == 'function' ? arguments[1] : null;
params.context = arguments[1] && typeof arguments[1] == 'object' ? arguments[1] : arguments[2];
}
}
var explicit = params.require || [];
var promise = vow.all([ym.modules.require(explicit), envPreload, domReady]).spread(function (values) {
ym.utils.registerImports(ym.ns, explicit, values);
readyMeasure.finish();
return ym.ns;
});
// Call user callback in setTimeout to trigger default error handling mechanism (window.onerror).
promise.then(
params.successCallback && function (ym) { setTimeout(params.successCallback.bind(params.context), 0, ym); },
params.errorCallback && function (error) { setTimeout(params.errorCallback.bind(params.context), 0, error); }
);
return promise;
}
function callUserCallback (callbackName, value) {
if (!callbackName) {
return;
}
var callbackData = getMethodByPath(global, callbackName);
if (callbackData) {
// Call user callback in setTimeout to trigger default error handling mechanism (window.onerror).
setTimeout(function () {
callbackData.method.call(callbackData.context, value);
});
}
}
function getMethodByPath (parentNs, path) {
var subObj = parentNs;
path = path.split('.');
var i = 0, l = path.length - 1;
for (; i < l; i++) {
subObj = subObj[path[i]];
if (!subObj) {
return undefined;
}
}
return {
method: subObj[path[l]],
context: subObj
};
}
})(this);
;
if (ym.env.server.params.csp && !ym.supports.csp.isSupported) {
ym.logger.warning('CSP is not suported in this browser');
}
// Preload vector layer.
ym.modules.define('vectorEngine.loadEngine', [
'vow',
// Modules that the engine requires to function.
// Check src/jsapi_2_1_modules/imports.ts for their usage.
'Hotspot',
'Monitor',
'collection.Item',
'event.Manager',
'hotspot.layer.Hint',
'hotspot.layer.optionMapper',
'interactivityModel.EventController',
'interactivityModel.layer',
'option.Manager',
'poi.BalloonManager',
'util.shapeFactory'
], function (provide, vow) {
if (ym.env.namespace !== 'ymaps') {
throw new Error('Vector supports only `ymaps` namespace.');
}
if (ym.env.vectorVersion == null) {
throw new Error('No vector version.');
}
function loadEngine () {
// The vector engine is served as a separate library.
var deferred = vow.defer();
var script = document.createElement('script');
script.onload = deferred.resolve.bind(deferred);
script.onerror = deferred.reject.bind(deferred);
script.src = ym.env.hosts.vectorIndex.replace('{{version}}', ym.env.vectorVersion);
if (ym.env.vectorEngineFileName) {
script.src = script.src.replace('vector.min.js', ym.env.vectorEngineFileName);
}
document.head.insertAdjacentElement('afterbegin', script);
return deferred.promise().catch(function () {
return vow.reject(new Error('Failed to load vector engine'));
});
}
var loadingProcess = null;
provide(function () {
loadingProcess = loadingProcess || loadEngine();
return loadingProcess;
});
});
;
ym.modules.define('vectorEngine.preload', [], function (provide) {
if (ym.supports.vector.isSupported()) {
ym.modules.require(['vectorEngine.loadEngine'])
.spread(function (loadEngine) { loadEngine(); });
}
provide({});
});
;
ym.modules.allowRemoteLoading();
// Register namespace in window.
if (nsAccess) {
nsAccess.parent[nsAccess.name] = ym.ns;
}
ym.performance.init({
url: ym.env.hosts.api.statCounter + '/counter',
data: '/path=' + ym.env.version.replace(/\W/g, '_') + '.' + ym.env.browser.platform,
enable: ym.env.counters == 'all' || Math.random() < PERFORMANCE_SHARE && !ym.env.server.params.debug,
initUrl: document.currentScript && document.currentScript.src,
useSendBeacon: !ym.env.server.params.csp
});
if (!ym.env.hasValidApiKey) {
ym.env.apikey = undefined;
if (typeof ym.env.hasValidApiKey !== 'undefined') {
console.warn('(Yandex Maps JS API): Invalid API key');
}
}
initEvalMeasure.finish();
}
)({"vectorVersion":"5.15.2","vectorVersionTimestamp":1621004842681,"cacheVersion":null,"type":"production","flags":[],"server":{"url":"https://api-maps.yandex.ru/2.1.78","path":"build/debug","params":{"mode":"debug","ns":"ymaps","csp":null}},"preload":{"load":"package.full","bundle":"full"},"mode":"debug","debug":true,"namespace":"ymaps","enterprise":false,"hasApiKeyParam":false,"browser":{"name":"Chrome","version":"90.0.4430.212","base":"Chromium","engine":"WebKit","engineVersion":"537.36","osName":"Windows 10","osFamily":"Windows","osVersion":"10.0","isMobile":false,"isTablet":false,"multiTouch":false,"platform":"Desktop","cssPrefix":"Webkit"},"lang":"ru_RU","languageCode":"ru","countryCode":"RU","hosts":{"api":{"main":"https://api-maps.yandex.ru/","ua":"https://yandex.ru/legal/maps_termsofuse/?lang={{lang}}","maps":"https://yandex.ru/maps/","statCounter":"https://yandex.ru/clck/","services":{"coverage":"https://api-maps.yandex.ru/services/coverage/","geocode":"https://geocode-maps.yandex.ru/","geoxml":"https://api-maps.yandex.ru/services/geoxml/","inception":"https://api-maps.yandex.ru/services/inception/","panoramaLocate":"https://api-maps.yandex.ru/services/panoramas/","search":"https://api-maps.yandex.ru/services/search/","suggest":"https://suggest-maps.yandex.ru/","regions":"https://api-maps.yandex.ru/services/regions/","route":"https://api-maps.yandex.ru/services/route/"}},"layers":{"map":"https://core-renderer-tiles.maps.yandex.net/tiles?l=map&%c&%l","mapj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=mapj&%c&%l&experimental_disable_toponym_hotspots=true","sat":"https://core-sat.maps.yandex.net/tiles?l=sat&%c&%l","skl":"https://core-renderer-tiles.maps.yandex.net/tiles?l=skl&%c&%l","sklj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=sklj&%c&%l","stv":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=stv&%c&v=%v&%l&format=png","sta":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=sta&%c&v=%v&%l&format=png","staHotspot":"https://core-stv-renderer.maps.yandex.net/2.x/tiles?l=stj&%c&v=%v&format=js","staHotspotKey":"%c&l=stj&tm=%v","carparks":"https://core-carparks-renderer-lots.maps.yandex.net/"},"metro_RU":"https://yandex.ru/metro/","metro_UA":"https://yandex.ua/metro/","metro_BY":"https://yandex.by/metro/","metro_US":"https://yandex.com/metro/","traffic":"https://core-jams-rdr-cache.maps.yandex.net/","trafficInfo":"https://core-jams-info.maps.yandex.net/","trafficArchive":"https://core-jams-rdr-hist.maps.yandex.net/","vectorIndex":"https://yastatic.net/s3/mapsapi-v3/vector/{{version}}/out/vector.min.js","vectorTiles":"https://core-renderer-tiles.maps.yandex.net/vmap2/tiles?lang={{lang}}&x={{x}}&y={{y}}&z={{z}}&zmin={{zmin}}&zmax={{zmax}}&v={{version}}","vectorImages":"https://core-renderer-tiles.maps.yandex.net/vmap2/icons?id={{id}}&scale={{scale}}","vectorMeshes":"https://core-renderer-tiles.maps.yandex.net/vmap2/meshes?id={{id}}","vectorGlyphs":"https://core-renderer-tiles.maps.yandex.net/vmap2/glyphs?lang={{lang}}&font_id={{fontId}}&range={{range}}","indoorTiles":"https://core-renderer-tiles.maps.yandex.net/","panoramasTiles":"https://pano.maps.yandex.net/%s/%z.%x.%y","taxiRouteInfo":"https://taxi-routeinfo.taxi.yandex.net/taxi_info?clid=yamaps&apikey=f6d7c076e16e4d53a928961595e76215&rll={rll}"},"layers":{"map":{"version":"21.05.13-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sat":{"version":"3.786.0"},"skl":{"version":"21.05.13-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sta":{"version":"2021.05.14.01.50-1_21.05.13-0-8796"},"trf":{"version":"1621004820","scaled":true},"stv":{"version":"2021.05.14.01.50-1_21.05.13-0-8796"},"carparks":{"version":"","scaled":true,"hotspotZoomRange":[0,23]}},"geolocation":{"longitude":31.482771,"latitude":49.02753,"isHighAccuracy":false,"span":{"longitude":18.090408,"latitude":7.214737}},"token":"4d453ef5a509a2d87d61fc77a835b802","distribution":{},"version":"2.1.78","majorVersion":"2.1","cssPrefix":"ymaps-2-1-78-","tag":"2.1.78-11","coordinatesOrder":"latlong","bundles":{"panoramas":"/debug/panoramas-1bf39db9ea83933137400ffc972fd647947d02eb.js","full":"/debug/full-ade8138f057c00514f7420271eb4d1a232f0e995.js","BASE":"https://yastatic.net/s3/front-maps-static/maps-front-jsapi-v2-1/2.1.78-11/build"}}, null)
(function ymapsInit(e){var n=this,t={ns:{},supports:{},env:e},r=.01;t.performance=function(e){function n(){E=E||setTimeout(t,_)}function t(){clearTimeout(E),E=null;var e=r();if(e){var t=s+"/vars="+e+"/*";if(!a||!navigator.sendBeacon(o,t)){var i=new Image,u=(new Date).getTime()+Math.round(100*Math.random());i.src=o+"/rnd="+u+t}n()}}function r(){var e=[];return i(e,v),i(e,p),e.join(",")}function i(e,n){for(var t in n)if(n.hasOwnProperty(t)&&n[t].length&&(e.push(t+"="+n[t].shift()),e.length>=g))return}var o,s,a,u,c={exports:{}},l=(c.exports,window.performance||Object.create(null)),d=l.now?l.now.bind(l):function(){return Date.now()},f=l.getEntriesByType?function(e){return l.getEntriesByType("resource").filter(function(n){return n.name===e})[0]}:function(){},p={},v={},h={initjs:"i",mapjs:"m",combine_s:"cs",combine_m:"cm",combine_l:"cl"},m={eval:"e",duration:"d",cached:"c",encodedSize:"esz",decodedSize:"dsz",responseDuration:"res",requestDuration:"req"},y={statistics:{combine:{total:0,size:0,modules:0}},initTimings:{},now:d,getResourceTimings:function(e){return f(e)||{}},init:function(e){o=e.url,s="/pid=443/cid=73188/dtype=stred"+e.data,a=Boolean(e.useSendBeacon&&navigator.sendBeacon),u=e.enable,y.initTimings=y.getResourceTimings(e.initUrl),y.saveResourceTimings("initjs",y.initTimings,{size:!1,cached:!1})},saveMeasure:function(e,t){if(u){var r=/^@/.test(e);if(r){var i=e.replace(/^@/,"").split(".");e=(h[i[0]]||i[0])+"."+(m[i[1]]||i[1])}if(t=Math.round(t),!isNaN(t)){var o=r?p:v;o[e]=o[e]||[],o[e].push(t),n()}}},startMeasure:function(e,n){n="undefined"==typeof n?d():n;var t=!1;return{finish:function(r){t||(r="undefined"==typeof r?d():r,y.saveMeasure(e,r-n),t=!0)}}},saveResourceTimings:function(e,n,t){var r="object"==typeof n?n:f(n);if(r&&(t=t||{},e=e.replace(/^@?/,"@"),this.saveMeasure(e+".duration",r.duration),r.responseStart)){var i=0===r.transferSize?1:0;this.saveMeasure(e+".responseDuration",r.responseEnd-r.responseStart),this.saveMeasure(e+".requestDuration",r.responseStart-r.requestStart),t.cached!==!1&&this.saveMeasure(e+".cached",i),t.size===!1||i||(this.saveMeasure(e+".encodedSize",r.encodedBodySize/1024),this.saveMeasure(e+".decodedSize",r.decodedBodySize/1024))}}},g=40,_=5e3,E=null;return window.addEventListener("beforeunload",function(){y.saveMeasure("combine.total",y.statistics.combine.total),y.saveMeasure("combine.modules",y.statistics.combine.modules),y.saveMeasure("combine.size",y.statistics.combine.size/1024),t()}),c.exports=y,c.exports}();var i=t.performance.startMeasure("@initjs.eval");t.count=function(e){function n(){r.push(arguments)}var t={exports:{}},r=(t.exports,[]),i=null,o=function(){(i||n).apply(null,arguments)};return o.provideImplementation=function(e){if(i)throw new Error("ym.count: implementation was already provided.");i=e(r)},t.exports=o,t.exports}(),t.vow=t.ns.vow=function(e){var t,r={exports:{}};r.exports;return function(e){var n,i=function(){var n=[],t=function(e){return n.push(e),1===n.length},r=function(){var e=n,t=0,r=n.length;for(n=[];t<r;)e[t++]()};if("function"==typeof setImmediate)return function(e){t(e)&&setImmediate(r)};if("object"==typeof process&&process.nextTick)return function(e){t(e)&&process.nextTick(r)};var i=e.MutationObserver||e.WebKitMutationObserver;if(i){var o=1,s=document.createTextNode("");return new i(r).observe(s,{characterData:!0}),function(e){t(e)&&(s.data=o*=-1)}}if(e.postMessage){var a=!0;if(e.attachEvent){var u=function(){a=!1};e.attachEvent("onmessage",u),e.postMessage("__checkAsync","*"),e.detachEvent("onmessage",u)}if(a){var c="__promise"+Math.random()+"_"+new Date,l=function(e){e.data===c&&(e.stopPropagation&&e.stopPropagation(),r())};return e.addEventListener?e.addEventListener("message",l,!0):e.attachEvent("onmessage",l),function(n){t(n)&&e.postMessage(c,"*")}}}var d=e.document;if("onreadystatechange"in d.createElement("script")){var f=function(){var e=d.createElement("script");e.onreadystatechange=function(){e.parentNode.removeChild(e),e=e.onreadystatechange=null,r()},(d.documentElement||d.body).appendChild(e)};return function(e){t(e)&&f()}}return function(e){t(e)&&setTimeout(r,0)}}(),o=function(e){i(function(){throw e})},s=function(e){return"function"==typeof e},a=function(e){return null!==e&&"object"==typeof e},u=Object.prototype.toString,c=Array.isArray||function(e){return"[object Array]"===u.call(e)},l=function(e){for(var n=[],t=0,r=e.length;t<r;)n.push(t++);return n},d=Object.keys||function(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(t);return n},f=function(e){var n=function(n){this.name=e,this.message=n};return n.prototype=new Error,n},p=function(e,n){return function(t){e.call(this,t,n)}},v=function(){this._promise=new m};v.prototype={promise:function(){return this._promise},resolve:function(e){this._promise.isResolved()||this._promise._resolve(e)},reject:function(e){this._promise.isResolved()||(_.isPromise(e)?(e=e.then(function(e){var n=_.defer();return n.reject(e),n.promise()}),this._promise._resolve(e)):this._promise._reject(e))},notify:function(e){this._promise.isResolved()||this._promise._notify(e)}};var h={PENDING:0,RESOLVED:1,FULFILLED:2,REJECTED:3},m=function(e){if(this._value=n,this._status=h.PENDING,this._fulfilledCallbacks=[],this._rejectedCallbacks=[],this._progressCallbacks=[],e){var t=this,r=e.length;e(function(e){t.isResolved()||t._resolve(e)},r>1?function(e){t.isResolved()||t._reject(e)}:n,r>2?function(e){t.isResolved()||t._notify(e)}:n)}};m.prototype={valueOf:function(){return this._value},isResolved:function(){return this._status!==h.PENDING},isFulfilled:function(){return this._status===h.FULFILLED},isRejected:function(){return this._status===h.REJECTED},then:function(e,n,t,r){var i=new v;return this._addCallbacks(i,e,n,t,r),i.promise()},"catch":function(e,t){return this.then(n,e,t)},fail:function(e,t){return this.then(n,e,t)},always:function(e,n){var t=this,r=function(){return e.call(this,t)};return this.then(r,r,n)},progress:function(e,t){return this.then(n,n,e,t)},spread:function(e,n,t){return this.then(function(n){return e.apply(this,n)},n,t)},done:function(e,n,t,r){this.then(e,n,t,r).fail(o)},delay:function(e){var n,t=this.then(function(t){var r=new v;return n=setTimeout(function(){r.resolve(t)},e),r.promise()});return t.always(function(){clearTimeout(n)}),t},timeout:function(e){var n=new v,t=setTimeout(function(){n.reject(new _.TimedOutError("timed out"))},e);return this.then(function(e){n.resolve(e)},function(e){n.reject(e)}),n.promise().always(function(){clearTimeout(t)}),n.promise()},_vow:!0,_resolve:function(e){if(!(this._status>h.RESOLVED)){if(e===this)return void this._reject(TypeError("Can't resolve promise with itself"));if(this._status=h.RESOLVED,e&&e._vow)return void(e.isFulfilled()?this._fulfill(e.valueOf()):e.isRejected()?this._reject(e.valueOf()):e.then(this._fulfill,this._reject,this._notify,this));if(a(e)||s(e)){var n;try{n=e.then}catch(t){return void this._reject(t)}if(s(n)){var r=this,i=!1;try{n.call(e,function(e){i||(i=!0,r._resolve(e))},function(e){i||(i=!0,r._reject(e))},function(e){r._notify(e)})}catch(t){i||this._reject(t)}return}}this._fulfill(e)}},_fulfill:function(e){this._status>h.RESOLVED||(this._status=h.FULFILLED,this._value=e,this._callCallbacks(this._fulfilledCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_reject:function(e){this._status>h.RESOLVED||(this._status=h.REJECTED,this._value=e,this._callCallbacks(this._rejectedCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_notify:function(e){this._callCallbacks(this._progressCallbacks,e)},_addCallbacks:function(e,t,r,i,o){r&&!s(r)?(o=r,r=n):i&&!s(i)&&(o=i,i=n);var a;this.isRejected()||(a={defer:e,fn:s(t)?t:n,ctx:o},this.isFulfilled()?this._callCallbacks([a],this._value):this._fulfilledCallbacks.push(a)),this.isFulfilled()||(a={defer:e,fn:r,ctx:o},this.isRejected()?this._callCallbacks([a],this._value):this._rejectedCallbacks.push(a)),this._status<=h.RESOLVED&&this._progressCallbacks.push({defer:e,fn:i,ctx:o})},_callCallbacks:function(e,n){var t=e.length;if(t){var r=this.isResolved(),o=this.isFulfilled(),s=this.isRejected();i(function(){for(var i,a,u,c=0;c<t;)if(i=e[c++],a=i.defer,u=i.fn){var l,d=i.ctx;try{l=d?u.call(d,n):u(n)}catch(f){a.reject(f);continue}r?a.resolve(l):a.notify(l)}else o?a.resolve(n):s?a.reject(n):a.notify(n)})}}};var y={cast:function(e){return _.cast(e)},all:function(e){return _.all(e)},race:function(e){return _.anyResolved(e)},resolve:function(e){return _.resolve(e)},reject:function(e){return _.reject(e)}};for(var g in y)y.hasOwnProperty(g)&&(m[g]=y[g]);var _={Deferred:v,Promise:m,defer:function(){return new v},when:function(e,n,t,r,i){return _.cast(e).then(n,t,r,i)},fail:function(e,t,r){return _.when(e,n,t,r)},always:function(e,n,t){return _.when(e).always(n,t)},progress:function(e,n,t){return _.when(e).progress(n,t)},spread:function(e,n,t,r){return _.when(e).spread(n,t,r)},done:function(e,n,t,r,i){_.when(e).done(n,t,r,i)},isPromise:function(e){return a(e)&&s(e.then)},cast:function(e){return e&&e._vow?e:_.resolve(e)},valueOf:function(e){return e&&s(e.valueOf)?e.valueOf():e},isFulfilled:function(e){return!e||!s(e.isFulfilled)||e.isFulfilled()},isRejected:function(e){return!(!e||!s(e.isRejected))&&e.isRejected()},isResolved:function(e){return!e||!s(e.isResolved)||e.isResolved()},resolve:function(e){var n=_.defer();return n.resolve(e),n.promise()},fulfill:function(e){var n=_.defer(),t=n.promise();return n.resolve(e),t.isFulfilled()?t:t.then(null,function(e){return e})},reject:function(e){var n=_.defer();return n.reject(e),n.promise()},invoke:function(n,t){var r,i=Math.max(arguments.length-1,0);if(i){r=Array(i);for(var o=0;o<i;)r[o++]=arguments[o]}try{return _.resolve(r?n.apply(e,r):n.call(e))}catch(s){return _.reject(s)}},all:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=i;return _._forEach(e,function(e,t){o[r[t]]=e,--s||n.resolve(o)},n.reject,n.notify,n,r),n.promise()},allResolved:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=function(){--i||n.resolve(e)};return _._forEach(e,s,s,n.notify,n,r),n.promise()},allPatiently:function(e){return _.allResolved(e).then(function(){var n,t,r,i,o=c(e),s=o?l(e):d(e),a=s.length,u=0;if(!a)return o?[]:{};for(;u<a;)r=s[u++],i=e[r],_.isRejected(i)?(n||(n=o?[]:{}),o?n.push(i.valueOf()):n[r]=i.valueOf()):n||((t||(t=o?[]:{}))[r]=_.valueOf(i));if(n)throw n;return t})},any:function(e){var n=new v,t=e.length;if(!t)return n.reject(Error()),n.promise();var r,i=0;return _._forEach(e,n.resolve,function(e){i||(r=e),++i===t&&n.reject(r)},n.notify,n),n.promise()},anyResolved:function(e){var n=new v,t=e.length;return t?(_._forEach(e,n.resolve,n.reject,n.notify,n),n.promise()):(n.reject(Error()),n.promise())},delay:function(e,n){return _.resolve(e).delay(n)},timeout:function(e,n){return _.resolve(e).timeout(n)},_forEach:function(e,n,t,r,i,o){for(var s=o?o.length:e.length,a=0;a<s;)_.when(e[o?o[a]:a],p(n,a),t,r,i),++a},TimedOutError:f("TimedOut")};_.__nextTick__=i;var E=!0;"object"==typeof r&&"object"==typeof r.exports&&(r.exports=_,E=!1),"object"==typeof modules&&s(modules.define)&&(modules.define("vow",function(e){e(_)}),E=!1),"function"==typeof t&&(t(function(e,n,t){t.exports=_}),E=!1),E&&(e.vow=_)}("undefined"!=typeof window?window:n),r.exports}(),t.utils=function(e){function n(n){return e[n]}var t={exports:{}},r=t.exports,i=n("vow"),o=Object.prototype.hasOwnProperty;return r.nextTick=i.__nextTick__,i.__nextTick__=void 0,r.isArray=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},r.extend=Object.assign?Object.assign:function(e){for(var n=1,t=arguments.length;n<t;n++){var r=arguments[n];if(null!=r)for(var i in r)o.call(r,i)&&(e[i]=r[i])}return e},r.accessDeep=function(e,n){for(var t=n.split("."),r=0;r<t.length-1;r++){var i=t[r];e[i]=e[i]||{},e=e[i]}return{parent:e,name:t[t.length-1]}},r.createPackage=function(e,n,t){var i=r.registerImports({},e,n);return t&&(i.__expand={depends:e,imports:n}),i},r.registerImports=function(e,n,t){for(var i=0;i<n.length;i++)if(t[i].__expand)r.registerImports(e,t[i].__expand.depends,t[i].__expand.imports);else{var o=r.accessDeep(e,n[i]);o.parent[o.name]=t[i]}return e},t.exports}({vow:t.vow});var o=t.env.namespace?t.utils.accessDeep(n,t.env.namespace):null;o&&o.parent&&o.parent[o.name]&&o.parent[o.name].modules&&o.parent[o.name].ready&&console.error("(Yandex Maps JS API): api is already enabled on this page with same namespace."),function(){function e(e){return"undefined"==typeof d[e]?d[e]=n(e):d[e]}function n(e){return r(e)||r(f+o(e))||r(t.env.browser.cssPrefix+o(e))}function r(e){return"undefined"!=typeof i().style[e]?e:null}function i(){return u||(u=document.createElement("div"))}function o(e){return e?e.substr(0,1).toUpperCase()+e.substr(1):e}function s(n){var t=e(n);return t&&t!=n&&(t="-"+f+"-"+n),t}function a(n){return c[n]&&e("transitionProperty")?s(c[n]):null}var u,c={transform:"transform",opacity:"opacity",transitionTimingFunction:"transition-timing-function",userSelect:"user-select",height:"height"},l={},d={},f=t.env.browser.cssPrefix.toLowerCase();t.supports.css={checkProperty:e,checkTransitionProperty:function(e){return"undefined"==typeof l[e]?l[e]=a(e):l[e]},checkTransitionAvailability:a}}(),t.supports.csp={isSupported:"undefined"!=typeof Blob&&"undefined"!=typeof URL,isNonceSupported:t.env.browser.name&&t.env.browser.version?!(t.env.browser.name.search("Safari")!=-1&&parseInt(t.env.browser.version)<10):null},function(){function e(){if(!window.WebGLRenderingContext)return!1;var e={"Samsung Internet":!0,AndroidBrowser:!0},n="Webkit"==t.env.browser.engine&&+t.env.browser.engineVersion<537;return!n&&!e[t.env.browser.name]}function n(){if(!e())return null;var n,t;try{var r=document.createElement("canvas");t=r.getContext(n="webgl",i),t||(t=r.getContext(n="experimental-webgl",i),t||(n=null))}catch(o){n=null}return n?{contextName:n,context:t}:null}function r(e,n){e.width=226,e.height=256,n.fillStyle="#fff",n.fillRect(0,0,150,150),n.globalCompositeOperation="xor",n.fillStyle="#f00",n.fillRect(10,10,100,100),n.fillStyle="#0f0",n.fillRect(50,50,100,100);for(var t=n.getImageData(49,49,2,2),r=[],i=0;i<16;i++)r.push(t.data[i]);return"0x0x0x0x0x0x0x0x0x0x0x0x0x255x0x255"==r.join("x")}var i={failIfMajorPerformanceCaveat:!0,antialias:!1},o={};t.supports.graphics={hasSvg:function(){return"svg"in o||(o.svg=document.implementation&&document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")),o.svg},hasCanvas:function(){if(!("canvas"in o)){var e=document.createElement("canvas"),n="getContext"in e?e.getContext("2d"):null;o.canvas=!!n&&r(e,n)}return o.canvas},hasWebGl:function(){return"webgl"in o||(o.webgl=n()),o.webgl},redetect:function(){o={}},getWebGlContextName:function(){return o.webgl&&o.webgl.contextName}}}(),function(){function e(){var e=!0;"MacOS"==t.env.browser.osFamily&&/^10\.[0-8](\.|$)/.test(t.env.browser.osVersion)&&(e=!1,n("OldMac"));var o=["requestAnimationFrame","Worker","URL","Blob","XMLHttpRequest","Set","Map","WebAssembly"];o.forEach(function(t){window[t]||(e=!1,n(t))}),"function"!=typeof Math.trunc&&(e=!1,n("MathTrunc"));var s=t.supports.graphics.hasWebGl();if(!s||"webgl"!==s.contextName)return n("hasWebGl"),!1;var a=s.context;0==a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS)&&(e=!1,n("MAX_VERTEX_TEXTURE_IMAGE_UNITS")),a.getExtension("OES_vertex_array_object")||(e=!1,n("OES_vertex_array_object")),a.getExtension("OES_standard_derivatives")||(e=!1,n("OES_standard_derivatives"));var u=a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT);if(u&&0!=u.precision||(e=!1,n("highp")),!r()){var c=i();e=!1,t.count("error",{path:["vectorEngine.drawPointsError",t.env.browser.platform,t.env.browser.name,c.vendor,c.renderer].join("."),share:1})}return e}function n(e){var n=i();t.count("error",{path:["vectorEngine.reasonsVectorNotSupported",e,t.env.browser.platform,t.env.browser.name,n.vendor,n.renderer].join("."),share:.1})}function r(){var e=document.createElement("canvas");e.width=1,e.height=1;var n=e.getContext("webgl",{alpha:!1,depth:!1,antialias:!1}),t=n.createShader(n.VERTEX_SHADER);n.shaderSource(t,"#version 100\nattribute vec2 p;\nvoid main() {\n gl_Position = vec4(p,0,1);\n gl_PointSize = 1.0;\n}"),n.compileShader(t);var r=n.createShader(n.FRAGMENT_SHADER);n.shaderSource(r,"#version 100\nvoid main() {\n gl_FragColor = vec4(1, 0, 0, 1);\n}"),n.compileShader(r);var i=n.createProgram();n.attachShader(i,t),n.attachShader(i,r),n.bindAttribLocation(i,0,"p"),n.linkProgram(i);var o=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,o),n.bufferData(n.ARRAY_BUFFER,new Float32Array([0,0]),n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.clearColor(0,1,0,1),n.clear(n.COLOR_BUFFER_BIT),n.useProgram(i),n.drawArrays(n.POINTS,0,1);var s=new Uint8Array(4);return n.readPixels(0,0,1,1,n.RGBA,n.UNSIGNED_BYTE,s),255===s[0]}function i(){var e={},n=t.supports.graphics.hasWebGl();if(!n)return e;var r=n.context,i=r.getExtension("WEBGL_debug_renderer_info");return i&&(e.vendor=r.getParameter(i.UNMASKED_VENDOR_WEBGL).replace(/\W/g,"_"),e.renderer=r.getParameter(i.UNMASKED_RENDERER_WEBGL).replace(/\W/g,"_")),e}var o;t.supports.vector={isSupported:function(){return void 0===o&&(o=e()),o}}}(),t.supports.printPatchNeeded=!t.supports.css.checkProperty("printColorAdjust"),t.logger=function(e){function n(e,n){var r="";return t.env.debug&&(r+="("+e+"): "),r+=n}var r={exports:{}},i=(r.exports,"Yandex Maps JS API");return r.exports={assert:function(e,r){e||t.env.debug&&console.log(n(i,r))},log:function(e){t.env.debug&&console.log(n(i,e))},notice:function(e){t.env.debug&&console.info(n(i,e))},warning:function(e){t.env.debug&&console.warn(n(i,e))},error:function(e){console.error(n(i,e))},exception:function(e,t){throw new Error(n(e,t))}},r.exports}(),function(){var e=t.env.browser;e.documentMode=document.documentMode,e.isIE="MSIE"==e.name||"IEMobile"==e.name,e.isEdge="Edge"==e.engine,e.isChromium=e.base&&"chromium"==e.base.toLocaleLowerCase(),e.isSafari="Safari"==e.name;var n="Edge"==e.engine||"MSIE"==e.name&&e.osVersion>6.1||"IEMobile"==e.name&&e.engineVersion>=6;n?e.eventMapper="pointer":e.eventMapper="touchMouse",e.androidBrokenBuild="AndroidBrowser"==e.name&&"534.30"==e.engineVersion;var r=window.devicePixelRatio||screen.deviceXDPI&&screen.deviceXDPI/96||1,i="iOS"===e.osFamily||"Safari"===e.name||"WebKit"===e.engine&&"Safari"===e.base;"MSIE"==e.name||"IEMobile"==e.name||"Android"==e.osFamily&&"Gecko"==e.engine||i||r>1&&r<2?e.graphicsRenderEngine="svg":e.graphicsRenderEngine="canvas",e.transformTransition="Android"==e.osFamily||"iOS"==e.osFamily||"MSIE"==e.name||e.isChromium,e.css3DTransform="WebKit"==e.engine&&!("Android"==e.osFamily&&parseFloat(e.osVersion)<3)||"Gecko"==e.engine&&parseInt(e.engineVersion.split(".")[0])>=10,e.unsupported="OperaMini"==e.name}();var s=function(e){function n(n){return e[n]}function t(e){this._config=e,this._sandbox=this._config.createSandbox(this),this._definitionsByName=Object.create(null),this._definitionsByStorage=Object.create(null),this._remoteLoadingAllowed=d.defer(),this._initialized=this._remoteLoadingAllowed.promise().then(function(){return this._loadBundle(this._config.initialBudleName)},this)}function r(e,n,t,r,i,o,s,a,u){this.state=e,this.alias=null,this.name=n,this.storage=t,this.key=r,this.depends=i,this.dynamicDepends=a,this.declaration=o,this.context=s,this.exports=e===m.DEFINED?u:void 0,this.resolvingPromise=void 0,this.fetchingDeferred=void 0}function i(e,n){if(!e.dynamicDepends)return h;var t=[];for(var r in e.dynamicDepends)if(p.call(e.dynamicDepends,r))for(var i=0,o=n.length;i<o;i++){var a=n[i];if(void 0!==a){var u=e.dynamicDepends[r](a);s(u)&&t.push(u)}}return t}function o(e,n,t){return p.call(e.dynamicDepends,n)?e.dynamicDepends[n].call(null,t):v}function s(e){return"string"==typeof e||u(e)}function a(e){return e&&"object"==typeof e?e.key+"@"+e.storage:String(e)}function u(e){return null!=e&&"object"==typeof e&&"string"==typeof e.key&&"string"==typeof e.storage}function c(e){var n=f.isArray(e);return"object"==typeof e&&!n&&p.call(e,"modules")?{modules:f.isArray(e.modules)?e.modules:[e.modules],data:e.data}:n?{modules:e}:{modules:[e]}}var l={exports:{}},d=(l.exports,n("vow")),f=n("./ym.utils"),p=Object.prototype.hasOwnProperty,v={},h=Object.freeze([]),m={MENTIONED:1,QUEUED:2,FETCHING:3,DECLARED:4,RESOLVING:5,ERROR:6,DEFINED:7};return l.exports=t,t.prototype.allowRemoteLoading=function(){this._remoteLoadingAllowed.resolve()},t.prototype.isDefined=function(e){return Boolean(this._findDefinition(e))},t.prototype.preload=function(e){return e},t.prototype.define=function(e,n,t,i){var o,s,a,u;if("object"==typeof e){var c=e;e=c.name,s=c.storage,o=c.key,n=c.depends,t=c.declaration,i=c.context,a=c.dynamicDepends,u=c.exports}else 2===arguments.length&&(t=n,n=null);var l=new r(m.DECLARED,e,s,o,n,t,i,a,u);this._define(l)},t.prototype.defineSync=function(e){var n=new r(m.DEFINED,e.name,e.storage,e.key,null,null,null,null,e.module);this._define(n)},t.prototype._define=function(e){function n(){var n=new Error("ymaps.modules: redefinition of "+e.name);throw console.error(n),n}var t=this._definitionsByName[e.name];if(t){if(t.state>=m.DECLARED)return;return t.state!==m.FETCHING&&n(),t.state=m.DECLARED,t.declaration=e.declaration,t.context=e.context,t.storage=e.storage,t.key=e.key,e.depends&&("function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),t.depends=e.depends),t.dynamicDepends=e.dynamicDepends,void(t.exports=e.exports)}"function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),e.depends=e.depends||h,this._definitionsByName[e.name]=e,this._saveDefinitionToStorage(e)},t.prototype._resolve=function(e,n){if(!e.dynamicDepends){if(e.state===m.DEFINED)return d.resolve(e.exports);if(e.state===m.ERROR)return d.reject(e.exports)}e.state<m.RESOLVING&&!e.resolvingPromise&&(e.resolvingPromise=this._resolveCore(e,n).always(function(n){return e.resolvingPromise=void 0,n}));var t=i(e,[n]);return d.all([e.resolvingPromise,this._require(t,n)]).then(function(){return e.state===m.DEFINED?d.resolve(e.exports):d.reject(e.exports)})},t.prototype._resolveCore=function(e,n){return this._fetchModule(e,n).then(function(){return e.state=m.RESOLVING,this._require(e.depends,n)},this).then(function(n){function t(n,t){e.state===m.RESOLVING&&(e.state=t?m.ERROR:m.DEFINED,e.exports=t||n),i&&i.resolve(),t&&console.warn("ymaps.modules: provide(undefined, error) is deprecated and will be removed, throw instead. Module `"+e.name+"`.")}var r,i;t.async=function(n){e.state===m.RESOLVING&&(r=n.then(function(e){t(e)},function(e){t(void 0,e)}))},t.provide=t,t.provideAsync=t.async,t.dynamicDepends=e.dynamicDepends?{getValue:function(n,t){var r=o(e,n,t);return r===v?d.reject(new Error("ymaps.modules: dynamic dependency `"+n+"` is not declared.")):s(r)?this._require([r],t):d.resolve([r])}.bind(this),getValueSync:function(n,t){var r=o(e,n,t);if(!s(r))return r;var i=this._findDefinition(r);return i?this._requireSingleSync(i,t):void 0}.bind(this)}:null;var a=e.context||{name:e.name,depends:e.depends};try{e.declaration.apply(a,[t].concat(n))}catch(u){return e.state=m.ERROR,void(e.exports=u)}return r?r:e.state!==m.DEFINED&&e.state!==m.ERROR?(console.warn("ymaps.modules: asynchronous provide is deprecated and will be removed. Module `"+e.name+"`."),i=d.defer(),i.promise()):void 0},this)},t.prototype.require=function(e,n,t,r){var i="object"==typeof e&&!f.isArray(e),o=1===arguments.length;i&&(n=e.successCallback,t=e.errorCallback,r=e.context,o=!n&&!t),e=c(e);var s=this._require(e.modules,e.data);return o?s:void s.spread(n,t,r)},t.prototype.requireSync=function(e){if(e=c(e),1!==e.modules.length)throw new Error("ymaps.modules: only one module can be required synchronously.");var n=this._findDefinition(e.modules[0]);return n&&this._requireSingleSync(n,e.data)},t.prototype._requireSingleSync=function(e,n){for(var t=i(e,[n]),r=0,o=t.length;r<o;r++){var s=this._findDefinition(t[r]);if(!s||!this._requireSingleSync(s,n))return}return e.state===m.DEFINED?e.exports:void 0},t.prototype._require=function(e,n){var t=e.map(function(e){return this._requireSingle(e,n)},this);return d.all(t)},t.prototype._requireSingle=function(e,n){var t=this._findDefinition(e);return t?this._resolve(t,n):this._initialized.then(function(){var t=this._findDefinition(e);return t?this._resolve(t,n):d.reject(new Error("ymaps.modules: module `"+a(e)+"` is not defined."))},this)},t.prototype._findDefinition=function(e){if("undefined"!=typeof e)return"string"==typeof e?this._definitionsByName[e]:this._definitionsByStorage[e.storage]&&this._definitionsByStorage[e.storage][e.key]},t.prototype._saveDefinitionToStorage=function(e,n){if(e.key&&e.storage){n=n||{key:e.key,storage:e.storage};for(var t=f.isArray(n.key)?n.key:[n.key],r=0,i=t.length;r<i;r++)this._definitionsByStorage[n.storage]=this._definitionsByStorage[n.storage]||{},this._definitionsByStorage[n.storage][t[r]]=e}},t.prototype._fetchModule=function(e){return e.state>=m.DECLARED?d.resolve():this._loadFullBundle()},t.prototype._loadFullBundle=function(){if(!this._fullBundlePromise){for(var e in this._definitionsByName)this._definitionsByName[e].state===m.MENTIONED&&(this._definitionsByName[e].state=m.FETCHING);this._fullBundlePromise=this._loadBundle("full")}return this._fullBundlePromise},t.prototype._loadBundle=function(e){return this._config.fetchBundle(e).then(function(e){function n(){return d.delay().then(function(){var e=i.splice(0,o);if(e.forEach(function(e){e(t)}),i.length>0)return n()})}e.missingModules.forEach(function(e){var n=new r(m.MENTIONED,e,(void 0),(void 0),[],null,null,(void 0));this._definitionsByName[e]=n},this);var t=this._sandbox,i=e.modules,o=400;return n()},this)["catch"](function(n){throw console.error('ymaps: Failed to bundle "'+e+'".'+(n?n.stack||n.message||"":"")),n})},t.prototype._loadModulesMap=function(){return this._config.fetchMap().spread(function(e,n){this._processLoadedMap(e),n()},this)},l.exports}({vow:t.vow,"./ym.utils":t.utils}),a=t.env.server.url+"/"+t.env.server.path.replace(/\/$/,"")+"/images/";t.modules=new s({dependenciesContext:t,initialBudleName:t.env.preload.bundle,fetchBundle:function(e){var r=("__ymaps_"+t.env.namespace+"_"+Date.now()).replace(/\W/g,"_");n[r]=t.ns;var i=document.createElement("script");i.src=t.env.bundles.BASE+t.env.bundles[e],i.setAttribute("data-ymaps-api-ns",r),i.setAttribute("data-ymaps-api-version","2.1.78"),i.async=!0;var o=t.vow.defer();return i.onerror=o.reject.bind(o),t.ns.__provideBundle=o.resolve.bind(o),document.head.appendChild(i),o.promise().always(function(e){return delete n[r],e})},createSandbox:function(e){var n=Object.create(e);return n.importImages=function(e){return{get:function(n){return a+e[n].src}}},t.utils.extend({},t,{modules:n})}}),t.ns.load=function(e,n,r,i){return"function"==typeof e?n?t.ns.ready(["package.full"],e,n):t.ns.ready(["package.full"],e):("string"==typeof e&&(e=[e]),t.ns.ready.apply(this,arguments))},function(){function e(e){return function(){console.warn("{NS}.modules.{FN} is not a public API and will be removed from {NS}.modules.".replace(/\{NS\}/g,t.env.namespace).replace(/\{FN\}/g,e));var n=t.modules[e].apply(t.modules,arguments);return n===t.modules?t.ns.modules:n}}t.ns.modules={require:function(){return t.modules.require.apply(t.modules,arguments)},isDefined:function(){return t.modules.isDefined.apply(t.modules,arguments)},requireSync:function(){return t.modules.requireSync.apply(t.modules,arguments)},define:function(e,n,r,i){return t.modules.define.apply(t.modules,arguments),t.ns.modules},defineSync:e("defineSync"),getDefinition:e("getDefinition"),getState:e("getState"),setOptions:e("setOptions"),flush:e("flush"),nextTick:e("nextTick"),watchResolving:e("watchResolving"),__modules:t.modules}}(),function(e){function n(){l&&(t.performance.saveMeasure("ymaps.readyDelay",t.performance.now()-t.performance.initTimings.responseEnd),l=!1);var e=t.performance.startMeasure("ymaps.ready"),n={};arguments.length&&(1!=arguments.length||"object"!=typeof arguments[0]||arguments[0].length?"function"!=typeof arguments[0]?(n.require="string"==typeof arguments[0]?[arguments[0]]:arguments[0],n.successCallback=arguments[1],n.errorCallback=arguments[2]&&"function"==typeof arguments[2]?arguments[2]:null,n.context=arguments[2]&&"object"==typeof arguments[2]?arguments[2]:arguments[3]):(n.successCallback=arguments[0],n.errorCallback=arguments[1]&&"function"==typeof arguments[1]?arguments[1]:null,n.context=arguments[1]&&"object"==typeof arguments[1]?arguments[1]:arguments[2]):n=arguments[0]);var r=n.require||[],i=o.all([t.modules.require(r),u,c]).spread(function(n){return t.utils.registerImports(t.ns,r,n),e.finish(),t.ns});return i.then(n.successCallback&&function(e){setTimeout(n.successCallback.bind(n.context),0,e)},n.errorCallback&&function(e){setTimeout(n.errorCallback.bind(n.context),0,e)}),i}function r(n,t){if(n){var r=i(e,n);r&&setTimeout(function(){r.method.call(r.context,t)})}}function i(e,n){var t=e;n=n.split(".");for(var r=0,i=n.length-1;r<i;r++)if(t=t[n[r]],!t)return;return{method:t[n[i]],context:t}}var o=t.vow,s=[].concat(["package.system"],t.env.preload.load.split(",").filter(Boolean)),a=t.performance.startMeasure("ymaps.preload"),u=t.modules.require(s).then(function(e){t.utils.registerImports(t.ns,s,e),a.finish(),r(t.env.preload.onLoad,t.ns)},function(e){return r(t.env.preload.onError,e),o.reject(e)}),c="complete"===document.readyState||"interactive"===document.readyState?o.resolve():new o.Promise(function(e){document.addEventListener("DOMContentLoaded",e,!1),document.addEventListener("load",e,!1)});t.ns.ready=n;var l=!0}(this),t.env.server.params.csp&&!t.supports.csp.isSupported&&t.logger.warning("CSP is not suported in this browser"),t.modules.define("vectorEngine.loadEngine",["vow","Hotspot","Monitor","collection.Item","event.Manager","hotspot.layer.Hint","hotspot.layer.optionMapper","interactivityModel.EventController","interactivityModel.layer","option.Manager","poi.BalloonManager","util.shapeFactory"],function(e,n){function r(){var e=n.defer(),r=document.createElement("script");return r.onload=e.resolve.bind(e),r.onerror=e.reject.bind(e),r.src=t.env.hosts.vectorIndex.replace("{{version}}",t.env.vectorVersion),t.env.vectorEngineFileName&&(r.src=r.src.replace("vector.min.js",t.env.vectorEngineFileName)),document.head.insertAdjacentElement("afterbegin",r),e.promise()["catch"](function(){return n.reject(new Error("Failed to load vector engine"))})}if("ymaps"!==t.env.namespace)throw new Error("Vector supports only `ymaps` namespace.");if(null==t.env.vectorVersion)throw new Error("No vector version.");var i=null;e(function(){return i=i||r()})}),t.modules.define("vectorEngine.preload",[],function(e){t.supports.vector.isSupported()&&t.modules.require(["vectorEngine.loadEngine"]).spread(function(e){e()}),e({})}),t.modules.allowRemoteLoading(),o&&(o.parent[o.name]=t.ns),t.performance.init({url:t.env.hosts.api.statCounter+"/counter",data:"/path="+t.env.version.replace(/\W/g,"_")+"."+t.env.browser.platform,enable:"all"==t.env.counters||Math.random()<r&&!t.env.server.params.debug,initUrl:document.currentScript&&document.currentScript.src,useSendBeacon:!t.env.server.params.csp}),t.env.hasValidApiKey||(t.env.apikey=void 0,"undefined"!=typeof t.env.hasValidApiKey&&console.warn("(Yandex Maps JS API): Invalid API key")),i.finish()})({"vectorVersion":"5.15.2","vectorVersionTimestamp":1620814269072,"cacheVersion":null,"type":"production","flags":[],"server":{"url":"https://api-maps.yandex.ru/2.1.78","path":"build/release","params":{"mode":"release","ns":"ymaps","csp":null}},"preload":{"load":"package.full","bundle":"full"},"mode":"release","debug":false,"namespace":"ymaps","enterprise":false,"hasApiKeyParam":false,"browser":{"name":"Chrome","version":"90.0.4430.93","base":"Chromium","engine":"WebKit","engineVersion":"537.36","osName":"Windows 10","osFamily":"Windows","osVersion":"10.0","isMobile":false,"isTablet":false,"multiTouch":false,"platform":"Desktop","cssPrefix":"Webkit"},"lang":"ru_RU","languageCode":"ru","countryCode":"RU","hosts":{"api":{"main":"https://api-maps.yandex.ru/","ua":"https://yandex.ru/legal/maps_termsofuse/?lang={{lang}}","maps":"https://yandex.ru/maps/","statCounter":"https://yandex.ru/clck/","services":{"coverage":"https://api-maps.yandex.ru/services/coverage/","geocode":"https://geocode-maps.yandex.ru/","geoxml":"https://api-maps.yandex.ru/services/geoxml/","inception":"https://api-maps.yandex.ru/services/inception/","panoramaLocate":"https://api-maps.yandex.ru/services/panoramas/","search":"https://api-maps.yandex.ru/services/search/","suggest":"https://suggest-maps.yandex.ru/","regions":"https://api-maps.yandex.ru/services/regions/","route":"https://api-maps.yandex.ru/services/route/"}},"layers":{"map":"https://core-renderer-tiles.maps.yandex.net/tiles?l=map&%c&%l","mapj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=mapj&%c&%l&experimental_disable_toponym_hotspots=true","sat":"https://core-sat.maps.yandex.net/tiles?l=sat&%c&%l","skl":"https://core-renderer-tiles.maps.yandex.net/tiles?l=skl&%c&%l","sklj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=sklj&%c&%l","stv":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=stv&%c&v=%v&%l&format=png","sta":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=sta&%c&v=%v&%l&format=png","staHotspot":"https://core-stv-renderer.maps.yandex.net/2.x/tiles?l=stj&%c&v=%v&format=js","staHotspotKey":"%c&l=stj&tm=%v","carparks":"https://core-carparks-renderer-lots.maps.yandex.net/"},"metro_RU":"https://yandex.ru/metro/","metro_UA":"https://yandex.ua/metro/","metro_BY":"https://yandex.by/metro/","metro_US":"https://yandex.com/metro/","traffic":"https://core-jams-rdr-cache.maps.yandex.net/","trafficInfo":"https://core-jams-info.maps.yandex.net/","trafficArchive":"https://core-jams-rdr-hist.maps.yandex.net/","vectorIndex":"https://yastatic.net/s3/mapsapi-v3/vector/{{version}}/out/vector.min.js","vectorTiles":"https://core-renderer-tiles.maps.yandex.net/vmap2/tiles?lang={{lang}}&x={{x}}&y={{y}}&z={{z}}&zmin={{zmin}}&zmax={{zmax}}&v={{version}}","vectorImages":"https://core-renderer-tiles.maps.yandex.net/vmap2/icons?id={{id}}&scale={{scale}}","vectorMeshes":"https://core-renderer-tiles.maps.yandex.net/vmap2/meshes?id={{id}}","vectorGlyphs":"https://core-renderer-tiles.maps.yandex.net/vmap2/glyphs?lang={{lang}}&font_id={{fontId}}&range={{range}}","indoorTiles":"https://core-renderer-tiles.maps.yandex.net/","panoramasTiles":"https://pano.maps.yandex.net/%s/%z.%x.%y","taxiRouteInfo":"https://taxi-routeinfo.taxi.yandex.net/taxi_info?clid=yamaps&apikey=f6d7c076e16e4d53a928961595e76215&rll={rll}"},"layers":{"map":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sat":{"version":"3.786.0"},"skl":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"stv":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"sta":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"trf":{"version":"1620814200","scaled":true},"carparks":{"version":"","scaled":true,"hotspotZoomRange":[0,23]}},"geolocation":{"longitude":31.482771,"latitude":49.02753,"isHighAccuracy":false,"span":{"longitude":18.090408,"latitude":7.214737}},"token":"a005daa235b407b431a9b150bb3ea073","distribution":{},"version":"2.1.78","majorVersion":"2.1","cssPrefix":"ymaps-2-1-78-","tag":"2.1.78-11","coordinatesOrder":"latlong","bundles":{"panoramas":"/release/panoramas-8d02ed1377a16bfcc73b4950c04e42d8bed31c02.js","full":"/release/full-ffb813a29f30feadb63b5654242d042b7b6a91aa.js","BASE":"https://yastatic.net/s3/front-maps-static/maps-front-jsapi-v2-1/2.1.78-11/build"}}, null)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment