mapbox.internals.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
  2. function corslite(url, callback, cors) {
  3. var sent = false;
  4. if (typeof window.XMLHttpRequest === 'undefined') {
  5. return callback(Error('Browser not supported'));
  6. }
  7. if (typeof cors === 'undefined') {
  8. var m = url.match(/^\s*https?:\/\/[^\/]*/);
  9. cors = m && (m[0] !== location.protocol + '//' + location.domain +
  10. (location.port ? ':' + location.port : ''));
  11. }
  12. var x = new window.XMLHttpRequest();
  13. function isSuccessful(status) {
  14. return status >= 200 && status < 300 || status === 304;
  15. }
  16. if (cors && !('withCredentials' in x)) {
  17. // IE8-9
  18. x = new window.XDomainRequest();
  19. // Ensure callback is never called synchronously, i.e., before
  20. // x.send() returns (this has been observed in the wild).
  21. // See https://github.com/mapbox/mapbox.js/issues/472
  22. var original = callback;
  23. callback = function() {
  24. if (sent) {
  25. original.apply(this, arguments);
  26. } else {
  27. var that = this, args = arguments;
  28. setTimeout(function() {
  29. original.apply(that, args);
  30. }, 0);
  31. }
  32. }
  33. }
  34. function loaded() {
  35. if (
  36. // XDomainRequest
  37. x.status === undefined ||
  38. // modern browsers
  39. isSuccessful(x.status)) callback.call(x, null, x);
  40. else callback.call(x, x, null);
  41. }
  42. // Both `onreadystatechange` and `onload` can fire. `onreadystatechange`
  43. // has [been supported for longer](http://stackoverflow.com/a/9181508/229001).
  44. if ('onload' in x) {
  45. x.onload = loaded;
  46. } else {
  47. x.onreadystatechange = function readystate() {
  48. if (x.readyState === 4) {
  49. loaded();
  50. }
  51. };
  52. }
  53. // Call the callback with the XMLHttpRequest object as an error and prevent
  54. // it from ever being called again by reassigning it to `noop`
  55. x.onerror = function error(evt) {
  56. // XDomainRequest provides no evt parameter
  57. callback.call(this, evt || true, null);
  58. callback = function() { };
  59. };
  60. // IE9 must have onprogress be set to a unique function.
  61. x.onprogress = function() { };
  62. x.ontimeout = function(evt) {
  63. callback.call(this, evt, null);
  64. callback = function() { };
  65. };
  66. x.onabort = function(evt) {
  67. callback.call(this, evt, null);
  68. callback = function() { };
  69. };
  70. // GET is the only supported HTTP Verb by XDomainRequest and is the
  71. // only one supported here.
  72. x.open('GET', url, true);
  73. // Send the request. Sending data is not supported.
  74. x.send(null);
  75. sent = true;
  76. return x;
  77. }
  78. if (typeof module !== 'undefined') module.exports = corslite;
  79. },{}],2:[function(require,module,exports){
  80. module.exports={
  81. "author": "Mapbox",
  82. "name": "mapbox.js",
  83. "description": "mapbox javascript api",
  84. "version": "3.1.1",
  85. "homepage": "http://mapbox.com/",
  86. "repository": {
  87. "type": "git",
  88. "url": "git://github.com/mapbox/mapbox.js.git"
  89. },
  90. "main": "src/index.js",
  91. "dependencies": {
  92. "corslite": "0.0.6",
  93. "isarray": "0.0.1",
  94. "leaflet": "1.0.2",
  95. "mustache": "2.2.1",
  96. "sanitize-caja": "0.1.4"
  97. },
  98. "scripts": {
  99. "test": "eslint --no-eslintrc -c .eslintrc src && phantomjs node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js test/index.html"
  100. },
  101. "license": "BSD-3-Clause",
  102. "devDependencies": {
  103. "browserify": "^13.0.0",
  104. "clean-css": "~2.0.7",
  105. "cz-conventional-changelog": "1.2.0",
  106. "eslint": "^0.23.0",
  107. "expect.js": "0.3.1",
  108. "happen": "0.1.3",
  109. "leaflet-fullscreen": "0.0.4",
  110. "leaflet-hash": "0.2.1",
  111. "marked": "~0.3.0",
  112. "minifyify": "^6.1.0",
  113. "minimist": "0.0.5",
  114. "mocha": "2.4.5",
  115. "mocha-phantomjs-core": "2.0.1",
  116. "phantomjs-prebuilt": "2.1.12",
  117. "sinon": "1.10.2"
  118. },
  119. "optionalDependencies": {},
  120. "engines": {
  121. "node": "*"
  122. },
  123. "config": {
  124. "commitizen": {
  125. "path": "./node_modules/cz-conventional-changelog"
  126. }
  127. }
  128. }
  129. },{}],3:[function(require,module,exports){
  130. 'use strict';
  131. module.exports = {
  132. HTTP_URL: 'http://a.tiles.mapbox.com/v4',
  133. HTTPS_URL: 'https://a.tiles.mapbox.com/v4',
  134. FORCE_HTTPS: false,
  135. REQUIRE_ACCESS_TOKEN: true
  136. };
  137. },{}],4:[function(require,module,exports){
  138. 'use strict';
  139. var config = require('./config'),
  140. version = require('../package.json').version;
  141. module.exports = function(path, accessToken) {
  142. accessToken = accessToken || L.mapbox.accessToken;
  143. if (!accessToken && config.REQUIRE_ACCESS_TOKEN) {
  144. throw new Error('An API access token is required to use Mapbox.js. ' +
  145. 'See https://www.mapbox.com/mapbox.js/api/v' + version + '/api-access-tokens/');
  146. }
  147. var url = (document.location.protocol === 'https:' || config.FORCE_HTTPS) ? config.HTTPS_URL : config.HTTP_URL;
  148. url = url.replace(/\/v4$/, '');
  149. url += path;
  150. if (config.REQUIRE_ACCESS_TOKEN) {
  151. if (accessToken[0] === 's') {
  152. throw new Error('Use a public access token (pk.*) with Mapbox.js, not a secret access token (sk.*). ' +
  153. 'See https://www.mapbox.com/mapbox.js/api/v' + version + '/api-access-tokens/');
  154. }
  155. url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';
  156. url += accessToken;
  157. }
  158. return url;
  159. };
  160. module.exports.tileJSON = function(urlOrMapID, accessToken) {
  161. if (urlOrMapID.indexOf('mapbox://styles') === 0) {
  162. throw new Error('Styles created with Mapbox Studio need to be used with ' +
  163. 'L.mapbox.styleLayer, not L.mapbox.tileLayer');
  164. }
  165. if (urlOrMapID.indexOf('/') !== -1)
  166. return urlOrMapID;
  167. var url = module.exports('/v4/' + urlOrMapID + '.json', accessToken);
  168. // TileJSON requests need a secure flag appended to their URLs so
  169. // that the server knows to send SSL-ified resource references.
  170. if (url.indexOf('https') === 0)
  171. url += '&secure';
  172. return url;
  173. };
  174. module.exports.style = function(styleURL, accessToken) {
  175. if (styleURL.indexOf('mapbox://styles/') === -1) throw new Error('Incorrectly formatted Mapbox style at ' + styleURL);
  176. var ownerIDStyle = styleURL.split('mapbox://styles/')[1];
  177. var url = module.exports('/styles/v1/' + ownerIDStyle, accessToken)
  178. .replace('http://', 'https://');
  179. return url;
  180. };
  181. },{"../package.json":2,"./config":3}],5:[function(require,module,exports){
  182. 'use strict';
  183. function utfDecode(c) {
  184. if (c >= 93) c--;
  185. if (c >= 35) c--;
  186. return c - 32;
  187. }
  188. module.exports = function(data) {
  189. return function(x, y) {
  190. if (!data) return;
  191. var idx = utfDecode(data.grid[y].charCodeAt(x)),
  192. key = data.keys[idx];
  193. return data.data[key];
  194. };
  195. };
  196. },{}],6:[function(require,module,exports){
  197. window.internals = {
  198. url: require('./format_url'),
  199. config: require('./config'),
  200. util: require('./util'),
  201. grid: require('./grid'),
  202. request: require('./request')
  203. };
  204. },{"./config":3,"./format_url":4,"./grid":5,"./request":7,"./util":8}],7:[function(require,module,exports){
  205. 'use strict';
  206. var corslite = require('corslite'),
  207. strict = require('./util').strict,
  208. config = require('./config');
  209. var protocol = /^(https?:)?(?=\/\/(.|api)\.tiles\.mapbox\.com\/)/;
  210. module.exports = function(url, callback) {
  211. strict(url, 'string');
  212. strict(callback, 'function');
  213. url = url.replace(protocol, function(match, protocol) {
  214. if (!('withCredentials' in new window.XMLHttpRequest())) {
  215. // XDomainRequest in use; doesn't support cross-protocol requests
  216. return document.location.protocol;
  217. } else if (protocol === 'https:' || document.location.protocol === 'https:' || config.FORCE_HTTPS) {
  218. return 'https:';
  219. } else {
  220. return 'http:';
  221. }
  222. });
  223. function onload(err, resp) {
  224. if (!err && resp) {
  225. resp = JSON.parse(resp.responseText);
  226. }
  227. callback(err, resp);
  228. }
  229. return corslite(url, onload);
  230. };
  231. },{"./config":3,"./util":8,"corslite":1}],8:[function(require,module,exports){
  232. 'use strict';
  233. function contains(item, list) {
  234. if (!list || !list.length) return false;
  235. for (var i = 0; i < list.length; i++) {
  236. if (list[i] === item) return true;
  237. }
  238. return false;
  239. }
  240. module.exports = {
  241. idUrl: function(_, t) {
  242. if (_.indexOf('/') === -1) t.loadID(_);
  243. else t.loadURL(_);
  244. },
  245. log: function(_) {
  246. if (typeof console === 'object' &&
  247. typeof console.error === 'function') {
  248. console.error(_);
  249. }
  250. },
  251. strict: function(_, type) {
  252. if (typeof _ !== type) {
  253. throw new Error('Invalid argument: ' + type + ' expected');
  254. }
  255. },
  256. strict_instance: function(_, klass, name) {
  257. if (!(_ instanceof klass)) {
  258. throw new Error('Invalid argument: ' + name + ' expected');
  259. }
  260. },
  261. strict_oneof: function(_, values) {
  262. if (!contains(_, values)) {
  263. throw new Error('Invalid argument: ' + _ + ' given, valid values are ' +
  264. values.join(', '));
  265. }
  266. },
  267. strip_tags: function(_) {
  268. return _.replace(/<[^<]+>/g, '');
  269. },
  270. lbounds: function(_) {
  271. // leaflet-compatible bounds, since leaflet does not do geojson
  272. return new L.LatLngBounds([[_[1], _[0]], [_[3], _[2]]]);
  273. }
  274. };
  275. },{}]},{},[6])
  276. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvY29yc2xpdGUvY29yc2xpdGUuanMiLCJwYWNrYWdlLmpzb24iLCJzcmMvY29uZmlnLmpzIiwic3JjL2Zvcm1hdF91cmwuanMiLCJzcmMvZ3JpZC5qcyIsInNyYy9pbnRlcm5hbHMuanMiLCJzcmMvcmVxdWVzdC5qcyIsInNyYy91dGlsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsImZ1bmN0aW9uIGNvcnNsaXRlKHVybCwgY2FsbGJhY2ssIGNvcnMpIHtcbiAgICB2YXIgc2VudCA9IGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhFcnJvcignQnJvd3NlciBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIG0gPSB1cmwubWF0Y2goL15cXHMqaHR0cHM/OlxcL1xcL1teXFwvXSovKTtcbiAgICAgICAgY29ycyA9IG0gJiYgKG1bMF0gIT09IGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmRvbWFpbiArXG4gICAgICAgICAgICAgICAgKGxvY2F0aW9uLnBvcnQgPyAnOicgKyBsb2NhdGlvbi5wb3J0IDogJycpKTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIGZ1bmN0aW9uIGlzU3VjY2Vzc2Z1bChzdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuICAgIH1cblxuICAgIGlmIChjb3JzICYmICEoJ3dpdGhDcmVkZW50aWFscycgaW4geCkpIHtcbiAgICAgICAgLy8gSUU4LTlcbiAgICAgICAgeCA9IG5ldyB3aW5kb3cuWERvbWFpblJlcXVlc3QoKTtcblxuICAgICAgICAvLyBFbnN1cmUgY2FsbGJhY2sgaXMgbmV2ZXIgY2FsbGVkIHN5bmNocm9ub3VzbHksIGkuZS4sIGJlZm9yZVxuICAgICAgICAvLyB4LnNlbmQoKSByZXR1cm5zICh0aGlzIGhhcyBiZWVuIG9ic2VydmVkIGluIHRoZSB3aWxkKS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LmpzL2lzc3Vlcy80NzJcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gY2FsbGJhY2s7XG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoc2VudCkge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRlZCgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gWERvbWFpblJlcXVlc3RcbiAgICAgICAgICAgIHguc3RhdHVzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIC8vIG1vZGVybiBicm93c2Vyc1xuICAgICAgICAgICAgaXNTdWNjZXNzZnVsKHguc3RhdHVzKSkgY2FsbGJhY2suY2FsbCh4LCBudWxsLCB4KTtcbiAgICAgICAgZWxzZSBjYWxsYmFjay5jYWxsKHgsIHgsIG51bGwpO1xuICAgIH1cblxuICAgIC8vIEJvdGggYG9ucmVhZHlzdGF0ZWNoYW5nZWAgYW5kIGBvbmxvYWRgIGNhbiBmaXJlLiBgb25yZWFkeXN0YXRlY2hhbmdlYFxuICAgIC8vIGhhcyBbYmVlbiBzdXBwb3J0ZWQgZm9yIGxvbmdlcl0oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTE4MTUwOC8yMjkwMDEpLlxuICAgIGlmICgnb25sb2FkJyBpbiB4KSB7XG4gICAgICAgIHgub25sb2FkID0gbG9hZGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHgub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gcmVhZHlzdGF0ZSgpIHtcbiAgICAgICAgICAgIGlmICh4LnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBsb2FkZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBYTUxIdHRwUmVxdWVzdCBvYmplY3QgYXMgYW4gZXJyb3IgYW5kIHByZXZlbnRcbiAgICAvLyBpdCBmcm9tIGV2ZXIgYmVpbmcgY2FsbGVkIGFnYWluIGJ5IHJlYXNzaWduaW5nIGl0IHRvIGBub29wYFxuICAgIHgub25lcnJvciA9IGZ1bmN0aW9uIGVycm9yKGV2dCkge1xuICAgICAgICAvLyBYRG9tYWluUmVxdWVzdCBwcm92aWRlcyBubyBldnQgcGFyYW1ldGVyXG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXZ0IHx8IHRydWUsIG51bGwpO1xuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgeyB9O1xuICAgIH07XG5cbiAgICAvLyBJRTkgbXVzdCBoYXZlIG9ucHJvZ3Jlc3MgYmUgc2V0IHRvIGEgdW5pcXVlIGZ1bmN0aW9uLlxuICAgIHgub25wcm9ncmVzcyA9IGZ1bmN0aW9uKCkgeyB9O1xuXG4gICAgeC5vbnRpbWVvdXQgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBldnQsIG51bGwpO1xuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgeyB9O1xuICAgIH07XG5cbiAgICB4Lm9uYWJvcnQgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBldnQsIG51bGwpO1xuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCkgeyB9O1xuICAgIH07XG5cbiAgICAvLyBHRVQgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIEhUVFAgVmVyYiBieSBYRG9tYWluUmVxdWVzdCBhbmQgaXMgdGhlXG4gICAgLy8gb25seSBvbmUgc3VwcG9ydGVkIGhlcmUuXG4gICAgeC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdC4gU2VuZGluZyBkYXRhIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgeC5zZW5kKG51bGwpO1xuICAgIHNlbnQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHg7XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykgbW9kdWxlLmV4cG9ydHMgPSBjb3JzbGl0ZTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJhdXRob3JcIjogXCJNYXBib3hcIixcbiAgXCJuYW1lXCI6IFwibWFwYm94LmpzXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJtYXBib3ggamF2YXNjcmlwdCBhcGlcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMy4xLjFcIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHA6Ly9tYXBib3guY29tL1wiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0Oi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LmpzLmdpdFwiXG4gIH0sXG4gIFwibWFpblwiOiBcInNyYy9pbmRleC5qc1wiLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJjb3JzbGl0ZVwiOiBcIjAuMC42XCIsXG4gICAgXCJpc2FycmF5XCI6IFwiMC4wLjFcIixcbiAgICBcImxlYWZsZXRcIjogXCIxLjAuMlwiLFxuICAgIFwibXVzdGFjaGVcIjogXCIyLjIuMVwiLFxuICAgIFwic2FuaXRpemUtY2FqYVwiOiBcIjAuMS40XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInRlc3RcIjogXCJlc2xpbnQgLS1uby1lc2xpbnRyYyAtYyAuZXNsaW50cmMgc3JjICYmIHBoYW50b21qcyBub2RlX21vZHVsZXMvbW9jaGEtcGhhbnRvbWpzLWNvcmUvbW9jaGEtcGhhbnRvbWpzLWNvcmUuanMgdGVzdC9pbmRleC5odG1sXCJcbiAgfSxcbiAgXCJsaWNlbnNlXCI6IFwiQlNELTMtQ2xhdXNlXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImJyb3dzZXJpZnlcIjogXCJeMTMuMC4wXCIsXG4gICAgXCJjbGVhbi1jc3NcIjogXCJ+Mi4wLjdcIixcbiAgICBcImN6LWNvbnZlbnRpb25hbC1jaGFuZ2Vsb2dcIjogXCIxLjIuMFwiLFxuICAgIFwiZXNsaW50XCI6IFwiXjAuMjMuMFwiLFxuICAgIFwiZXhwZWN0LmpzXCI6IFwiMC4zLjFcIixcbiAgICBcImhhcHBlblwiOiBcIjAuMS4zXCIsXG4gICAgXCJsZWFmbGV0LWZ1bGxzY3JlZW5cIjogXCIwLjAuNFwiLFxuICAgIFwibGVhZmxldC1oYXNoXCI6IFwiMC4yLjFcIixcbiAgICBcIm1hcmtlZFwiOiBcIn4wLjMuMFwiLFxuICAgIFwibWluaWZ5aWZ5XCI6IFwiXjYuMS4wXCIsXG4gICAgXCJtaW5pbWlzdFwiOiBcIjAuMC41XCIsXG4gICAgXCJtb2NoYVwiOiBcIjIuNC41XCIsXG4gICAgXCJtb2NoYS1waGFudG9tanMtY29yZVwiOiBcIjIuMC4xXCIsXG4gICAgXCJwaGFudG9tanMtcHJlYnVpbHRcIjogXCIyLjEuMTJcIixcbiAgICBcInNpbm9uXCI6IFwiMS4xMC4yXCJcbiAgfSxcbiAgXCJvcHRpb25hbERlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCIqXCJcbiAgfSxcbiAgXCJjb25maWdcIjoge1xuICAgIFwiY29tbWl0aXplblwiOiB7XG4gICAgICBcInBhdGhcIjogXCIuL25vZGVfbW9kdWxlcy9jei1jb252ZW50aW9uYWwtY2hhbmdlbG9nXCJcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgSFRUUF9VUkw6ICdodHRwOi8vYS50aWxlcy5tYXBib3guY29tL3Y0JyxcbiAgICBIVFRQU19VUkw6ICdodHRwczovL2EudGlsZXMubWFwYm94LmNvbS92NCcsXG4gICAgRk9SQ0VfSFRUUFM6IGZhbHNlLFxuICAgIFJFUVVJUkVfQUNDRVNTX1RPS0VOOiB0cnVlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKSxcbiAgICB2ZXJzaW9uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihwYXRoLCBhY2Nlc3NUb2tlbikge1xuICAgIGFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4gfHwgTC5tYXBib3guYWNjZXNzVG9rZW47XG5cbiAgICBpZiAoIWFjY2Vzc1Rva2VuICYmIGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIEFQSSBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQgdG8gdXNlIE1hcGJveC5qcy4gJyArXG4gICAgICAgICAgICAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LmpzL2FwaS92JyArIHZlcnNpb24gKyAnL2FwaS1hY2Nlc3MtdG9rZW5zLycpO1xuICAgIH1cblxuICAgIHZhciB1cmwgPSAoZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonIHx8IGNvbmZpZy5GT1JDRV9IVFRQUykgPyBjb25maWcuSFRUUFNfVVJMIDogY29uZmlnLkhUVFBfVVJMO1xuICAgIHVybCA9IHVybC5yZXBsYWNlKC9cXC92NCQvLCAnJyk7XG4gICAgdXJsICs9IHBhdGg7XG5cbiAgICBpZiAoY29uZmlnLlJFUVVJUkVfQUNDRVNTX1RPS0VOKSB7XG4gICAgICAgIGlmIChhY2Nlc3NUb2tlblswXSA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94LmpzLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC5qcy9hcGkvdicgKyB2ZXJzaW9uICsgJy9hcGktYWNjZXNzLXRva2Vucy8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybCArPSB1cmwuaW5kZXhPZignPycpICE9PSAtMSA/ICcmYWNjZXNzX3Rva2VuPScgOiAnP2FjY2Vzc190b2tlbj0nO1xuICAgICAgICB1cmwgKz0gYWNjZXNzVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybDtcbn07XG5cbm1vZHVsZS5leHBvcnRzLnRpbGVKU09OID0gZnVuY3Rpb24odXJsT3JNYXBJRCwgYWNjZXNzVG9rZW4pIHtcblxuICAgIGlmICh1cmxPck1hcElELmluZGV4T2YoJ21hcGJveDovL3N0eWxlcycpID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGVzIGNyZWF0ZWQgd2l0aCBNYXBib3ggU3R1ZGlvIG5lZWQgdG8gYmUgdXNlZCB3aXRoICcgK1xuICAgICAgICAgICAgJ0wubWFwYm94LnN0eWxlTGF5ZXIsIG5vdCBMLm1hcGJveC50aWxlTGF5ZXInKTtcbiAgICB9XG5cbiAgICBpZiAodXJsT3JNYXBJRC5pbmRleE9mKCcvJykgIT09IC0xKVxuICAgICAgICByZXR1cm4gdXJsT3JNYXBJRDtcblxuICAgIHZhciB1cmwgPSBtb2R1bGUuZXhwb3J0cygnL3Y0LycgKyB1cmxPck1hcElEICsgJy5qc29uJywgYWNjZXNzVG9rZW4pO1xuXG4gICAgLy8gVGlsZUpTT04gcmVxdWVzdHMgbmVlZCBhIHNlY3VyZSBmbGFnIGFwcGVuZGVkIHRvIHRoZWlyIFVSTHMgc29cbiAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cbiAgICBpZiAodXJsLmluZGV4T2YoJ2h0dHBzJykgPT09IDApXG4gICAgICAgIHVybCArPSAnJnNlY3VyZSc7XG5cbiAgICByZXR1cm4gdXJsO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cy5zdHlsZSA9IGZ1bmN0aW9uKHN0eWxlVVJMLCBhY2Nlc3NUb2tlbikge1xuICAgIGlmIChzdHlsZVVSTC5pbmRleE9mKCdtYXBib3g6Ly9zdHlsZXMvJykgPT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdGx5IGZvcm1hdHRlZCBNYXBib3ggc3R5bGUgYXQgJyArIHN0eWxlVVJMKTtcblxuICAgIHZhciBvd25lcklEU3R5bGUgPSBzdHlsZVVSTC5zcGxpdCgnbWFwYm94Oi8vc3R5bGVzLycpWzFdO1xuICAgIHZhciB1cmwgPSBtb2R1bGUuZXhwb3J0cygnL3N0eWxlcy92MS8nICsgb3duZXJJRFN0eWxlLCBhY2Nlc3NUb2tlbilcbiAgICAgICAgLnJlcGxhY2UoJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nKTtcblxuICAgIHJldHVybiB1cmw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiB1dGZEZWNvZGUoYykge1xuICAgIGlmIChjID49IDkzKSBjLS07XG4gICAgaWYgKGMgPj0gMzUpIGMtLTtcbiAgICByZXR1cm4gYyAtIDMyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICAgICAgdmFyIGlkeCA9IHV0ZkRlY29kZShkYXRhLmdyaWRbeV0uY2hhckNvZGVBdCh4KSksXG4gICAgICAgICAgICBrZXkgPSBkYXRhLmtleXNbaWR4XTtcbiAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVtrZXldO1xuICAgIH07XG59O1xuIiwid2luZG93LmludGVybmFscyA9IHtcbiAgICB1cmw6IHJlcXVpcmUoJy4vZm9ybWF0X3VybCcpLFxuICAgIGNvbmZpZzogcmVxdWlyZSgnLi9jb25maWcnKSxcbiAgICB1dGlsOiByZXF1aXJlKCcuL3V0aWwnKSxcbiAgICBncmlkOiByZXF1aXJlKCcuL2dyaWQnKSxcbiAgICByZXF1ZXN0OiByZXF1aXJlKCcuL3JlcXVlc3QnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvcnNsaXRlID0gcmVxdWlyZSgnY29yc2xpdGUnKSxcbiAgICBzdHJpY3QgPSByZXF1aXJlKCcuL3V0aWwnKS5zdHJpY3QsXG4gICAgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcblxudmFyIHByb3RvY29sID0gL14oaHR0cHM/Oik/KD89XFwvXFwvKC58YXBpKVxcLnRpbGVzXFwubWFwYm94XFwuY29tXFwvKS87XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgIHN0cmljdCh1cmwsICdzdHJpbmcnKTtcbiAgICBzdHJpY3QoY2FsbGJhY2ssICdmdW5jdGlvbicpO1xuXG4gICAgdXJsID0gdXJsLnJlcGxhY2UocHJvdG9jb2wsIGZ1bmN0aW9uKG1hdGNoLCBwcm90b2NvbCkge1xuICAgICAgICBpZiAoISgnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCkpKSB7XG4gICAgICAgICAgICAvLyBYRG9tYWluUmVxdWVzdCBpbiB1c2U7IGRvZXNuJ3Qgc3VwcG9ydCBjcm9zcy1wcm90b2NvbCByZXF1ZXN0c1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sID09PSAnaHR0cHM6JyB8fCBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgfHwgY29uZmlnLkZPUkNFX0hUVFBTKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHBzOic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHA6JztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gb25sb2FkKGVyciwgcmVzcCkge1xuICAgICAgICBpZiAoIWVyciAmJiByZXNwKSB7XG4gICAgICAgICAgICByZXNwID0gSlNPTi5wYXJzZShyZXNwLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29yc2xpdGUodXJsLCBvbmxvYWQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY29udGFpbnMoaXRlbSwgbGlzdCkge1xuICAgIGlmICghbGlzdCB8fCAhbGlzdC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGxpc3RbaV0gPT09IGl0ZW0pIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGlkVXJsOiBmdW5jdGlvbihfLCB0KSB7XG4gICAgICAgIGlmIChfLmluZGV4T2YoJy8nKSA9PT0gLTEpIHQubG9hZElEKF8pO1xuICAgICAgICBlbHNlIHQubG9hZFVSTChfKTtcbiAgICB9LFxuICAgIGxvZzogZnVuY3Rpb24oXykge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihfKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc3RyaWN0OiBmdW5jdGlvbihfLCB0eXBlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgXyAhPT0gdHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50OiAnICsgdHlwZSArICcgZXhwZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc3RyaWN0X2luc3RhbmNlOiBmdW5jdGlvbihfLCBrbGFzcywgbmFtZSkge1xuICAgICAgICBpZiAoIShfIGluc3RhbmNlb2Yga2xhc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQ6ICcgKyBuYW1lICsgJyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBzdHJpY3Rfb25lb2Y6IGZ1bmN0aW9uKF8sIHZhbHVlcykge1xuICAgICAgICBpZiAoIWNvbnRhaW5zKF8sIHZhbHVlcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudDogJyArIF8gKyAnIGdpdmVuLCB2YWxpZCB2YWx1ZXMgYXJlICcgK1xuICAgICAgICAgICAgICAgIHZhbHVlcy5qb2luKCcsICcpKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc3RyaXBfdGFnczogZnVuY3Rpb24oXykge1xuICAgICAgICByZXR1cm4gXy5yZXBsYWNlKC88W148XSs+L2csICcnKTtcbiAgICB9LFxuICAgIGxib3VuZHM6IGZ1bmN0aW9uKF8pIHtcbiAgICAgICAgLy8gbGVhZmxldC1jb21wYXRpYmxlIGJvdW5kcywgc2luY2UgbGVhZmxldCBkb2VzIG5vdCBkbyBnZW9qc29uXG4gICAgICAgIHJldHVybiBuZXcgTC5MYXRMbmdCb3VuZHMoW1tfWzFdLCBfWzBdXSwgW19bM10sIF9bMl1dXSk7XG4gICAgfVxufTtcbiJdfQ==