hyper-pure-rb 0.0.1
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.
- checksums.yaml +7 -0
- data/better_errors-2.10.1/CHANGELOG.md +3 -0
- data/better_errors-2.10.1/Gemfile +11 -0
- data/better_errors-2.10.1/LICENSE +22 -0
- data/better_errors-2.10.1/README.md +163 -0
- data/better_errors-2.10.1/better_errors.gemspec +48 -0
- data/better_errors-2.10.1/gemfiles/pry010.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/pry011.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/pry09.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rack.gemfile +8 -0
- data/better_errors-2.10.1/gemfiles/rack_boc.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rails42.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/rails42_boc.gemfile +11 -0
- data/better_errors-2.10.1/gemfiles/rails42_haml.gemfile +11 -0
- data/better_errors-2.10.1/gemfiles/rails50.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rails50_boc.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/rails50_haml.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/rails51.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rails51_boc.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/rails51_haml.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/rails52.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rails52_boc.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/rails52_haml.gemfile +10 -0
- data/better_errors-2.10.1/gemfiles/rails60.gemfile +8 -0
- data/better_errors-2.10.1/gemfiles/rails60_boc.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rails60_haml.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rails61.gemfile +8 -0
- data/better_errors-2.10.1/gemfiles/rails61_boc.gemfile +9 -0
- data/better_errors-2.10.1/gemfiles/rails61_haml.gemfile +9 -0
- data/better_errors-2.10.1/lib/better_errors/code_formatter/html.rb +40 -0
- data/better_errors-2.10.1/lib/better_errors/code_formatter/text.rb +14 -0
- data/better_errors-2.10.1/lib/better_errors/code_formatter.rb +52 -0
- data/better_errors-2.10.1/lib/better_errors/editor.rb +103 -0
- data/better_errors-2.10.1/lib/better_errors/error_page.rb +169 -0
- data/better_errors-2.10.1/lib/better_errors/error_page_style.rb +43 -0
- data/better_errors-2.10.1/lib/better_errors/exception_extension.rb +17 -0
- data/better_errors-2.10.1/lib/better_errors/exception_hint.rb +29 -0
- data/better_errors-2.10.1/lib/better_errors/inspectable_value.rb +45 -0
- data/better_errors-2.10.1/lib/better_errors/middleware.rb +237 -0
- data/better_errors-2.10.1/lib/better_errors/rails.rb +28 -0
- data/better_errors-2.10.1/lib/better_errors/raised_exception.rb +89 -0
- data/better_errors-2.10.1/lib/better_errors/repl/basic.rb +20 -0
- data/better_errors-2.10.1/lib/better_errors/repl/pry.rb +88 -0
- data/better_errors-2.10.1/lib/better_errors/repl.rb +32 -0
- data/better_errors-2.10.1/lib/better_errors/stack_frame.rb +136 -0
- data/better_errors-2.10.1/lib/better_errors/templates/main.css +1 -0
- data/better_errors-2.10.1/lib/better_errors/templates/main.erb +431 -0
- data/better_errors-2.10.1/lib/better_errors/templates/text.erb +24 -0
- data/better_errors-2.10.1/lib/better_errors/templates/variable_info.erb +82 -0
- data/better_errors-2.10.1/lib/better_errors/version.rb +4 -0
- data/better_errors-2.10.1/lib/better_errors.rb +144 -0
- data/hyper-pure-rb.gemspec +11 -0
- metadata +91 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require 'better_errors/exception_hint'
|
|
2
|
+
|
|
3
|
+
# @private
|
|
4
|
+
module BetterErrors
|
|
5
|
+
class RaisedException
|
|
6
|
+
attr_reader :exception, :message, :backtrace, :hint
|
|
7
|
+
|
|
8
|
+
def initialize(exception)
|
|
9
|
+
if exception.class.name == "ActionView::Template::Error" && exception.respond_to?(:cause)
|
|
10
|
+
# Rails 6+ exceptions of this type wrap the "real" exception, and the real exception
|
|
11
|
+
# is actually more useful than the ActionView-provided wrapper. Once Better Errors
|
|
12
|
+
# supports showing all exceptions in the cause stack, this should go away. Or perhaps
|
|
13
|
+
# this can be changed to provide guidance by showing the second error in the cause stack
|
|
14
|
+
# under this condition.
|
|
15
|
+
exception = exception.cause if exception.cause
|
|
16
|
+
elsif exception.respond_to?(:original_exception) && exception.original_exception
|
|
17
|
+
# This supports some specific Rails exceptions, and this is not intended to act the same as
|
|
18
|
+
# the Ruby's {Exception#cause}.
|
|
19
|
+
# It's possible this should only support ActionView::Template::Error, but by not changing
|
|
20
|
+
# this we're preserving longstanding behavior of Better Errors with Rails < 6.
|
|
21
|
+
exception = exception.original_exception
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@exception = exception
|
|
25
|
+
@message = exception.message
|
|
26
|
+
|
|
27
|
+
setup_backtrace
|
|
28
|
+
setup_hint
|
|
29
|
+
massage_syntax_error
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def type
|
|
33
|
+
exception.class
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
def has_bindings?
|
|
38
|
+
exception.respond_to?(:__better_errors_bindings_stack) && exception.__better_errors_bindings_stack.any?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def setup_backtrace
|
|
42
|
+
if has_bindings?
|
|
43
|
+
setup_backtrace_from_bindings
|
|
44
|
+
else
|
|
45
|
+
setup_backtrace_from_backtrace
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def setup_backtrace_from_bindings
|
|
50
|
+
@backtrace = exception.__better_errors_bindings_stack.map { |binding|
|
|
51
|
+
if binding.respond_to?(:source_location) # Ruby >= 2.6
|
|
52
|
+
file = binding.source_location[0]
|
|
53
|
+
line = binding.source_location[1]
|
|
54
|
+
else
|
|
55
|
+
file = binding.eval "__FILE__"
|
|
56
|
+
line = binding.eval "__LINE__"
|
|
57
|
+
end
|
|
58
|
+
name = binding.frame_description
|
|
59
|
+
StackFrame.new(file, line, name, binding)
|
|
60
|
+
}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def setup_backtrace_from_backtrace
|
|
64
|
+
@backtrace = (exception.backtrace || []).map { |frame|
|
|
65
|
+
if /\A(?<file>.*?):(?<line>\d+)(:in `(?<name>.*)')?/ =~ frame
|
|
66
|
+
StackFrame.new(file, line.to_i, name)
|
|
67
|
+
end
|
|
68
|
+
}.compact
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def massage_syntax_error
|
|
72
|
+
case exception.class.to_s
|
|
73
|
+
when "Haml::SyntaxError", "Sprockets::Coffeelint::Error"
|
|
74
|
+
if /\A(.+?):(\d+)/ =~ exception.backtrace.first
|
|
75
|
+
backtrace.unshift(StackFrame.new($1, $2.to_i, ""))
|
|
76
|
+
end
|
|
77
|
+
when "SyntaxError"
|
|
78
|
+
if /\A(.+?):(\d+): (.*)/m =~ exception.message
|
|
79
|
+
backtrace.unshift(StackFrame.new($1, $2.to_i, ""))
|
|
80
|
+
@message = $3
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def setup_hint
|
|
86
|
+
@hint = ExceptionHint.new(exception).hint
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module BetterErrors
|
|
2
|
+
module REPL
|
|
3
|
+
class Basic
|
|
4
|
+
def initialize(binding, _exception)
|
|
5
|
+
@binding = binding
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def send_input(str)
|
|
9
|
+
[execute(str), ">>", ""]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
def execute(str)
|
|
14
|
+
"=> #{@binding.eval(str).inspect}\n"
|
|
15
|
+
rescue Exception => e
|
|
16
|
+
"!! #{e.inspect rescue e.class.to_s rescue "Exception"}\n"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require "fiber"
|
|
2
|
+
require "pry"
|
|
3
|
+
|
|
4
|
+
module BetterErrors
|
|
5
|
+
module REPL
|
|
6
|
+
class Pry
|
|
7
|
+
class Input
|
|
8
|
+
def readline
|
|
9
|
+
Fiber.yield
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class Output
|
|
14
|
+
def initialize
|
|
15
|
+
@buffer = ""
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def puts(*args)
|
|
19
|
+
args.each do |arg|
|
|
20
|
+
@buffer << "#{arg.chomp}\n"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def tty?
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def read_buffer
|
|
29
|
+
@buffer
|
|
30
|
+
ensure
|
|
31
|
+
@buffer = ""
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def print(*args)
|
|
35
|
+
@buffer << args.join(' ')
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def initialize(binding, exception)
|
|
40
|
+
@fiber = Fiber.new do
|
|
41
|
+
@pry.repl binding
|
|
42
|
+
end
|
|
43
|
+
@input = BetterErrors::REPL::Pry::Input.new
|
|
44
|
+
@output = BetterErrors::REPL::Pry::Output.new
|
|
45
|
+
@pry = ::Pry.new input: @input, output: @output
|
|
46
|
+
@pry.hooks.clear_all if defined?(@pry.hooks.clear_all)
|
|
47
|
+
store_last_exception exception
|
|
48
|
+
@fiber.resume
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def store_last_exception(exception)
|
|
52
|
+
return unless defined? ::Pry::LastException
|
|
53
|
+
@pry.instance_variable_set(:@last_exception, ::Pry::LastException.new(exception.exception))
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def send_input(str)
|
|
57
|
+
local ::Pry.config, color: false, pager: false do
|
|
58
|
+
@fiber.resume "#{str}\n"
|
|
59
|
+
[@output.read_buffer, *prompt]
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def prompt
|
|
64
|
+
if indent = @pry.instance_variable_get(:@indent) and !indent.indent_level.empty?
|
|
65
|
+
["..", indent.indent_level]
|
|
66
|
+
else
|
|
67
|
+
[">>", ""]
|
|
68
|
+
end
|
|
69
|
+
rescue
|
|
70
|
+
[">>", ""]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
def local(obj, attrs)
|
|
75
|
+
old_attrs = {}
|
|
76
|
+
attrs.each do |k, v|
|
|
77
|
+
old_attrs[k] = obj.send k
|
|
78
|
+
obj.send "#{k}=", v
|
|
79
|
+
end
|
|
80
|
+
yield
|
|
81
|
+
ensure
|
|
82
|
+
old_attrs.each do |k, v|
|
|
83
|
+
obj.send "#{k}=", v
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module BetterErrors
|
|
2
|
+
# @private
|
|
3
|
+
module REPL
|
|
4
|
+
PROVIDERS = [
|
|
5
|
+
{ impl: "better_errors/repl/basic",
|
|
6
|
+
const: :Basic },
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
def self.provider
|
|
10
|
+
@provider ||= const_get detect[:const]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.provider=(prov)
|
|
14
|
+
@provider = prov
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.detect
|
|
18
|
+
PROVIDERS.find { |prov|
|
|
19
|
+
test_provider prov
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.test_provider(provider)
|
|
24
|
+
# We must load this file instead of `require`ing it, since during our tests we want the file
|
|
25
|
+
# to be reloaded. In practice, this will only be called once, so `require` is not necessary.
|
|
26
|
+
load "#{provider[:impl]}.rb"
|
|
27
|
+
true
|
|
28
|
+
rescue LoadError
|
|
29
|
+
false
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require "set"
|
|
2
|
+
|
|
3
|
+
module BetterErrors
|
|
4
|
+
# @private
|
|
5
|
+
class StackFrame
|
|
6
|
+
def self.from_exception(exception)
|
|
7
|
+
RaisedException.new(exception).backtrace
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
attr_reader :filename, :line, :name, :frame_binding
|
|
11
|
+
|
|
12
|
+
def initialize(filename, line, name, frame_binding = nil)
|
|
13
|
+
@filename = filename
|
|
14
|
+
@line = line
|
|
15
|
+
@name = name
|
|
16
|
+
@frame_binding = frame_binding
|
|
17
|
+
|
|
18
|
+
set_pretty_method_name if frame_binding
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def application?
|
|
22
|
+
if root = BetterErrors.application_root
|
|
23
|
+
filename.index(root) == 0 && filename.index("#{root}/vendor") != 0
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def application_path
|
|
28
|
+
filename[(BetterErrors.application_root.length+1)..-1]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def gem?
|
|
32
|
+
Gem.path.any? { |path| filename.index(path) == 0 }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def gem_path
|
|
36
|
+
if path = Gem.path.detect { |p| filename.index(p) == 0 }
|
|
37
|
+
gem_name_and_version, path = filename.sub("#{path}/gems/", "").split("/", 2)
|
|
38
|
+
/(?<gem_name>.+)-(?<gem_version>[\w.]+)/ =~ gem_name_and_version
|
|
39
|
+
"#{gem_name} (#{gem_version}) #{path}"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def class_name
|
|
44
|
+
@class_name
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def method_name
|
|
48
|
+
@method_name || @name
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def context
|
|
52
|
+
if gem?
|
|
53
|
+
:gem
|
|
54
|
+
elsif application?
|
|
55
|
+
:application
|
|
56
|
+
else
|
|
57
|
+
:dunno
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def pretty_path
|
|
62
|
+
case context
|
|
63
|
+
when :application; application_path
|
|
64
|
+
when :gem; gem_path
|
|
65
|
+
else filename
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def local_variables
|
|
70
|
+
return {} unless frame_binding
|
|
71
|
+
|
|
72
|
+
lv = frame_binding.eval("local_variables")
|
|
73
|
+
return {} unless lv
|
|
74
|
+
|
|
75
|
+
lv.each_with_object({}) do |name, hash|
|
|
76
|
+
# Ruby 2.2's local_variables will include the hidden #$! variable if
|
|
77
|
+
# called from within a rescue context. This is not a valid variable name,
|
|
78
|
+
# so the local_variable_get method complains. This should probably be
|
|
79
|
+
# considered a bug in Ruby itself, but we need to work around it.
|
|
80
|
+
next if name == :"\#$!"
|
|
81
|
+
|
|
82
|
+
hash[name] = local_variable(name)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def local_variable(name)
|
|
87
|
+
get_local_variable(name) || eval_local_variable(name)
|
|
88
|
+
rescue NameError => ex
|
|
89
|
+
"#{ex.class}: #{ex.message}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def instance_variables
|
|
93
|
+
return {} unless frame_binding
|
|
94
|
+
Hash[visible_instance_variables.map { |x|
|
|
95
|
+
[x, frame_binding.eval(x.to_s)]
|
|
96
|
+
}]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def visible_instance_variables
|
|
100
|
+
iv = frame_binding.eval("instance_variables")
|
|
101
|
+
return {} unless iv
|
|
102
|
+
|
|
103
|
+
iv - BetterErrors.ignored_instance_variables
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def to_s
|
|
107
|
+
"#{pretty_path}:#{line}:in `#{name}'"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
private
|
|
111
|
+
def set_pretty_method_name
|
|
112
|
+
name =~ /\A(block (\([^)]+\) )?in )?/
|
|
113
|
+
recv = frame_binding.eval("self")
|
|
114
|
+
|
|
115
|
+
return unless method_name = frame_binding.eval("::Kernel.__method__")
|
|
116
|
+
|
|
117
|
+
if Module === recv
|
|
118
|
+
@class_name = "#{$1}#{recv}"
|
|
119
|
+
@method_name = ".#{method_name}"
|
|
120
|
+
else
|
|
121
|
+
@class_name = "#{$1}#{Kernel.instance_method(:class).bind(recv).call}"
|
|
122
|
+
@method_name = "##{method_name}"
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def get_local_variable(name)
|
|
127
|
+
if defined?(frame_binding.local_variable_get)
|
|
128
|
+
frame_binding.local_variable_get(name)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def eval_local_variable(name)
|
|
133
|
+
frame_binding.eval(name.to_s)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*{margin:0;padding:0}table{width:100%;border-collapse:collapse}th,td{vertical-align:top;text-align:left}textarea{resize:none}body{font-size:10pt}body,td,input,textarea{font-family:helvetica neue, lucida grande, sans-serif;line-height:1.5;color:#333;text-shadow:0 1px 0 rgba(255,255,255,0.6)}html{background:#f0f0f5}.clearfix::after{clear:both;content:".";display:block;height:0;visibility:hidden}@media screen and (max-width: 1100px){html{overflow-y:scroll}body{margin:0 20px}header.exception{margin:0 -20px}nav.sidebar{padding:0;margin:20px 0}ul.frames{max-height:200px;overflow:auto}}@media screen and (min-width: 1100px){header.exception{position:fixed;top:0;left:0;right:0}nav.sidebar,.frame_info{position:fixed;top:102px;bottom:0;box-sizing:border-box;overflow-y:auto;overflow-x:hidden}nav.sidebar{width:40%;left:20px;top:122px;bottom:20px}.frame_info{display:none;right:0;left:40%;padding:20px;padding-left:10px;margin-left:30px}.frame_info.current{display:block}}nav.sidebar{background:#d3d3da;border-top:solid 3px #a33;border-bottom:solid 3px #a33;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,0.2),inset 0 0 0 1px rgba(0,0,0,0.1)}header.exception{padding:18px 20px;height:66px;min-height:59px;overflow:hidden;background-color:#20202a;color:#aaa;text-shadow:0 1px 0 rgba(0,0,0,0.3);font-weight:200;box-shadow:inset 0 -5px 3px -3px rgba(0,0,0,0.05),inset 0 -1px 0 rgba(0,0,0,0.05);-webkit-text-smoothing:antialiased}header.exception .fix-actions{margin-top:.5em}header.exception .fix-actions input[type=submit]{font-weight:bold}header.exception h2{font-weight:200;font-size:11pt}header.exception h2,header.exception p{line-height:1.5em;overflow:hidden;white-space:pre;text-overflow:ellipsis}header.exception h2 strong{font-weight:700;color:#d55}header.exception p{font-weight:200;font-size:17pt;color:white}header.exception:hover{height:auto;z-index:2}header.exception:hover h2,header.exception:hover p{padding-right:20px;overflow-y:auto;word-wrap:break-word;white-space:pre-wrap;height:auto;max-height:7.5em}@media screen and (max-width: 1100px){header.exception{height:auto}header.exception h2,header.exception p{padding-right:20px;overflow-y:auto;word-wrap:break-word;height:auto;max-height:7em}}.better-errors-javascript-not-loaded .backtrace .tabs{display:none}nav.tabs{border-bottom:solid 1px #ddd;background-color:#eee;text-align:center;padding:6px;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1)}nav.tabs a{display:inline-block;height:22px;line-height:22px;padding:0 10px;text-decoration:none;font-size:8pt;font-weight:bold;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.6)}nav.tabs a.selected{color:white;background:rgba(0,0,0,0.5);border-radius:16px;box-shadow:1px 1px 0 rgba(255,255,255,0.1);text-shadow:0 0 4px rgba(0,0,0,0.4),0 1px 0 rgba(0,0,0,0.4)}nav.tabs a.disabled{text-decoration:line-through;text-shadow:none;cursor:default}ul.frames{box-shadow:0 0 10px rgba(0,0,0,0.1)}ul.frames li{background-color:#f8f8f8;background:-webkit-linear-gradient(top, #f8f8f8 80%, #f0f0f0);background:-moz-linear-gradient(top, #f8f8f8 80%, #f0f0f0);background:linear-gradient(top, #f8f8f8 80%, #f0f0f0);box-shadow:inset 0 -1px 0 #e2e2e2;padding:7px 20px;cursor:pointer;overflow:hidden}ul.frames .name,ul.frames .location{overflow:hidden;height:1.5em;white-space:nowrap;word-wrap:none;text-overflow:ellipsis}ul.frames .method{color:#966}ul.frames .location{font-size:0.85em;font-weight:400;color:#999}ul.frames .line{font-weight:bold}ul.frames li.selected{background:#38a;box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),inset 0 2px 0 rgba(255,255,255,0.01),inset 0 -1px 0 rgba(0,0,0,0.1)}ul.frames li.selected .name,ul.frames li.selected .method,ul.frames li.selected .location{color:white;text-shadow:0 1px 0 rgba(0,0,0,0.2)}ul.frames li.selected .location{opacity:0.6}ul.frames li{padding-left:60px;position:relative}ul.frames li .icon{display:block;width:20px;height:20px;line-height:20px;border-radius:15px;text-align:center;background:white;border:solid 2px #ccc;font-size:9pt;font-weight:200;font-style:normal;position:absolute;top:14px;left:20px}ul.frames .icon.application{background:#808090;border-color:#555}ul.frames .icon.application:before{content:'A';color:white;text-shadow:0 0 3px rgba(0,0,0,0.2)}@media screen and (max-width: 1100px){ul.frames li{padding-top:6px;padding-bottom:6px;padding-left:36px;line-height:1.3}ul.frames li .icon{width:11px;height:11px;line-height:11px;top:7px;left:10px;font-size:5pt}ul.frames .name,ul.frames .location{display:inline-block;line-height:1.3;height:1.3em}ul.frames .name{margin-right:10px}}pre,code,.be-repl input,.be-repl .command-line span,textarea,.code_linenums{font-family:menlo, lucida console, monospace;font-size:8pt}p.no-javascript-notice{margin-bottom:1em;padding:1em;border:2px solid #e00}.better-errors-javascript-loaded .no-javascript-notice{display:none}.no-inline-style-notice{display:none}.trace_info{background:#fff;padding:6px;border-radius:3px;margin-bottom:2px;box-shadow:0 0 10px rgba(0,0,0,0.03),1px 1px 0 rgba(0,0,0,0.05),-1px 1px 0 rgba(0,0,0,0.05),0 0 0 4px rgba(0,0,0,0.04)}.code_block{background:#f1f1f1;border-left:1px solid #ccc}.trace_info .title{background:#f1f1f1;box-shadow:inset 0 1px 0 rgba(255,255,255,0.3);overflow:hidden;padding:6px 10px;border:solid 1px #ccc;border-bottom:0;border-top-left-radius:2px;border-top-right-radius:2px}.trace_info .title .name,.trace_info .title .location{font-size:9pt;line-height:26px;height:26px;overflow:hidden}.trace_info .title .location{float:left;font-weight:bold;font-size:10pt}.trace_info .title .location a{color:inherit;text-decoration:none;border-bottom:1px solid #aaaaaa}.trace_info .title .location a:hover{border-color:#666666}.trace_info .title .name{float:right;font-weight:200}.better-errors-javascript-not-loaded .be-repl{display:none}.code,.be-console,.unavailable{padding:5px;box-shadow:inset 3px 3px 3px rgba(0,0,0,0.1),inset 0 0 0 1px rgba(0,0,0,0.1)}.code,.unavailable{text-shadow:none}.code_linenums{background:#f1f1f1;padding-top:10px;padding-bottom:9px;float:left}.code_linenums span{display:block;padding:0 12px}.code,.be-console .syntax-highlighted{text-shadow:none}.code,.be-console .syntax-highlighted{background-color:#fdf6e3;color:#586e75}.code .c,.be-console .syntax-highlighted .c{color:#93a1a1}.code .err,.be-console .syntax-highlighted .err{color:#586e75}.code .g,.be-console .syntax-highlighted .g{color:#586e75}.code .k,.be-console .syntax-highlighted .k{color:#859900}.code .l,.be-console .syntax-highlighted .l{color:#586e75}.code .n,.be-console .syntax-highlighted .n{color:#586e75}.code .o,.be-console .syntax-highlighted .o{color:#859900}.code .x,.be-console .syntax-highlighted .x{color:#cb4b16}.code .p,.be-console .syntax-highlighted .p{color:#586e75}.code .cm,.be-console .syntax-highlighted .cm{color:#93a1a1}.code .cp,.be-console .syntax-highlighted .cp{color:#859900}.code .c1,.be-console .syntax-highlighted .c1{color:#93a1a1}.code .cs,.be-console .syntax-highlighted .cs{color:#859900}.code .gd,.be-console .syntax-highlighted .gd{color:#2aa198}.code .ge,.be-console .syntax-highlighted .ge{color:#586e75;font-style:italic}.code .gr,.be-console .syntax-highlighted .gr{color:#dc322f}.code .gh,.be-console .syntax-highlighted .gh{color:#cb4b16}.code .gi,.be-console .syntax-highlighted .gi{color:#859900}.code .go,.be-console .syntax-highlighted .go{color:#586e75}.code .gp,.be-console .syntax-highlighted .gp{color:#586e75}.code .gs,.be-console .syntax-highlighted .gs{color:#586e75;font-weight:bold}.code .gu,.be-console .syntax-highlighted .gu{color:#cb4b16}.code .gt,.be-console .syntax-highlighted .gt{color:#586e75}.code .kc,.be-console .syntax-highlighted .kc{color:#cb4b16}.code .kd,.be-console .syntax-highlighted .kd{color:#268bd2}.code .kn,.be-console .syntax-highlighted .kn{color:#859900}.code .kp,.be-console .syntax-highlighted .kp{color:#859900}.code .kr,.be-console .syntax-highlighted .kr{color:#268bd2}.code .kt,.be-console .syntax-highlighted .kt{color:#dc322f}.code .ld,.be-console .syntax-highlighted .ld{color:#586e75}.code .m,.be-console .syntax-highlighted .m{color:#2aa198}.code .s,.be-console .syntax-highlighted .s{color:#2aa198}.code .na,.be-console .syntax-highlighted .na{color:#586e75}.code .nb,.be-console .syntax-highlighted .nb{color:#B58900}.code .nc,.be-console .syntax-highlighted .nc{color:#268bd2}.code .no,.be-console .syntax-highlighted .no{color:#cb4b16}.code .nd,.be-console .syntax-highlighted .nd{color:#268bd2}.code .ni,.be-console .syntax-highlighted .ni{color:#cb4b16}.code .ne,.be-console .syntax-highlighted .ne{color:#cb4b16}.code .nf,.be-console .syntax-highlighted .nf{color:#268bd2}.code .nl,.be-console .syntax-highlighted .nl{color:#586e75}.code .nn,.be-console .syntax-highlighted .nn{color:#586e75}.code .nx,.be-console .syntax-highlighted .nx{color:#586e75}.code .py,.be-console .syntax-highlighted .py{color:#586e75}.code .nt,.be-console .syntax-highlighted .nt{color:#268bd2}.code .nv,.be-console .syntax-highlighted .nv{color:#268bd2}.code .ow,.be-console .syntax-highlighted .ow{color:#859900}.code .w,.be-console .syntax-highlighted .w{color:#586e75}.code .mf,.be-console .syntax-highlighted .mf{color:#2aa198}.code .mh,.be-console .syntax-highlighted .mh{color:#2aa198}.code .mi,.be-console .syntax-highlighted .mi{color:#2aa198}.code .mo,.be-console .syntax-highlighted .mo{color:#2aa198}.code .sb,.be-console .syntax-highlighted .sb{color:#93a1a1}.code .sc,.be-console .syntax-highlighted .sc{color:#2aa198}.code .sd,.be-console .syntax-highlighted .sd{color:#586e75}.code .s2,.be-console .syntax-highlighted .s2{color:#2aa198}.code .se,.be-console .syntax-highlighted .se{color:#cb4b16}.code .sh,.be-console .syntax-highlighted .sh{color:#586e75}.code .si,.be-console .syntax-highlighted .si{color:#2aa198}.code .sx,.be-console .syntax-highlighted .sx{color:#2aa198}.code .sr,.be-console .syntax-highlighted .sr{color:#dc322f}.code .s1,.be-console .syntax-highlighted .s1{color:#2aa198}.code .ss,.be-console .syntax-highlighted .ss{color:#2aa198}.code .bp,.be-console .syntax-highlighted .bp{color:#268bd2}.code .vc,.be-console .syntax-highlighted .vc{color:#268bd2}.code .vg,.be-console .syntax-highlighted .vg{color:#268bd2}.code .vi,.be-console .syntax-highlighted .vi{color:#268bd2}.code .il,.be-console .syntax-highlighted .il{color:#2aa198}@media (prefers-color-scheme: dark){.code{background-color:#002b36;color:#93a1a1}.code .c{color:#586e75;background-color:transparent;font-style:inherit}.code .err{color:#93a1a1;background-color:transparent;font-style:inherit}.code .g{color:#93a1a1;background-color:transparent;font-style:inherit}.code .k{color:#859900;background-color:transparent;font-style:inherit}.code .l{color:#93a1a1;background-color:transparent;font-style:inherit}.code .n{color:#93a1a1;background-color:transparent;font-style:inherit}.code .o{color:#859900;background-color:transparent;font-style:inherit}.code .x{color:#cb4b16;background-color:transparent;font-style:inherit}.code .p{color:#93a1a1;background-color:transparent;font-style:inherit}.code .cm{color:#586e75;background-color:transparent;font-style:inherit}.code .cp{color:#859900;background-color:transparent;font-style:inherit}.code .c1{color:#586e75;background-color:transparent;font-style:inherit}.code .cs{color:#859900;background-color:transparent;font-style:inherit}.code .gd{color:#2aa198;background-color:transparent;font-style:inherit}.code .ge{color:#93a1a1;background-color:transparent;font-style:italic}.code .gr{color:#dc322f;background-color:transparent;font-style:inherit}.code .gh{color:#cb4b16;background-color:transparent;font-style:inherit}.code .gi{color:#859900;background-color:transparent;font-style:inherit}.code .go{color:#93a1a1;background-color:transparent;font-style:inherit}.code .gp{color:#93a1a1;background-color:transparent;font-style:inherit}.code .gs{color:#93a1a1;background-color:transparent;font-weight:bold}.code .gu{color:#cb4b16;background-color:transparent;font-style:inherit}.code .gt{color:#93a1a1;background-color:transparent;font-style:inherit}.code .kc{color:#cb4b16;background-color:transparent;font-style:inherit}.code .kd{color:#268bd2;background-color:transparent;font-style:inherit}.code .kn{color:#859900;background-color:transparent;font-style:inherit}.code .kp{color:#859900;background-color:transparent;font-style:inherit}.code .kr{color:#268bd2;background-color:transparent;font-style:inherit}.code .kt{color:#dc322f;background-color:transparent;font-style:inherit}.code .ld{color:#93a1a1;background-color:transparent;font-style:inherit}.code .m{color:#2aa198;background-color:transparent;font-style:inherit}.code .s{color:#2aa198;background-color:transparent;font-style:inherit}.code .na{color:#93a1a1;background-color:transparent;font-style:inherit}.code .nb{color:#B58900;background-color:transparent;font-style:inherit}.code .nc{color:#268bd2;background-color:transparent;font-style:inherit}.code .no{color:#cb4b16;background-color:transparent;font-style:inherit}.code .nd{color:#268bd2;background-color:transparent;font-style:inherit}.code .ni{color:#cb4b16;background-color:transparent;font-style:inherit}.code .ne{color:#cb4b16;background-color:transparent;font-style:inherit}.code .nf{color:#268bd2;background-color:transparent;font-style:inherit}.code .nl{color:#93a1a1;background-color:transparent;font-style:inherit}.code .nn{color:#93a1a1;background-color:transparent;font-style:inherit}.code .nx{color:#93a1a1;background-color:transparent;font-style:inherit}.code .py{color:#93a1a1;background-color:transparent;font-style:inherit}.code .nt{color:#268bd2;background-color:transparent;font-style:inherit}.code .nv{color:#268bd2;background-color:transparent;font-style:inherit}.code .ow{color:#859900;background-color:transparent;font-style:inherit}.code .w{color:#93a1a1;background-color:transparent;font-style:inherit}.code .mf{color:#2aa198;background-color:transparent;font-style:inherit}.code .mh{color:#2aa198;background-color:transparent;font-style:inherit}.code .mi{color:#2aa198;background-color:transparent;font-style:inherit}.code .mo{color:#2aa198;background-color:transparent;font-style:inherit}.code .sb{color:#586e75;background-color:transparent;font-style:inherit}.code .sc{color:#2aa198;background-color:transparent;font-style:inherit}.code .sd{color:#93a1a1;background-color:transparent;font-style:inherit}.code .s2{color:#2aa198;background-color:transparent;font-style:inherit}.code .se{color:#cb4b16;background-color:transparent;font-style:inherit}.code .sh{color:#93a1a1;background-color:transparent;font-style:inherit}.code .si{color:#2aa198;background-color:transparent;font-style:inherit}.code .sx{color:#2aa198;background-color:transparent;font-style:inherit}.code .sr{color:#dc322f;background-color:transparent;font-style:inherit}.code .s1{color:#2aa198;background-color:transparent;font-style:inherit}.code .ss{color:#2aa198;background-color:transparent;font-style:inherit}.code .bp{color:#268bd2;background-color:transparent;font-style:inherit}.code .vc{color:#268bd2;background-color:transparent;font-style:inherit}.code .vg{color:#268bd2;background-color:transparent;font-style:inherit}.code .vi{color:#268bd2;background-color:transparent;font-style:inherit}.code .il{color:#2aa198;background-color:transparent;font-style:inherit}}.code{margin-bottom:-1px;border-top-left-radius:2px;padding:10px 0;overflow:auto}.code .code-wrapper{display:inline-block;min-width:100%}.code pre{padding-left:12px;min-height:16px}p.unavailable{padding:20px 0 40px 0;text-align:center;color:#b99;font-weight:bold}p.unavailable:before{content:'\00d7';display:block;color:#daa;text-align:center;font-size:40pt;font-weight:normal;margin-bottom:-10px}@-webkit-keyframes highlight{0%{background:rgba(51,136,170,0.45)}100%{background:rgba(51,136,170,0.15)}}@-moz-keyframes highlight{0%{background:rgba(51,136,170,0.45)}100%{background:rgba(51,136,170,0.15)}}@keyframes highlight{0%{background:rgba(51,136,170,0.45)}100%{background:rgba(51,136,170,0.15)}}.code .highlight,.code_linenums .highlight{background:rgba(51,136,170,0.15);-webkit-animation:highlight 400ms linear 1;-moz-animation:highlight 400ms linear 1;animation:highlight 400ms linear 1}.be-console{background:#fff;padding:0 1px 10px 1px;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.be-console pre{padding:10px 10px 0 10px;max-height:400px;overflow-x:none;overflow-y:auto;margin-bottom:-3px;word-wrap:break-word;white-space:pre-wrap}.be-console .command-line{display:table;width:100%}.be-console .command-line span,.be-console .command-line input{display:table-cell}.be-console .command-line span{width:1%;padding-right:5px;padding-left:10px;white-space:pre}.be-console .command-line input{width:99%}.be-console input,.be-console input:focus{outline:0;border:0;padding:0;background:transparent;margin:0}.hint{margin:15px 0 20px 0;font-size:8pt;color:#8080a0;padding-left:20px}.console-has-been-used .live-console-hint{display:none}.better-errors-javascript-not-loaded .live-console-hint{display:none}.hint:before{content:'\25b2';margin-right:5px;opacity:0.5}.sub{padding:10px 0;margin:10px 0}.sub h3{color:#39a;font-size:1.1em;margin:10px 0;text-shadow:0 1px 0 rgba(255,255,255,0.6);-webkit-font-smoothing:antialiased}.sub .inset{overflow-y:auto}.sub table{table-layout:fixed}.sub table td{border-top:dotted 1px #ddd;padding:7px 1px}.sub table td.name{width:150px;font-weight:bold;font-size:0.8em;padding-right:20px;word-wrap:break-word}.sub table td pre{max-height:15em;overflow-y:auto}.sub table td pre{width:100%;word-wrap:break-word;white-space:normal}.sub .unsupported{font-family:sans-serif;color:#777}nav.sidebar::-webkit-scrollbar,.inset pre::-webkit-scrollbar,.be-console pre::-webkit-scrollbar,.code::-webkit-scrollbar{width:10px;height:10px}.inset pre::-webkit-scrollbar-thumb,.be-console pre::-webkit-scrollbar-thumb,.code::-webkit-scrollbar-thumb{background:#ccc;border-radius:5px}nav.sidebar::-webkit-scrollbar-thumb{background:rgba(0,0,0,0);border-radius:5px}nav.sidebar:hover::-webkit-scrollbar-thumb{background-color:#999;background:-webkit-linear-gradient(left, #aaa, #999)}.be-console pre:hover::-webkit-scrollbar-thumb,.inset pre:hover::-webkit-scrollbar-thumb,.code:hover::-webkit-scrollbar-thumb{background:#888}
|