From 21187c0fb4fc559927a2f947f909dedd85969ffb Mon Sep 17 00:00:00 2001
From: David Heinemeier Hansson No people in the address book yet <%= @topic.body %> Parameters: Address Book
+
+<% if @people.empty? %>
+
+
+<% end %>
+
+
\ No newline at end of file
diff --git a/actionpack/examples/address_book/layout.erb b/actionpack/examples/address_book/layout.erb
new file mode 100644
index 0000000000..931e141c01
--- /dev/null
+++ b/actionpack/examples/address_book/layout.erb
@@ -0,0 +1,8 @@
+
+
+
+ <% for person in @people %>
+ Name Email Address Phone Number
+ <% end %>
+ <%= person.name %> <%= person.email_address %> <%= person.phone_number %> Topics
+
+<%= link_to "New topic", :action => "new_topic" %>
+
+
+<% for topic in @topics %>
+
+
+
+
\ No newline at end of file
diff --git a/actionpack/examples/debate/new_topic.erb b/actionpack/examples/debate/new_topic.erb
new file mode 100644
index 0000000000..f52a69cc31
--- /dev/null
+++ b/actionpack/examples/debate/new_topic.erb
@@ -0,0 +1,22 @@
+
+
+New topic
+
+
+
+
+
\ No newline at end of file
diff --git a/actionpack/examples/debate/topic.erb b/actionpack/examples/debate/topic.erb
new file mode 100644
index 0000000000..e247c00f0d
--- /dev/null
+++ b/actionpack/examples/debate/topic.erb
@@ -0,0 +1,32 @@
+
+
+<%= @topic.title %>
+
+Replies
+
+ <% for reply in @topic.replies %>
+
+<% end %>
+
+Reply to this topic
+
+
+
+
+
\ No newline at end of file
diff --git a/actionpack/lib/action_controller/templates/rescues/_request_and_response.erb b/actionpack/lib/action_controller/templates/rescues/_request_and_response.erb
new file mode 100644
index 0000000000..fe60bfdd40
--- /dev/null
+++ b/actionpack/lib/action_controller/templates/rescues/_request_and_response.erb
@@ -0,0 +1,44 @@
+<% unless @exception.blamed_files.blank? %>
+ <% if (hide = @exception.blamed_files.length > 8) %>
+ Show blamed files
+ <% end %>
+ >
+<% end %>
+
+<% if false %>
+ <%=h @exception.describe_blame %>
+ <% begin %>
+ <%= form_tag(request.request_uri, "method" => request.method) %>
+
+
+ <% for key, values in params %>
+ <% next if key == "BP-RETRY" %>
+ <% for value in Array(values) %>
+
+ <% end %>
+ <% end %>
+
+
+
+ <% rescue Exception => e %>
+ <%=h "Couldn't render breakpoint link due to #{e.class} #{e.message}" %>
+ <% end %>
+<% end %>
+
+<%
+ clean_params = request.parameters.clone
+ clean_params.delete("action")
+ clean_params.delete("controller")
+
+ request_dump = clean_params.empty? ? 'None' : clean_params.inspect.gsub(',', ",\n")
+%>
+
+Request
+<%=h request_dump %>
Headers:
<%=h response ? response.headers.inspect.gsub(',', ",\n") : 'None' %>diff --git a/actionpack/lib/action_controller/templates/rescues/_trace.erb b/actionpack/lib/action_controller/templates/rescues/_trace.erb new file mode 100644 index 0000000000..b322b0aaae --- /dev/null +++ b/actionpack/lib/action_controller/templates/rescues/_trace.erb @@ -0,0 +1,26 @@ +<% + traces = [ + ["Application Trace", @exception.application_backtrace], + ["Framework Trace", @exception.framework_backtrace], + ["Full Trace", @exception.clean_backtrace] + ] + names = traces.collect {|name, trace| name} +%> + +
RAILS_ROOT: <%= defined?(RAILS_ROOT) ? RAILS_ROOT : "unset" %>
<%= trace.join "\n" %>
+ <%=h @exception.clean_message %>+ +<%= render_file(@rescues_path + "/_trace.erb", false) %> + +<%= render_file(@rescues_path + "/_request_and_response.erb", false) %> diff --git a/actionpack/lib/action_controller/templates/rescues/layout.erb b/actionpack/lib/action_controller/templates/rescues/layout.erb new file mode 100644 index 0000000000..d38f3e67f9 --- /dev/null +++ b/actionpack/lib/action_controller/templates/rescues/layout.erb @@ -0,0 +1,29 @@ + + +
<%=h @exception.message %>
diff --git a/actionpack/lib/action_controller/templates/rescues/routing_error.erb b/actionpack/lib/action_controller/templates/rescues/routing_error.erb new file mode 100644 index 0000000000..ccfa858cce --- /dev/null +++ b/actionpack/lib/action_controller/templates/rescues/routing_error.erb @@ -0,0 +1,10 @@ +<%=h @exception.message %>+<% unless @exception.failures.empty? %>
+
<%=h route.inspect.gsub('\\', '') %>
failed because <%=h reason.downcase %>+ Showing <%=h @exception.file_name %> where line #<%=h @exception.line_number %> raised: +
<%=h @exception.message %>
+
+
+Extracted source (around line #<%=h @exception.line_number %>): +
<%=h @exception.source_extract %>
+
+<%=h @exception.sub_template_message %>
+ +<% @real_exception = @exception + @exception = @exception.original_exception || @exception %> +<%= render_file(@rescues_path + "/_trace.erb", false) %> +<% @exception = @real_exception %> + +<%= render_file(@rescues_path + "/_request_and_response.erb", false) %> diff --git a/actionpack/lib/action_controller/templates/rescues/unknown_action.erb b/actionpack/lib/action_controller/templates/rescues/unknown_action.erb new file mode 100644 index 0000000000..683379da10 --- /dev/null +++ b/actionpack/lib/action_controller/templates/rescues/unknown_action.erb @@ -0,0 +1,2 @@ +<%=h @exception.message %>
diff --git a/actionpack/lib/action_controller/templates/scaffolds/edit.erb b/actionpack/lib/action_controller/templates/scaffolds/edit.erb new file mode 100644 index 0000000000..63dff602a1 --- /dev/null +++ b/actionpack/lib/action_controller/templates/scaffolds/edit.erb @@ -0,0 +1,7 @@ +<%= flash[:notice] %>
+ +<%= yield %> + + + diff --git a/actionpack/lib/action_controller/templates/scaffolds/list.erb b/actionpack/lib/action_controller/templates/scaffolds/list.erb new file mode 100644 index 0000000000..fea23dc66f --- /dev/null +++ b/actionpack/lib/action_controller/templates/scaffolds/list.erb @@ -0,0 +1,27 @@ +<%= column.human_name %> | + <% end %> +|||
---|---|---|---|
<%= entry.send(column.name) %> | + <% end %> +<%= link_to "Show", :action => "show#{@scaffold_suffix}", :id => entry %> | +<%= link_to "Edit", :action => "edit#{@scaffold_suffix}", :id => entry %> | +<%= link_to "Destroy", {:action => "destroy#{@scaffold_suffix}", :id => entry}, { :confirm => "Are you sure?", :method => :post } %> | +
+ <%= column.human_name %>: + <%= instance_variable_get("@#{@scaffold_singular_name}").send(column.name) %> +
+<% end %> + +<%= link_to "Edit", :action => "edit#{@scaffold_suffix}", :id => instance_variable_get("@#{@scaffold_singular_name}") %> | +<%= link_to "Back", :action => "list#{@scaffold_suffix}" %> diff --git a/actionpack/test/fixtures/addresses/list.erb b/actionpack/test/fixtures/addresses/list.erb new file mode 100644 index 0000000000..c75e01eece --- /dev/null +++ b/actionpack/test/fixtures/addresses/list.erb @@ -0,0 +1 @@ +We only need to get this far! diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_cookies_ivar.erb b/actionpack/test/fixtures/deprecated_instance_variables/_cookies_ivar.erb new file mode 100644 index 0000000000..4e8a2d804c --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_cookies_ivar.erb @@ -0,0 +1 @@ +<%= @cookies[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_cookies_method.erb b/actionpack/test/fixtures/deprecated_instance_variables/_cookies_method.erb new file mode 100644 index 0000000000..68e88bb746 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_cookies_method.erb @@ -0,0 +1 @@ +<%= cookies[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_flash_ivar.erb b/actionpack/test/fixtures/deprecated_instance_variables/_flash_ivar.erb new file mode 100644 index 0000000000..4b4782b287 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_flash_ivar.erb @@ -0,0 +1 @@ +<%= @flash[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_flash_method.erb b/actionpack/test/fixtures/deprecated_instance_variables/_flash_method.erb new file mode 100644 index 0000000000..f7f9d0913a --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_flash_method.erb @@ -0,0 +1 @@ +<%= flash[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_headers_ivar.erb b/actionpack/test/fixtures/deprecated_instance_variables/_headers_ivar.erb new file mode 100644 index 0000000000..1176c93ad8 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_headers_ivar.erb @@ -0,0 +1 @@ +<%= @headers[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_headers_method.erb b/actionpack/test/fixtures/deprecated_instance_variables/_headers_method.erb new file mode 100644 index 0000000000..308c4eb6ba --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_headers_method.erb @@ -0,0 +1 @@ +<%= headers[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_params_ivar.erb b/actionpack/test/fixtures/deprecated_instance_variables/_params_ivar.erb new file mode 100644 index 0000000000..1eea68757f --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_params_ivar.erb @@ -0,0 +1 @@ +<%= @params[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_params_method.erb b/actionpack/test/fixtures/deprecated_instance_variables/_params_method.erb new file mode 100644 index 0000000000..7e349b4ca0 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_params_method.erb @@ -0,0 +1 @@ +<%= params[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_request_ivar.erb b/actionpack/test/fixtures/deprecated_instance_variables/_request_ivar.erb new file mode 100644 index 0000000000..a1680c23d5 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_request_ivar.erb @@ -0,0 +1 @@ +<%= @request.method %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_request_method.erb b/actionpack/test/fixtures/deprecated_instance_variables/_request_method.erb new file mode 100644 index 0000000000..0c74cf1c1b --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_request_method.erb @@ -0,0 +1 @@ +<%= request.method %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_response_ivar.erb b/actionpack/test/fixtures/deprecated_instance_variables/_response_ivar.erb new file mode 100644 index 0000000000..2f12d2ce32 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_response_ivar.erb @@ -0,0 +1 @@ +<%= @response.body %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_response_method.erb b/actionpack/test/fixtures/deprecated_instance_variables/_response_method.erb new file mode 100644 index 0000000000..948c75929a --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_response_method.erb @@ -0,0 +1 @@ +<%= response.body %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_session_ivar.erb b/actionpack/test/fixtures/deprecated_instance_variables/_session_ivar.erb new file mode 100644 index 0000000000..3acc1b8529 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_session_ivar.erb @@ -0,0 +1 @@ +<%= @session[:test] %> diff --git a/actionpack/test/fixtures/deprecated_instance_variables/_session_method.erb b/actionpack/test/fixtures/deprecated_instance_variables/_session_method.erb new file mode 100644 index 0000000000..a899387c47 --- /dev/null +++ b/actionpack/test/fixtures/deprecated_instance_variables/_session_method.erb @@ -0,0 +1 @@ +<%= session[:test] %> diff --git a/actionpack/test/fixtures/fun/games/hello_world.erb b/actionpack/test/fixtures/fun/games/hello_world.erb new file mode 100644 index 0000000000..1ebfbe2539 --- /dev/null +++ b/actionpack/test/fixtures/fun/games/hello_world.erb @@ -0,0 +1 @@ +Living in a nested world \ No newline at end of file diff --git a/actionpack/test/fixtures/layouts/builder.builder b/actionpack/test/fixtures/layouts/builder.builder new file mode 100644 index 0000000000..729af4b8bc --- /dev/null +++ b/actionpack/test/fixtures/layouts/builder.builder @@ -0,0 +1,3 @@ +xml.wrapper do + xml << @content_for_layout +end \ No newline at end of file diff --git a/actionpack/test/fixtures/layouts/standard.erb b/actionpack/test/fixtures/layouts/standard.erb new file mode 100644 index 0000000000..368764e6f4 --- /dev/null +++ b/actionpack/test/fixtures/layouts/standard.erb @@ -0,0 +1 @@ +<%= @content_for_layout %><%= @variable_for_layout %> \ No newline at end of file diff --git a/actionpack/test/fixtures/layouts/talk_from_action.erb b/actionpack/test/fixtures/layouts/talk_from_action.erb new file mode 100644 index 0000000000..187aab07a2 --- /dev/null +++ b/actionpack/test/fixtures/layouts/talk_from_action.erb @@ -0,0 +1,2 @@ +Beautiful modules!
\ No newline at end of file diff --git a/actionpack/test/fixtures/test/_customer.erb b/actionpack/test/fixtures/test/_customer.erb new file mode 100644 index 0000000000..872d8c44e6 --- /dev/null +++ b/actionpack/test/fixtures/test/_customer.erb @@ -0,0 +1 @@ +Hello: <%= customer.name %> \ No newline at end of file diff --git a/actionpack/test/fixtures/test/_customer_greeting.erb b/actionpack/test/fixtures/test/_customer_greeting.erb new file mode 100644 index 0000000000..6acbcb20c4 --- /dev/null +++ b/actionpack/test/fixtures/test/_customer_greeting.erb @@ -0,0 +1 @@ +<%= greeting %>: <%= customer_greeting.name %> \ No newline at end of file diff --git a/actionpack/test/fixtures/test/_hash_object.erb b/actionpack/test/fixtures/test/_hash_object.erb new file mode 100644 index 0000000000..037a7368d6 --- /dev/null +++ b/actionpack/test/fixtures/test/_hash_object.erb @@ -0,0 +1 @@ +<%= hash_object[:first_name] %> \ No newline at end of file diff --git a/actionpack/test/fixtures/test/_hello.builder b/actionpack/test/fixtures/test/_hello.builder new file mode 100644 index 0000000000..ef52f632d1 --- /dev/null +++ b/actionpack/test/fixtures/test/_hello.builder @@ -0,0 +1 @@ +xm.hello \ No newline at end of file diff --git a/actionpack/test/fixtures/test/_partial_only.erb b/actionpack/test/fixtures/test/_partial_only.erb new file mode 100644 index 0000000000..a44b3eed40 --- /dev/null +++ b/actionpack/test/fixtures/test/_partial_only.erb @@ -0,0 +1 @@ +only partial \ No newline at end of file diff --git a/actionpack/test/fixtures/test/_person.erb b/actionpack/test/fixtures/test/_person.erb new file mode 100644 index 0000000000..b2e5688956 --- /dev/null +++ b/actionpack/test/fixtures/test/_person.erb @@ -0,0 +1,2 @@ +Second: <%= name %> +Third: <%= @name %> diff --git a/actionpack/test/fixtures/test/action_talk_to_layout.erb b/actionpack/test/fixtures/test/action_talk_to_layout.erb new file mode 100644 index 0000000000..36e896daa8 --- /dev/null +++ b/actionpack/test/fixtures/test/action_talk_to_layout.erb @@ -0,0 +1,2 @@ +<% @title = "Talking to the layout" -%> +Action was here! \ No newline at end of file diff --git a/actionpack/test/fixtures/test/block_content_for.erb b/actionpack/test/fixtures/test/block_content_for.erb new file mode 100644 index 0000000000..9510337365 --- /dev/null +++ b/actionpack/test/fixtures/test/block_content_for.erb @@ -0,0 +1,2 @@ +<% block_content_for :title do 'Putting stuff in the title!' end %> +Great stuff! \ No newline at end of file diff --git a/actionpack/test/fixtures/test/capturing.erb b/actionpack/test/fixtures/test/capturing.erb new file mode 100644 index 0000000000..1addaa40d9 --- /dev/null +++ b/actionpack/test/fixtures/test/capturing.erb @@ -0,0 +1,4 @@ +<% days = capture do %> + Dreamy days +<% end %> +<%= days %> \ No newline at end of file diff --git a/actionpack/test/fixtures/test/content_for.erb b/actionpack/test/fixtures/test/content_for.erb new file mode 100644 index 0000000000..0e47ca8c3d --- /dev/null +++ b/actionpack/test/fixtures/test/content_for.erb @@ -0,0 +1,2 @@ +<% content_for :title do %>Putting stuff in the title!<% end %> +Great stuff! \ No newline at end of file diff --git a/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.erb b/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.erb new file mode 100644 index 0000000000..8b8a449236 --- /dev/null +++ b/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.erb @@ -0,0 +1 @@ +The secret is <%= @secret %> diff --git a/actionpack/test/fixtures/test/erb_content_for.erb b/actionpack/test/fixtures/test/erb_content_for.erb new file mode 100644 index 0000000000..c3bdd13643 --- /dev/null +++ b/actionpack/test/fixtures/test/erb_content_for.erb @@ -0,0 +1,2 @@ +<% erb_content_for :title do %>Putting stuff in the title!<% end %> +Great stuff! \ No newline at end of file diff --git a/actionpack/test/fixtures/test/greeting.erb b/actionpack/test/fixtures/test/greeting.erb new file mode 100644 index 0000000000..62fb0293f0 --- /dev/null +++ b/actionpack/test/fixtures/test/greeting.erb @@ -0,0 +1 @@ +This is grand!
diff --git a/actionpack/test/fixtures/test/hello.builder b/actionpack/test/fixtures/test/hello.builder new file mode 100644 index 0000000000..82a4a310d3 --- /dev/null +++ b/actionpack/test/fixtures/test/hello.builder @@ -0,0 +1,4 @@ +xml.html do + xml.p "Hello #{@name}" + xml << render_file("test/greeting") +end \ No newline at end of file diff --git a/actionpack/test/fixtures/test/hello_world.builder b/actionpack/test/fixtures/test/hello_world.builder new file mode 100644 index 0000000000..bffd2191ba --- /dev/null +++ b/actionpack/test/fixtures/test/hello_world.builder @@ -0,0 +1,3 @@ +xml.html do + xml.p "Hello" +end \ No newline at end of file diff --git a/actionpack/test/fixtures/test/hello_world.erb b/actionpack/test/fixtures/test/hello_world.erb new file mode 100644 index 0000000000..6769dd60bd --- /dev/null +++ b/actionpack/test/fixtures/test/hello_world.erb @@ -0,0 +1 @@ +Hello world! \ No newline at end of file diff --git a/actionpack/test/fixtures/test/hello_world_container.builder b/actionpack/test/fixtures/test/hello_world_container.builder new file mode 100644 index 0000000000..e48d75c405 --- /dev/null +++ b/actionpack/test/fixtures/test/hello_world_container.builder @@ -0,0 +1,3 @@ +xml.test do + render :partial => 'hello', :locals => { :xm => xml } +end \ No newline at end of file diff --git a/actionpack/test/fixtures/test/hello_world_with_layout_false.erb b/actionpack/test/fixtures/test/hello_world_with_layout_false.erb new file mode 100644 index 0000000000..6769dd60bd --- /dev/null +++ b/actionpack/test/fixtures/test/hello_world_with_layout_false.erb @@ -0,0 +1 @@ +Hello world! \ No newline at end of file diff --git a/actionpack/test/fixtures/test/hello_xml_world.builder b/actionpack/test/fixtures/test/hello_xml_world.builder new file mode 100644 index 0000000000..02b14fe87c --- /dev/null +++ b/actionpack/test/fixtures/test/hello_xml_world.builder @@ -0,0 +1,11 @@ +xml.html do + xml.head do + xml.title "Hello World" + end + + xml.body do + xml.p "abes" + xml.p "monks" + xml.p "wiseguys" + end +end \ No newline at end of file diff --git a/actionpack/test/fixtures/test/list.erb b/actionpack/test/fixtures/test/list.erb new file mode 100644 index 0000000000..cd0ab45d26 --- /dev/null +++ b/actionpack/test/fixtures/test/list.erb @@ -0,0 +1 @@ +<%= @test_unchanged = 'goodbye' %><%= render_collection_of_partials "customer", @customers %><%= @test_unchanged %> diff --git a/actionpack/test/fixtures/test/non_erb_block_content_for.builder b/actionpack/test/fixtures/test/non_erb_block_content_for.builder new file mode 100644 index 0000000000..6ff6db0f95 --- /dev/null +++ b/actionpack/test/fixtures/test/non_erb_block_content_for.builder @@ -0,0 +1,4 @@ +content_for :title do + 'Putting stuff in the title!' +end +xml << "\nGreat stuff!" \ No newline at end of file diff --git a/actionpack/test/fixtures/test/potential_conflicts.erb b/actionpack/test/fixtures/test/potential_conflicts.erb new file mode 100644 index 0000000000..a5e964e359 --- /dev/null +++ b/actionpack/test/fixtures/test/potential_conflicts.erb @@ -0,0 +1,4 @@ +First: <%= @name %> +<%= render :partial => "person", :locals => { :name => "Stephan" } -%> +Fourth: <%= @name %> +Fifth: <%= name %> \ No newline at end of file diff --git a/actionpack/test/fixtures/test/render_file_with_ivar.erb b/actionpack/test/fixtures/test/render_file_with_ivar.erb new file mode 100644 index 0000000000..8b8a449236 --- /dev/null +++ b/actionpack/test/fixtures/test/render_file_with_ivar.erb @@ -0,0 +1 @@ +The secret is <%= @secret %> diff --git a/actionpack/test/fixtures/test/render_file_with_locals.erb b/actionpack/test/fixtures/test/render_file_with_locals.erb new file mode 100644 index 0000000000..ebe09faee6 --- /dev/null +++ b/actionpack/test/fixtures/test/render_file_with_locals.erb @@ -0,0 +1 @@ +The secret is <%= secret %> diff --git a/actionpack/test/fixtures/test/render_to_string_test.erb b/actionpack/test/fixtures/test/render_to_string_test.erb new file mode 100644 index 0000000000..6e267e8634 --- /dev/null +++ b/actionpack/test/fixtures/test/render_to_string_test.erb @@ -0,0 +1 @@ +The value of foo is: ::<%= @foo %>:: diff --git a/actionpack/test/fixtures/test/update_element_with_capture.erb b/actionpack/test/fixtures/test/update_element_with_capture.erb new file mode 100644 index 0000000000..fa3ef200f9 --- /dev/null +++ b/actionpack/test/fixtures/test/update_element_with_capture.erb @@ -0,0 +1,9 @@ +<% replacement_function = update_element_function("products", :action => :update) do %> +Product 1
+Product 2
+<% end %> +<%= javascript_tag(replacement_function) %> + +<% update_element_function("status", :action => :update, :binding => binding) do %> + You bought something! +<% end %> -- cgit v1.2.3