mihari 5.4.6 → 5.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +2 -0
  4. data/docs/analyzers/index.md +5 -0
  5. data/docs/emitters/misp.md +1 -1
  6. data/docs/requirements.md +8 -15
  7. data/frontend/package-lock.json +258 -249
  8. data/frontend/package.json +12 -12
  9. data/lib/mihari/analyzers/base.rb +8 -1
  10. data/lib/mihari/analyzers/binaryedge.rb +1 -1
  11. data/lib/mihari/analyzers/censys.rb +1 -1
  12. data/lib/mihari/analyzers/feed.rb +1 -0
  13. data/lib/mihari/analyzers/greynoise.rb +1 -1
  14. data/lib/mihari/analyzers/hunterhow.rb +1 -1
  15. data/lib/mihari/analyzers/onyphe.rb +1 -1
  16. data/lib/mihari/analyzers/shodan.rb +1 -1
  17. data/lib/mihari/analyzers/urlscan.rb +1 -1
  18. data/lib/mihari/analyzers/virustotal_intelligence.rb +1 -1
  19. data/lib/mihari/analyzers/zoomeye.rb +1 -1
  20. data/lib/mihari/clients/base.rb +18 -5
  21. data/lib/mihari/clients/binaryedge.rb +4 -3
  22. data/lib/mihari/clients/censys.rb +3 -2
  23. data/lib/mihari/clients/greynoise.rb +3 -2
  24. data/lib/mihari/clients/hunterhow.rb +3 -2
  25. data/lib/mihari/clients/onyphe.rb +4 -2
  26. data/lib/mihari/clients/shodan.rb +3 -2
  27. data/lib/mihari/clients/urlscan.rb +3 -2
  28. data/lib/mihari/clients/virustotal.rb +3 -2
  29. data/lib/mihari/clients/zoomeye.rb +3 -2
  30. data/lib/mihari/config.rb +13 -0
  31. data/lib/mihari/database.rb +2 -2
  32. data/lib/mihari/emitters/webhook.rb +11 -11
  33. data/lib/mihari/enrichers/google_public_dns.rb +7 -1
  34. data/lib/mihari/enrichers/ipinfo.rb +13 -6
  35. data/lib/mihari/enrichers/shodan.rb +7 -1
  36. data/lib/mihari/errors.rb +0 -2
  37. data/lib/mihari/feed/reader.rb +15 -10
  38. data/lib/mihari/http.rb +26 -100
  39. data/lib/mihari/schemas/analyzer.rb +1 -0
  40. data/lib/mihari/version.rb +1 -1
  41. data/lib/mihari/web/public/assets/{index-0a5a47bf.js → index-a92abd57.js} +1 -1
  42. data/lib/mihari/web/public/index.html +1 -1
  43. data/lib/mihari/web/public/redoc-static.html +400 -400
  44. data/mihari.gemspec +8 -5
  45. data/requirements.txt +1 -1
  46. metadata +57 -15
data/lib/mihari/http.rb CHANGED
@@ -1,115 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "insensitive_hash"
3
+ require "http"
4
4
 
5
5
  module Mihari
6
- class HTTP
7
- # @return [URI]
8
- attr_reader :url
9
-
10
- # @return [Hash]
11
- attr_reader :headers
12
-
13
- def initialize(url, headers: {})
14
- @url = url.is_a?(URI) ? url : URI(url.to_s)
15
- @headers = headers.insensitive
16
- end
17
-
18
- #
19
- # Make a GET request
20
- #
21
- # @param [Hash, nil] params
22
- #
23
- # @return [Net::HTTPResponse]
24
- #
25
- def get(params: nil)
26
- new_url = url.deep_dup
27
- new_url.query = Addressable::URI.form_encode(params) unless (params || {}).empty?
28
-
29
- get = Net::HTTP::Get.new(new_url, headers)
30
- request get
31
- end
32
-
33
- #
34
- # Make a POST request
35
- #
36
- # @param [Hash, nil] params
37
- # @param [Hash, nil] json
38
- # @param [Hash, nil] data
39
- #
40
- # @return [Net::HTTPResponse]
41
- #
42
- def post(params: nil, json: nil, data: nil)
43
- new_url = url.deep_dup
44
- new_url.query = Addressable::URI.form_encode(params) unless (params || {}).empty?
45
-
46
- post = Net::HTTP::Post.new(new_url, headers)
47
-
48
- if json
49
- post.body = JSON.generate(json) if json
50
- post.content_type = "application/json"
51
- end
52
-
53
- if data
54
- post.set_form_data(data) if data
55
- post.content_type = "application/x-www-form-urlencoded"
56
- end
57
-
58
- request post
59
- end
60
-
61
- class << self
62
- def get(url, headers: {}, params: nil)
63
- client = new(url, headers: headers)
64
- client.get(params: params)
6
+ module HTTP
7
+ class BetterError < ::HTTP::Feature
8
+ def wrap_response(response)
9
+ unless response.status.success?
10
+ raise StatusCodeError.new(
11
+ "Unsuccessful response code returned: #{response.code}",
12
+ response.code,
13
+ response.body.to_s
14
+ )
15
+ end
16
+ response
65
17
  end
