fa100e0900a8c3255a4388d06ee51ed0.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. ace.define("ace/mode/nasal_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module){/* ***** BEGIN LICENSE BLOCK *****
  2. * Distributed under the BSD license:
  3. *
  4. * Copyright (c) 2012, Ajax.org B.V.
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. * * Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * * Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. * * Neither the name of Ajax.org B.V. nor the
  15. * names of its contributors may be used to endorse or promote products
  16. * derived from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  19. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  20. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  21. * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
  22. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  23. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  24. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  25. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  27. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. *
  29. * ***** END LICENSE BLOCK ***** */
  30. "use strict";
  31. var oop = require("../lib/oop");
  32. var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
  33. var NasalHighlightRules = function () {
  34. this.$rules = {
  35. start: [{
  36. token: "constant.other.allcaps.nasal",
  37. regex: /\b[[:upper:]_][[:upper:][:digit:]_]*\b(?![\.\(\'\"])/,
  38. comment: "Match identifiers in ALL_CAPS as constants, except when followed by `.`, `(`, `'`, or `\"`."
  39. }, {
  40. todo: {
  41. token: [
  42. "support.class.nasal",
  43. "meta.function.nasal",
  44. "entity.name.function.nasal",
  45. "meta.function.nasal",
  46. "keyword.operator.nasal",
  47. "meta.function.nasal",
  48. "storage.type.function.nasal",
  49. "meta.function.nasal",
  50. "punctuation.definition.parameters.begin.nasal"
  51. ],
  52. regex: /([a-zA-Z_?.$][\w?.$]*)(\.)([a-zA-Z_?.$][\w?.$]*)(\s*)(=)(\s*)(func)(\s*)(\()/,
  53. push: [{
  54. token: "punctuation.definition.parameters.end.nasal",
  55. regex: /\)/,
  56. next: "pop"
  57. }, {
  58. include: "$self"
  59. }, {
  60. token: "variable.parameter.nasal",
  61. regex: /\w/
  62. }, {
  63. defaultToken: "meta.function.nasal"
  64. }]
  65. },
  66. comment: "match stuff like: Sound.play = func() { … }"
  67. }, {
  68. todo: {
  69. token: [
  70. "entity.name.function.nasal",
  71. "meta.function.nasal",
  72. "keyword.operator.nasal",
  73. "meta.function.nasal",
  74. "storage.type.function.nasal",
  75. "meta.function.nasal",
  76. "punctuation.definition.parameters.begin.nasal"
  77. ],
  78. regex: /([a-zA-Z_?$][\w?$]*)(\s*)(=)(\s*)(func)(\s*)(\()/,
  79. push: [{
  80. token: "punctuation.definition.parameters.end.nasal",
  81. regex: /\)/,
  82. next: "pop"
  83. }, {
  84. include: "$self"
  85. }, {
  86. token: "variable.parameter.nasal",
  87. regex: /\w/
  88. }, {
  89. defaultToken: "meta.function.nasal"
  90. }]
  91. },
  92. comment: "match stuff like: play = func() { … }"
  93. }, {
  94. todo: {
  95. token: [
  96. "entity.name.function.nasal",
  97. "meta.function.nasal",
  98. "keyword.operator.nasal",
  99. "meta.function.nasal",
  100. "storage.type.function.nasal",
  101. "meta.function.nasal",
  102. "punctuation.definition.parameters.begin.nasal"
  103. ],
  104. regex: /([a-zA-Z_?$][\w?$]*)(\s*)(=)(\s*\(\s*)(func)(\s*)(\()/,
  105. push: [{
  106. token: "punctuation.definition.parameters.end.nasal",
  107. regex: /\)/,
  108. next: "pop"
  109. }, {
  110. include: "$self"
  111. }, {
  112. token: "variable.parameter.nasal",
  113. regex: /\w/
  114. }, {
  115. defaultToken: "meta.function.nasal"
  116. }]
  117. },
  118. comment: "match stuff like: play = (func() { … }"
  119. }, {
  120. todo: {
  121. token: [
  122. "entity.name.function.nasal",
  123. "meta.function.hash.nasal",
  124. "storage.type.function.nasal",
  125. "meta.function.hash.nasal",
  126. "punctuation.definition.parameters.begin.nasal"
  127. ],
  128. regex: /\b([a-zA-Z_?.$][\w?.$]*)(\s*:\s*\b)(func)(\s*)(\()/,
  129. push: [{
  130. token: "punctuation.definition.parameters.end.nasal",
  131. regex: /\)/,
  132. next: "pop"
  133. }, {
  134. include: "$self"
  135. }, {
  136. token: "variable.parameter.nasal",
  137. regex: /\w/
  138. }, {
  139. defaultToken: "meta.function.hash.nasal"
  140. }]
  141. },
  142. comment: "match stuff like: foobar: func() { … }"
  143. }, {
  144. todo: {
  145. token: [
  146. "storage.type.function.nasal",
  147. "meta.function.nasal",
  148. "punctuation.definition.parameters.begin.nasal"
  149. ],
  150. regex: /\b(func)(\s*)(\()/,
  151. push: [{
  152. token: "punctuation.definition.parameters.end.nasal",
  153. regex: /\)/,
  154. next: "pop"
  155. }, {
  156. include: "$self"
  157. }, {
  158. token: "variable.parameter.nasal",
  159. regex: /\w/
  160. }, {
  161. defaultToken: "meta.function.nasal"
  162. }]
  163. },
  164. comment: "match stuff like: func() { … }"
  165. }, {
  166. token: [
  167. "keyword.operator.new.nasal",
  168. "meta.class.instance.constructor",
  169. "entity.name.type.instance.nasal"
  170. ],
  171. regex: /(new)(\s+)(\w+(?:\.\w*)?)/
  172. }, {
  173. token: "keyword.control.nasal",
  174. regex: /\b(?:if|else|elsif|while|for|foreach|forindex)\b/
  175. }, {
  176. token: "keyword.control.nasal",
  177. regex: /\b(?:break(?:\s+[A-Z]{2,16})?(?=\s*(?:;|\}))|continue(?:\s+[A-Z]{2,16})?(?=\s*(?:;|\}))|[A-Z]{2,16}(?=\s*;(?:[^\)#;]*?;){0,2}[^\)#;]*?\)))\b/
  178. }, {
  179. token: "keyword.operator.nasal",
  180. regex: /!|\*|\-|\+|~|\/|==|=|!=|<=|>=|<|>|!|\?|\:|\*=|\/=|\+=|\-=|~=|\.\.\.|\b(?:and|or)\b/
  181. }, {
  182. token: "variable.language.nasal",
  183. regex: /\b(?:me|arg|parents|obj)\b/
  184. }, {
  185. token: "storage.type.nasal",
  186. regex: /\b(?:return|var)\b/
  187. }, {
  188. token: "constant.language.nil.nasal",
  189. regex: /\bnil\b/
  190. }, {
  191. token: "punctuation.definition.string.begin.nasal",
  192. regex: /'/,
  193. push: [{
  194. token: "punctuation.definition.string.end.nasal",
  195. regex: /'/,
  196. next: "pop"
  197. }, {
  198. token: "constant.character.escape.nasal",
  199. regex: /\\'/
  200. }, {
  201. defaultToken: "string.quoted.single.nasal"
  202. }],
  203. comment: "Single quoted strings"
  204. }, {
  205. token: "punctuation.definition.string.begin.nasal",
  206. regex: /"/,
  207. push: [{
  208. token: "punctuation.definition.string.end.nasal",
  209. regex: /"/,
  210. next: "pop"
  211. }, {
  212. token: "constant.character.escape.nasal",
  213. regex: /\\(?:x[\da-fA-F]{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|r|n|t|\\|")/
  214. }, {
  215. token: "constant.character.escape.nasal",
  216. regex: /%(?:%|(?:\d+\$)?[+-]?(?:[ 0]|'.{1})?-?\d*(?:\.\d+)?[bcdeEufFgGosxX])/
  217. }, {
  218. defaultToken: "string.quoted.double.nasal"
  219. }],
  220. comment: "Double quoted strings"
  221. }, {
  222. token: [
  223. "punctuation.definition.string.begin.nasal",
  224. "string.other",
  225. "punctuation.definition.string.end.nasal"
  226. ],
  227. regex: /(`)(.)(`)/,
  228. comment: "Single-byte ASCII character constants"
  229. }, {
  230. token: [
  231. "punctuation.definition.comment.nasal",
  232. "comment.line.hash.nasal"
  233. ],
  234. regex: /(#)(.*$)/,
  235. comment: "Comments"
  236. }, {
  237. token: "constant.numeric.nasal",
  238. regex: /(?:(?:\b[0-9]+)?\.)?\b[0-9]+(?:[eE][-+]?[0-9]+)?\b/,
  239. comment: "Integers, floats, and scientific format"
  240. }, {
  241. token: "constant.numeric.nasal",
  242. regex: /0[x|X][0-9a-fA-F]+/,
  243. comment: "Hex codes"
  244. }, {
  245. token: "punctuation.terminator.statement.nasal",
  246. regex: /\;/
  247. }, {
  248. token: [
  249. "punctuation.section.scope.begin.nasal",
  250. "punctuation.section.scope.end.nasal"
  251. ],
  252. regex: /(\[)(\])/
  253. }, {
  254. todo: {
  255. token: "punctuation.section.scope.begin.nasal",
  256. regex: /\{/,
  257. push: [{
  258. token: "punctuation.section.scope.end.nasal",
  259. regex: /\}/,
  260. next: "pop"
  261. }, {
  262. include: "$self"
  263. }]
  264. }
  265. }, {
  266. todo: {
  267. token: "punctuation.section.scope.begin.nasal",
  268. regex: /\(/,
  269. push: [{
  270. token: "punctuation.section.scope.end.nasal",
  271. regex: /\)/,
  272. next: "pop"
  273. }, {
  274. include: "$self"
  275. }]
  276. }
  277. }, {
  278. token: "invalid.illegal",
  279. regex: /%|\$|@|&|\^|\||\\|`/,
  280. comment: "Illegal characters"
  281. }, {
  282. todo: {
  283. comment: "TODO: Symbols in hash keys"
  284. },
  285. comment: "TODO: Symbols in hash keys"
  286. }, {
  287. token: "variable.language.nasal",
  288. regex: /\b(?:append|bind|call|caller|chr|closure|cmp|compile|contains|delete|die|find|ghosttype|id|int|keys|left|num|pop|right|setsize|size|sort|split|sprintf|streq|substr|subvec|typeof|readline)\b/,
  289. comment: "Core functions"
  290. }, {
  291. token: "variable.language.nasal",
  292. regex: /\b(?:abort|abs|aircraftToCart|addcommand|airportinfo|airwaysRoute|assert|carttogeod|cmdarg|courseAndDistance|createDiscontinuity|createViaTo|createWP|createWPFrom|defined|directory|fgcommand|findAirportsByICAO|findAirportsWithinRange|findFixesByID|findNavaidByFrequency|findNavaidsByFrequency|findNavaidsByID|findNavaidsWithinRange|finddata|flightplan|geodinfo|geodtocart|get_cart_ground_intersection|getprop|greatCircleMove|interpolate|isa|logprint|magvar|maketimer|start|stop|restart|maketimestamp|md5|navinfo|parse_markdown|parsexml|print|printf|printlog|rand|registerFlightPlanDelegate|removecommand|removelistener|resolvepath|setlistener|_setlistener|setprop|srand|systime|thisfunc|tileIndex|tilePath|values)\b/,
  293. comment: "FG ext core functions"
  294. }, {
  295. token: "variable.language.nasal",
  296. regex: /\b(?:singleShot|isRunning|simulatedTime)\b/,
  297. comment: "FG ext core functions"
  298. }, {
  299. token: "constant.language.nasal",
  300. regex: /\b(?:D2R|FPS2KT|FT2M|GAL2L|IN2M|KG2LB|KT2FPS|KT2MPS|LG2GAL|LB2KG|M2FT|M2IN|M2NM|MPS2KT|NM2M|R2D)\b/,
  301. comment: "FG ext core constants"
  302. }, {
  303. token: "support.function.nasal",
  304. regex: /\b(?:addChild|addChildren|alias|clearValue|equals|getAliasTarget|getAttribute|getBoolValue|getChild|getChildren|getIndex|getName|getNode|getParent|getPath|getType|getValue|getValues|initNode|remove|removeAllChildren|removeChild|removeChildren|setAttribute|setBoolValue|setDoubleValue|setIntValue|setValue|setValues|unalias|compileCondition|condition|copy|dump|getNode|nodeList|runBinding|setAll|wrap|wrapNode)\b/,
  305. comment: "FG func props"
  306. }, {
  307. token: "support.class.nasal",
  308. regex: /\bNode\b/,
  309. comment: "FG node class"
  310. }, {
  311. token: "variable.language.nasal",
  312. regex: /\b(?:props|globals)\b/,
  313. comment: "FG func props variables"
  314. }, {
  315. todo: {
  316. token: [
  317. "support.function.nasal",
  318. "punctuation.definition.arguments.begin.nasal"
  319. ],
  320. regex: /\b([a-zA-Z_?$][\w?$]*)(\()/,
  321. push: [{
  322. token: "punctuation.definition.arguments.end.nasal",
  323. regex: /\)/,
  324. next: "pop"
  325. }, {
  326. include: "$self"
  327. }, {
  328. defaultToken: "meta.function-call.nasal"
  329. }]
  330. },
  331. comment: "function call"
  332. }]
  333. };
  334. this.normalizeRules();
  335. };
  336. NasalHighlightRules.metaData = {
  337. fileTypes: ["nas"],
  338. name: "Nasal",
  339. scopeName: "source.nasal"
  340. };
  341. oop.inherits(NasalHighlightRules, TextHighlightRules);
  342. exports.NasalHighlightRules = NasalHighlightRules;
  343. });
  344. ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module){"use strict";
  345. var oop = require("../../lib/oop");
  346. var Range = require("../../range").Range;
  347. var BaseFoldMode = require("./fold_mode").FoldMode;
  348. var FoldMode = exports.FoldMode = function (commentRegex) {
  349. if (commentRegex) {
  350. this.foldingStartMarker = new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start));
  351. this.foldingStopMarker = new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end));
  352. }
  353. };
  354. oop.inherits(FoldMode, BaseFoldMode);
  355. (function () {
  356. this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/;
  357. this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/;
  358. this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/;
  359. this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
  360. this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/;
  361. this._getFoldWidgetBase = this.getFoldWidget;
  362. this.getFoldWidget = function (session, foldStyle, row) {
  363. var line = session.getLine(row);
  364. if (this.singleLineBlockCommentRe.test(line)) {
  365. if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))
  366. return "";
  367. }
  368. var fw = this._getFoldWidgetBase(session, foldStyle, row);
  369. if (!fw && this.startRegionRe.test(line))
  370. return "start"; // lineCommentRegionStart
  371. return fw;
  372. };
  373. this.getFoldWidgetRange = function (session, foldStyle, row, forceMultiline) {
  374. var line = session.getLine(row);
  375. if (this.startRegionRe.test(line))
  376. return this.getCommentRegionBlock(session, line, row);
  377. var match = line.match(this.foldingStartMarker);
  378. if (match) {
  379. var i = match.index;
  380. if (match[1])
  381. return this.openingBracketBlock(session, match[1], row, i);
  382. var range = session.getCommentFoldRange(row, i + match[0].length, 1);
  383. if (range && !range.isMultiLine()) {
  384. if (forceMultiline) {
  385. range = this.getSectionRange(session, row);
  386. }
  387. else if (foldStyle != "all")
  388. range = null;
  389. }
  390. return range;
  391. }
  392. if (foldStyle === "markbegin")
  393. return;
  394. var match = line.match(this.foldingStopMarker);
  395. if (match) {
  396. var i = match.index + match[0].length;
  397. if (match[1])
  398. return this.closingBracketBlock(session, match[1], row, i);
  399. return session.getCommentFoldRange(row, i, -1);
  400. }
  401. };
  402. this.getSectionRange = function (session, row) {
  403. var line = session.getLine(row);
  404. var startIndent = line.search(/\S/);
  405. var startRow = row;
  406. var startColumn = line.length;
  407. row = row + 1;
  408. var endRow = row;
  409. var maxRow = session.getLength();
  410. while (++row < maxRow) {
  411. line = session.getLine(row);
  412. var indent = line.search(/\S/);
  413. if (indent === -1)
  414. continue;
  415. if (startIndent > indent)
  416. break;
  417. var subRange = this.getFoldWidgetRange(session, "all", row);
  418. if (subRange) {
  419. if (subRange.start.row <= startRow) {
  420. break;
  421. }
  422. else if (subRange.isMultiLine()) {
  423. row = subRange.end.row;
  424. }
  425. else if (startIndent == indent) {
  426. break;
  427. }
  428. }
  429. endRow = row;
  430. }
  431. return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
  432. };
  433. this.getCommentRegionBlock = function (session, line, row) {
  434. var startColumn = line.search(/\s*$/);
  435. var maxRow = session.getLength();
  436. var startRow = row;
  437. var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/;
  438. var depth = 1;
  439. while (++row < maxRow) {
  440. line = session.getLine(row);
  441. var m = re.exec(line);
  442. if (!m)
  443. continue;
  444. if (m[1])
  445. depth--;
  446. else
  447. depth++;
  448. if (!depth)
  449. break;
  450. }
  451. var endRow = row;
  452. if (endRow > startRow) {
  453. return new Range(startRow, startColumn, endRow, line.length);
  454. }
  455. };
  456. }).call(FoldMode.prototype);
  457. });
  458. ace.define("ace/mode/nasal",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/nasal_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module){/* ***** BEGIN LICENSE BLOCK *****
  459. * Distributed under the BSD license:
  460. *
  461. * Copyright (c) 2012, Ajax.org B.V.
  462. * All rights reserved.
  463. *
  464. * Redistribution and use in source and binary forms, with or without
  465. * modification, are permitted provided that the following conditions are met:
  466. * * Redistributions of source code must retain the above copyright
  467. * notice, this list of conditions and the following disclaimer.
  468. * * Redistributions in binary form must reproduce the above copyright
  469. * notice, this list of conditions and the following disclaimer in the
  470. * documentation and/or other materials provided with the distribution.
  471. * * Neither the name of Ajax.org B.V. nor the
  472. * names of its contributors may be used to endorse or promote products
  473. * derived from this software without specific prior written permission.
  474. *
  475. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  476. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  477. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  478. * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
  479. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  480. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  481. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  482. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  483. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  484. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  485. *
  486. * ***** END LICENSE BLOCK ***** */
  487. "use strict";
  488. var oop = require("../lib/oop");
  489. var TextMode = require("./text").Mode;
  490. var NasalHighlightRules = require("./nasal_highlight_rules").NasalHighlightRules;
  491. var FoldMode = require("./folding/cstyle").FoldMode;
  492. var Mode = function () {
  493. this.HighlightRules = NasalHighlightRules;
  494. this.foldingRules = new FoldMode();
  495. };
  496. oop.inherits(Mode, TextMode);
  497. (function () {
  498. this.$id = "ace/mode/nasal";
  499. }).call(Mode.prototype);
  500. exports.Mode = Mode;
  501. }); (function() {
  502. ace.require(["ace/mode/nasal"], function(m) {
  503. if (typeof module == "object" && typeof exports == "object" && module) {
  504. module.exports = m;
  505. }
  506. });
  507. })();