66
18
 
67
- def post(url, headers: {}, params: nil, json: nil, data: nil)
68
- client = new(url, headers: headers)
69
- client.post(params: params, json: json, data: data)
19
+ def on_error(_request, error)
20
+ raise TimeoutError, error if error.is_a?(::HTTP::TimeoutError)
21
+ raise NetworkError, error if error.is_a?(::HTTP::Error)
70
22
  end
71
- end
72
23
 
73
- private
74
-
75
- #
76
- # Get options for HTTP request
77
- #
78
- # @return [Hahs]
79
- #
80
- def https_options
81
- return { use_ssl: true } if url.scheme == "https"
82
-
83
- {}
24
+ ::HTTP::Options.register_feature(:better_error, self)
84
25
  end
85
26
 
86
- #
87
- # Make a HTTP request
88
- #
89
- # @param [Net::HTTPRequest] req
90
- #
91
- # @return [Net::HTTPResponse]
92
- #
93
- def request(req)
94
- Net::HTTP.start(url.host, url.port, https_options) do |http|
95
- res = http.request(req)
96
-
97
- unless res.is_a?(Net::HTTPSuccess)
98
- raise StatusCodeError.new(
99
- "Unsuccessful response code returned: #{res.code}",
100
- res.code.to_i,
101
- res.body
102
- )
27
+ class Factory
28
+ class << self
29
+ #
30
+ # @param [Integer, nil] timeout
31
+ # @param [Hash] headers
32
+ #
33
+ # @return [::HTTP::Client]
34
+ #
35
+ def build(headers: {}, timeout: nil)
36
+ ::HTTP.use(:better_error).headers(headers).timeout(timeout || {})
103
37
  end
104
-
105
- res
106
38
  end
107
- rescue Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, EOFError, SocketError, Net::ProtocolError => e
108
- raise NetworkError, e
109
- rescue Timeout::Error => e
110
- raise TimeoutError, e
111
- rescue OpenSSL::SSL::SSLError => e
112
- raise SSLError, e
113
39
  end
114
40
  end
115
41
  end
@@ -8,6 +8,7 @@ module Mihari
8
8
  optional(:retry_times).value(:integer).default(Mihari.config.retry_times)
9
9
  optional(:retry_interval).value(:integer).default(Mihari.config.retry_interval)
10
10
  optional(:ignore_error).value(:bool).default(Mihari.config.ignore_error)
11
+ optional(:timeout).value(:integer)
11
12
  end
12
13
 
13
14
  AnalyzerWithoutAPIKey = Dry::Schema.Params do
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mihari
4
- VERSION = "5.4.6"
4
+ VERSION = "5.4.8"
5
5
  end
@@ -940,7 +940,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
940
940
  .ace-tm .ace_indent-guide-active {
941
941
  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;
942
942
  }
943
- `}),ace.define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"],function(n,i,p){i.isDark=!1,i.cssClass="ace-tm",i.cssText=n("./textmate-css"),i.$id="ace/theme/textmate";var u=n("../lib/dom");u.importCssString(i.cssText,i.cssClass,!1)}),ace.define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/net","ace/lib/dom","ace/lib/app_config","ace/theme/textmate"],function(n,i,p){"no use strict";var u=n("./lib/lang"),f=n("./lib/net"),g=n("./lib/dom"),s=n("./lib/app_config").AppConfig;p.exports=i=new s;var h={packaged:!1,workerPath:null,modePath:null,themePath:null,basePath:"",suffix:".js",$moduleUrls:{},loadWorkerFromBlob:!0,sharedPopups:!1,useStrictCSP:null};i.get=function(c){if(!h.hasOwnProperty(c))throw new Error("Unknown config key: "+c);return h[c]},i.set=function(c,a){if(h.hasOwnProperty(c))h[c]=a;else if(this.setDefaultValue("",c,a)==!1)throw new Error("Unknown config key: "+c);c=="useStrictCSP"&&g.useStrictCSP(a)},i.all=function(){return u.copyObject(h)},i.$modes={},i.moduleUrl=function(c,a){if(h.$moduleUrls[c])return h.$moduleUrls[c];var d=c.split("/");a=a||d[d.length-2]||"";var m=a=="snippets"?"/":"-",y=d[d.length-1];if(a=="worker"&&m=="-"){var b=new RegExp("^"+a+"[\\-_]|[\\-_]"+a+"$","g");y=y.replace(b,"")}(!y||y==a)&&d.length>1&&(y=d[d.length-2]);var E=h[a+"Path"];return E==null?E=h.basePath:m=="/"&&(a=m=""),E&&E.slice(-1)!="/"&&(E+="/"),E+a+m+y+this.get("suffix")},i.setModuleUrl=function(c,a){return h.$moduleUrls[c]=a};var o=function(c,a){if(c==="ace/theme/textmate"||c==="./theme/textmate")return a(null,n("./theme/textmate"));if(r)return r(c,a);console.error("loader is not configured")},r;i.setLoader=function(c){r=c},i.dynamicModules=Object.create(null),i.$loading={},i.$loaded={},i.loadModule=function(c,a){var d,m;Array.isArray(c)&&(m=c[0],c=c[1]);var y=function(b){if(b&&!i.$loading[c])return a&&a(b);if(i.$loading[c]||(i.$loading[c]=[]),i.$loading[c].push(a),!(i.$loading[c].length>1)){var E=function(){o(c,function(S,C){C&&(i.$loaded[c]=C),i._emit("load.module",{name:c,module:C});var $=i.$loading[c];i.$loading[c]=null,$.forEach(function(R){R&&R(C)})})};if(!i.get("packaged"))return E();f.loadScript(i.moduleUrl(c,m),E),l()}};if(i.dynamicModules[c])i.dynamicModules[c]().then(function(b){b.default?y(b.default):y(b)});else{try{d=this.$require(c)}catch{}y(d||i.$loaded[c])}},i.$require=function(c){if(typeof p.require=="function"){var a="require";return p[a](c)}},i.setModuleLoader=function(c,a){i.dynamicModules[c]=a};var l=function(){!h.basePath&&!h.workerPath&&!h.modePath&&!h.themePath&&!Object.keys(h.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),l=function(){})};i.version="1.28.0"}),ace.define("ace/loader_build",["require","exports","module","ace/lib/fixoldbrowsers","ace/config"],function(n,i,p){n("./lib/fixoldbrowsers");var u=n("./config");u.setLoader(function(h,o){n([h],function(r){o(null,r)})});var f=function(){return this||typeof window<"u"&&window}();p.exports=function(h){u.init=g,u.$require=n,h.require=n},g(!0);function g(h){if(!(!f||!f.document)){u.set("packaged",h||n.packaged||p.packaged||f.define&&(void 0).packaged);var o={},r="",l=document.currentScript||document._currentScript,c=l&&l.ownerDocument||document;l&&l.src&&(r=l.src.split(/[?#]/)[0].split("/").slice(0,-1).join("/")||"");for(var a=c.getElementsByTagName("script"),d=0;d<a.length;d++){var m=a[d],y=m.src||m.getAttribute("src");if(y){for(var b=m.attributes,E=0,S=b.length;E<S;E++){var C=b[E];C.name.indexOf("data-ace-")===0&&(o[s(C.name.replace(/^data-ace-/,""))]=C.value)}var $=y.match(/^(.*)\/ace([\-.]\w+)?\.js(\?|$)/);$&&(r=$[1])}}r&&(o.base=o.base||r,o.packaged=!0),o.basePath=o.base,o.workerPath=o.workerPath||o.base,o.modePath=o.modePath||o.base,o.themePath=o.themePath||o.base,delete o.base;for(var R in o)typeof o[R]<"u"&&u.set(R,o[R])}}function s(h){return h.replace(/-(.)/g,function(o,r){return r.toUpperCase()})}}),ace.define("ace/range",["require","exports","module"],function(n,i,p){var u=function(g,s){return g.row-s.row||g.column-s.column},f=function(){function g(s,h,o,r){this.start={row:s,column:h},this.end={row:o,column:r}}return g.prototype.isEqual=function(s){return this.start.row===s.start.row&&this.end.row===s.end.row&&this.start.column===s.start.column&&this.end.column===s.end.column},g.prototype.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},g.prototype.contains=function(s,h){return this.compare(s,h)==0},g.prototype.compareRange=function(s){var h,o=s.end,r=s.start;return h=this.compare(o.row,o.column),h==1?(h=this.compare(r.row,r.column),h==1?2:h==0?1:0):h==-1?-2:(h=this.compare(r.row,r.column),h==-1?-1:h==1?42:0)},g.prototype.comparePoint=function(s){return this.compare(s.row,s.column)},g.prototype.containsRange=function(s){return this.comparePoint(s.start)==0&&this.comparePoint(s.end)==0},g.prototype.intersects=function(s){var h=this.compareRange(s);return h==-1||h==0||h==1},g.prototype.isEnd=function(s,h){return this.end.row==s&&this.end.column==h},g.prototype.isStart=function(s,h){return this.start.row==s&&this.start.column==h},g.prototype.setStart=function(s,h){typeof s=="object"?(this.start.column=s.column,this.start.row=s.row):(this.start.row=s,this.start.column=h)},g.prototype.setEnd=function(s,h){typeof s=="object"?(this.end.column=s.column,this.end.row=s.row):(this.end.row=s,this.end.column=h)},g.prototype.inside=function(s,h){return this.compare(s,h)==0?!(this.isEnd(s,h)||this.isStart(s,h)):!1},g.prototype.insideStart=function(s,h){return this.compare(s,h)==0?!this.isEnd(s,h):!1},g.prototype.insideEnd=function(s,h){return this.compare(s,h)==0?!this.isStart(s,h):!1},g.prototype.compare=function(s,h){return!this.isMultiLine()&&s===this.start.row?h<this.start.column?-1:h>this.end.column?1:0:s<this.start.row?-1:s>this.end.row?1:this.start.row===s?h>=this.start.column?0:-1:this.end.row===s?h<=this.end.column?0:1:0},g.prototype.compareStart=function(s,h){return this.start.row==s&&this.start.column==h?-1:this.compare(s,h)},g.prototype.compareEnd=function(s,h){return this.end.row==s&&this.end.column==h?1:this.compare(s,h)},g.prototype.compareInside=function(s,h){return this.end.row==s&&this.end.column==h?1:this.start.row==s&&this.start.column==h?-1:this.compare(s,h)},g.prototype.clipRows=function(s,h){if(this.end.row>h)var o={row:h+1,column:0};else if(this.end.row<s)var o={row:s,column:0};if(this.start.row>h)var r={row:h+1,column:0};else if(this.start.row<s)var r={row:s,column:0};return g.fromPoints(r||this.start,o||this.end)},g.prototype.extend=function(s,h){var o=this.compare(s,h);if(o==0)return this;if(o==-1)var r={row:s,column:h};else var l={row:s,column:h};return g.fromPoints(r||this.start,l||this.end)},g.prototype.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},g.prototype.isMultiLine=function(){return this.start.row!==this.end.row},g.prototype.clone=function(){return g.fromPoints(this.start,this.end)},g.prototype.collapseRows=function(){return this.end.column==0?new g(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new g(this.start.row,0,this.end.row,0)},g.prototype.toScreenRange=function(s){var h=s.documentToScreenPosition(this.start),o=s.documentToScreenPosition(this.end);return new g(h.row,h.column,o.row,o.column)},g.prototype.moveBy=function(s,h){this.start.row+=s,this.start.column+=h,this.end.row+=s,this.end.column+=h},g}();f.fromPoints=function(g,s){return new f(g.row,g.column,s.row,s.column)},f.comparePoints=u,f.comparePoints=function(g,s){return g.row-s.row||g.column-s.column},i.Range=f}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(n,i,p){/*! @license
943
+ `}),ace.define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"],function(n,i,p){i.isDark=!1,i.cssClass="ace-tm",i.cssText=n("./textmate-css"),i.$id="ace/theme/textmate";var u=n("../lib/dom");u.importCssString(i.cssText,i.cssClass,!1)}),ace.define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/net","ace/lib/dom","ace/lib/app_config","ace/theme/textmate"],function(n,i,p){"no use strict";var u=n("./lib/lang"),f=n("./lib/net"),g=n("./lib/dom"),s=n("./lib/app_config").AppConfig;p.exports=i=new s;var h={packaged:!1,workerPath:null,modePath:null,themePath:null,basePath:"",suffix:".js",$moduleUrls:{},loadWorkerFromBlob:!0,sharedPopups:!1,useStrictCSP:null};i.get=function(c){if(!h.hasOwnProperty(c))throw new Error("Unknown config key: "+c);return h[c]},i.set=function(c,a){if(h.hasOwnProperty(c))h[c]=a;else if(this.setDefaultValue("",c,a)==!1)throw new Error("Unknown config key: "+c);c=="useStrictCSP"&&g.useStrictCSP(a)},i.all=function(){return u.copyObject(h)},i.$modes={},i.moduleUrl=function(c,a){if(h.$moduleUrls[c])return h.$moduleUrls[c];var d=c.split("/");a=a||d[d.length-2]||"";var m=a=="snippets"?"/":"-",y=d[d.length-1];if(a=="worker"&&m=="-"){var b=new RegExp("^"+a+"[\\-_]|[\\-_]"+a+"$","g");y=y.replace(b,"")}(!y||y==a)&&d.length>1&&(y=d[d.length-2]);var E=h[a+"Path"];return E==null?E=h.basePath:m=="/"&&(a=m=""),E&&E.slice(-1)!="/"&&(E+="/"),E+a+m+y+this.get("suffix")},i.setModuleUrl=function(c,a){return h.$moduleUrls[c]=a};var o=function(c,a){if(c==="ace/theme/textmate"||c==="./theme/textmate")return a(null,n("./theme/textmate"));if(r)return r(c,a);console.error("loader is not configured")},r;i.setLoader=function(c){r=c},i.dynamicModules=Object.create(null),i.$loading={},i.$loaded={},i.loadModule=function(c,a){var d,m;Array.isArray(c)&&(m=c[0],c=c[1]);var y=function(b){if(b&&!i.$loading[c])return a&&a(b);if(i.$loading[c]||(i.$loading[c]=[]),i.$loading[c].push(a),!(i.$loading[c].length>1)){var E=function(){o(c,function(S,C){C&&(i.$loaded[c]=C),i._emit("load.module",{name:c,module:C});var $=i.$loading[c];i.$loading[c]=null,$.forEach(function(R){R&&R(C)})})};if(!i.get("packaged"))return E();f.loadScript(i.moduleUrl(c,m),E),l()}};if(i.dynamicModules[c])i.dynamicModules[c]().then(function(b){b.default?y(b.default):y(b)});else{try{d=this.$require(c)}catch{}y(d||i.$loaded[c])}},i.$require=function(c){if(typeof p.require=="function"){var a="require";return p[a](c)}},i.setModuleLoader=function(c,a){i.dynamicModules[c]=a};var l=function(){!h.basePath&&!h.workerPath&&!h.modePath&&!h.themePath&&!Object.keys(h.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),l=function(){})};i.version="1.29.0"}),ace.define("ace/loader_build",["require","exports","module","ace/lib/fixoldbrowsers","ace/config"],function(n,i,p){n("./lib/fixoldbrowsers");var u=n("./config");u.setLoader(function(h,o){n([h],function(r){o(null,r)})});var f=function(){return this||typeof window<"u"&&window}();p.exports=function(h){u.init=g,u.$require=n,h.require=n},g(!0);function g(h){if(!(!f||!f.document)){u.set("packaged",h||n.packaged||p.packaged||f.define&&(void 0).packaged);var o={},r="",l=document.currentScript||document._currentScript,c=l&&l.ownerDocument||document;l&&l.src&&(r=l.src.split(/[?#]/)[0].split("/").slice(0,-1).join("/")||"");for(var a=c.getElementsByTagName("script"),d=0;d<a.length;d++){var m=a[d],y=m.src||m.getAttribute("src");if(y){for(var b=m.attributes,E=0,S=b.length;E<S;E++){var C=b[E];C.name.indexOf("data-ace-")===0&&(o[s(C.name.replace(/^data-ace-/,""))]=C.value)}var $=y.match(/^(.*)\/ace([\-.]\w+)?\.js(\?|$)/);$&&(r=$[1])}}r&&(o.base=o.base||r,o.packaged=!0),o.basePath=o.base,o.workerPath=o.workerPath||o.base,o.modePath=o.modePath||o.base,o.themePath=o.themePath||o.base,delete o.base;for(var R in o)typeof o[R]<"u"&&u.set(R,o[R])}}function s(h){return h.replace(/-(.)/g,function(o,r){return r.toUpperCase()})}}),ace.define("ace/range",["require","exports","module"],function(n,i,p){var u=function(g,s){return g.row-s.row||g.column-s.column},f=function(){function g(s,h,o,r){this.start={row:s,column:h},this.end={row:o,column:r}}return g.prototype.isEqual=function(s){return this.start.row===s.start.row&&this.end.row===s.end.row&&this.start.column===s.start.column&&this.end.column===s.end.column},g.prototype.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},g.prototype.contains=function(s,h){return this.compare(s,h)==0},g.prototype.compareRange=function(s){var h,o=s.end,r=s.start;return h=this.compare(o.row,o.column),h==1?(h=this.compare(r.row,r.column),h==1?2:h==0?1:0):h==-1?-2:(h=this.compare(r.row,r.column),h==-1?-1:h==1?42:0)},g.prototype.comparePoint=function(s){return this.compare(s.row,s.column)},g.prototype.containsRange=function(s){return this.comparePoint(s.start)==0&&this.comparePoint(s.end)==0},g.prototype.intersects=function(s){var h=this.compareRange(s);return h==-1||h==0||h==1},g.prototype.isEnd=function(s,h){return this.end.row==s&&this.end.column==h},g.prototype.isStart=function(s,h){return this.start.row==s&&this.start.column==h},g.prototype.setStart=function(s,h){typeof s=="object"?(this.start.column=s.column,this.start.row=s.row):(this.start.row=s,this.start.column=h)},g.prototype.setEnd=function(s,h){typeof s=="object"?(this.end.column=s.column,this.end.row=s.row):(this.end.row=s,this.end.column=h)},g.prototype.inside=function(s,h){return this.compare(s,h)==0?!(this.isEnd(s,h)||this.isStart(s,h)):!1},g.prototype.insideStart=function(s,h){return this.compare(s,h)==0?!this.isEnd(s,h):!1},g.prototype.insideEnd=function(s,h){return this.compare(s,h)==0?!this.isStart(s,h):!1},g.prototype.compare=function(s,h){return!this.isMultiLine()&&s===this.start.row?h<this.start.column?-1:h>this.end.column?1:0:s<this.start.row?-1:s>this.end.row?1:this.start.row===s?h>=this.start.column?0:-1:this.end.row===s?h<=this.end.column?0:1:0},g.prototype.compareStart=function(s,h){return this.start.row==s&&this.start.column==h?-1:this.compare(s,h)},g.prototype.compareEnd=function(s,h){return this.end.row==s&&this.end.column==h?1:this.compare(s,h)},g.prototype.compareInside=function(s,h){return this.end.row==s&&this.end.column==h?1:this.start.row==s&&this.start.column==h?-1:this.compare(s,h)},g.prototype.clipRows=function(s,h){if(this.end.row>h)var o={row:h+1,column:0};else if(this.end.row<s)var o={row:s,column:0};if(this.start.row>h)var r={row:h+1,column:0};else if(this.start.row<s)var r={row:s,column:0};return g.fromPoints(r||this.start,o||this.end)},g.prototype.extend=function(s,h){var o=this.compare(s,h);if(o==0)return this;if(o==-1)var r={row:s,column:h};else var l={row:s,column:h};return g.fromPoints(r||this.start,l||this.end)},g.prototype.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},g.prototype.isMultiLine=function(){return this.start.row!==this.end.row},g.prototype.clone=function(){return g.fromPoints(this.start,this.end)},g.prototype.collapseRows=function(){return this.end.column==0?new g(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new g(this.start.row,0,this.end.row,0)},g.prototype.toScreenRange=function(s){var h=s.documentToScreenPosition(this.start),o=s.documentToScreenPosition(this.end);return new g(h.row,h.column,o.row,o.column)},g.prototype.moveBy=function(s,h){this.start.row+=s,this.start.column+=h,this.end.row+=s,this.end.column+=h},g}();f.fromPoints=function(g,s){return new f(g.row,g.column,s.row,s.column)},f.comparePoints=u,f.comparePoints=function(g,s){return g.row-s.row||g.column-s.column},i.Range=f}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(n,i,p){/*! @license
944
944
  ==========================================================================
945
945
  SproutCore -- JavaScript Application Framework
946
946
  copyright 2006-2009, Sprout Systems Inc., Apple Inc. and contributors.
@@ -6,7 +6,7 @@
6
6
  <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
7
  <link rel="icon" href="/favicon.ico" />
8
8
  <title>Mihari</title>
9
- <script type="module" crossorigin src="/assets/index-0a5a47bf.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-a92abd57.js"></script>
10
10
  <link rel="stylesheet" href="/assets/index-33165282.css">
11
11
  </head>
12
12
  <body>