From 6376d82863d0a087e27b0f90189da0cf2065421e Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Wed, 27 Jul 2016 17:12:35 -0300 Subject: [PATCH 01/19] hello api --- contabilizei/.classpath | 10 ++++ contabilizei/.project | 30 +++++++++++ .../.settings/org.eclipse.jdt.core.prefs | 5 ++ .../org.eclipse.wst.common.component | 18 +++++++ ....eclipse.wst.common.project.facet.core.xml | 6 +++ contabilizei/pom.xml | 49 ++++++++++++++++++ .../java/com/luan/rest/HelloWorldService.java | 21 ++++++++ contabilizei/src/main/webapp/WEB-INF/web.xml | 22 ++++++++ .../com/luan/rest/HelloWorldService.class | Bin 0 -> 1272 bytes 9 files changed, 161 insertions(+) create mode 100644 contabilizei/.classpath create mode 100644 contabilizei/.project create mode 100644 contabilizei/.settings/org.eclipse.jdt.core.prefs create mode 100644 contabilizei/.settings/org.eclipse.wst.common.component create mode 100644 contabilizei/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 contabilizei/pom.xml create mode 100644 contabilizei/src/main/java/com/luan/rest/HelloWorldService.java create mode 100644 contabilizei/src/main/webapp/WEB-INF/web.xml create mode 100644 contabilizei/target/classes/com/luan/rest/HelloWorldService.class diff --git a/contabilizei/.classpath b/contabilizei/.classpath new file mode 100644 index 00000000..8d409085 --- /dev/null +++ b/contabilizei/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/contabilizei/.project b/contabilizei/.project new file mode 100644 index 00000000..5027ce79 --- /dev/null +++ b/contabilizei/.project @@ -0,0 +1,30 @@ + + + contabilizei + NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jem.workbench.JavaEMFNature + + diff --git a/contabilizei/.settings/org.eclipse.jdt.core.prefs b/contabilizei/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f2992737 --- /dev/null +++ b/contabilizei/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Mon Jul 18 10:33:35 SGT 2011 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/contabilizei/.settings/org.eclipse.wst.common.component b/contabilizei/.settings/org.eclipse.wst.common.component new file mode 100644 index 00000000..d676bcf3 --- /dev/null +++ b/contabilizei/.settings/org.eclipse.wst.common.component @@ -0,0 +1,18 @@ + + + + + + + uses + + + uses + + + uses + + + + + diff --git a/contabilizei/.settings/org.eclipse.wst.common.project.facet.core.xml b/contabilizei/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 00000000..b54cb2a1 --- /dev/null +++ b/contabilizei/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/contabilizei/pom.xml b/contabilizei/pom.xml new file mode 100644 index 00000000..332ecbaf --- /dev/null +++ b/contabilizei/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + com.luan.common + Contabilizei + war + 1.0-SNAPSHOT + Contabilzei Webapp + http://maven.apache.org + + + + maven2-repository.java.net + Java.net Repository for Maven + http://download.java.net/maven/2/ + default + + + + + + junit + junit + 4.8.2 + test + + + + com.sun.jersey + jersey-server + 1.8 + + + + + + Contabilizei + + + maven-compiler-plugin + + 1.6 + 1.6 + + + + + + \ No newline at end of file diff --git a/contabilizei/src/main/java/com/luan/rest/HelloWorldService.java b/contabilizei/src/main/java/com/luan/rest/HelloWorldService.java new file mode 100644 index 00000000..30c1b5a2 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/rest/HelloWorldService.java @@ -0,0 +1,21 @@ +package com.luan.rest; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +@Path("/hello") +public class HelloWorldService { + + @GET + @Path("/{param}") + public Response getMsg(@PathParam("param") String msg) { + + String output = " Ol, API. Seja bem vindo: " + msg; + + return Response.status(200).entity(output).build(); + + } + +} \ No newline at end of file diff --git a/contabilizei/src/main/webapp/WEB-INF/web.xml b/contabilizei/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..f5322a94 --- /dev/null +++ b/contabilizei/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,22 @@ + + Restful Web Application + + + jersey-serlvet + com.sun.jersey.spi.container.servlet.ServletContainer + + com.sun.jersey.config.property.packages + com.luan.rest + + 1 + + + + jersey-serlvet + /rest/* + + + \ No newline at end of file diff --git a/contabilizei/target/classes/com/luan/rest/HelloWorldService.class b/contabilizei/target/classes/com/luan/rest/HelloWorldService.class new file mode 100644 index 0000000000000000000000000000000000000000..b70f15dc10d29b2f5af302611d70b25c47e39250 GIT binary patch literal 1272 zcmah|TTc@~6#k|Z3T3sla#gSkqPAQ*ig$_-Bwk305K3x%oVJs)WV_q!rD}{n#($tM z#c1M-FUB8bJhNK^EfurL&dj-d=R3DwzrTJ5u!4;kA`Iz@UFW7REbd6x<1eIX+OKTK ztQMuyG%7NND8tB+XbNr$tHyWBN3!BE46GTJ;jJ_DWwIrP=$2iTar9wGLq7%>5(UGO zFa3I1ItQX`N`_Ryt_ZUv97Da^!l-v>xD2y}|Io-&#G3SW+!_PV6i)aQJ;$(W`D`G1 z%ip-%ae2jdB;S{A!?s*Wu2cKI6 z4$l8==)6ELhKooL z)Ck=Z1eT;TMbb+yMlq($72tR%nFwMCGFP$F-!S<)b@>?6i!G#ExVDqT&o8*S)WUKL zcRrCx1S)!*PKBPNPchI#_cj9p!UH^{2ub4dh;9+muLj=vfY&hT+ML$#H~^&CqIq18 G4*dZy9z^Q^ literal 0 HcmV?d00001 From 6f242c6c85b77eeeb7758d9a2c2901a73aac7fd7 Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Wed, 27 Jul 2016 17:26:57 -0300 Subject: [PATCH 02/19] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f76e0b2a..240257ee 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Por que trabalhar na Contabilizei +teste **Eleita a melhor startup B2B da América Latina em 2016, a Contabilizei** é um escritório de contabilidade online, líder de mercado, com sede em Curitiba (PR). Nosso propósito é resolver a dor e burocracia de micro e pequenas empresas ao se manterem regulares com o governo. Somos contadores, só que online, simples assim. Acreditamos no poder da tecnologia para melhorar continuamente a vida das pessoas. Se você tem espírito e comportamento empreendedor, muita disposição e proatividade para trabalhar em uma empresa em franca expansão, você é um forte candidato :) From 8264a80a4a1c14b3316dc5f41748ba44ae7befce Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Thu, 28 Jul 2016 15:41:39 -0300 Subject: [PATCH 03/19] cliente, produto e pedidos --- .../HelloWorldController.java} | 4 +- .../main/java/com/luan/models/Cliente.java | 33 +++++++++++ .../src/main/java/com/luan/models/Pedido.java | 56 ++++++++++++++++++ .../main/java/com/luan/models/Produto.java | 42 +++++++++++++ .../main/java/com/luan/tests/TestPedido.java | 48 +++++++++++++++ .../main/java/com/luan/tests/TestProduto.java | 24 ++++++++ contabilizei/src/main/webapp/WEB-INF/web.xml | 2 +- .../HelloWorldController.class} | Bin 1272 -> 1295 bytes .../classes/com/luan/models/Cliente.class | Bin 0 -> 1103 bytes .../classes/com/luan/models/Pedido.class | Bin 0 -> 2445 bytes .../classes/com/luan/models/Produto.class | Bin 0 -> 1157 bytes .../classes/com/luan/tests/TestPedido.class | Bin 0 -> 2174 bytes .../classes/com/luan/tests/TestProduto.class | Bin 0 -> 1009 bytes 13 files changed, 206 insertions(+), 3 deletions(-) rename contabilizei/src/main/java/com/luan/{rest/HelloWorldService.java => controllers/HelloWorldController.java} (83%) create mode 100644 contabilizei/src/main/java/com/luan/models/Cliente.java create mode 100644 contabilizei/src/main/java/com/luan/models/Pedido.java create mode 100644 contabilizei/src/main/java/com/luan/models/Produto.java create mode 100644 contabilizei/src/main/java/com/luan/tests/TestPedido.java create mode 100644 contabilizei/src/main/java/com/luan/tests/TestProduto.java rename contabilizei/target/classes/com/luan/{rest/HelloWorldService.class => controllers/HelloWorldController.class} (52%) create mode 100644 contabilizei/target/classes/com/luan/models/Cliente.class create mode 100644 contabilizei/target/classes/com/luan/models/Pedido.class create mode 100644 contabilizei/target/classes/com/luan/models/Produto.class create mode 100644 contabilizei/target/classes/com/luan/tests/TestPedido.class create mode 100644 contabilizei/target/classes/com/luan/tests/TestProduto.class diff --git a/contabilizei/src/main/java/com/luan/rest/HelloWorldService.java b/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java similarity index 83% rename from contabilizei/src/main/java/com/luan/rest/HelloWorldService.java rename to contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java index 30c1b5a2..0d21ec89 100644 --- a/contabilizei/src/main/java/com/luan/rest/HelloWorldService.java +++ b/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java @@ -1,4 +1,4 @@ -package com.luan.rest; +package com.luan.controllers; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -6,7 +6,7 @@ import javax.ws.rs.core.Response; @Path("/hello") -public class HelloWorldService { +public class HelloWorldController { @GET @Path("/{param}") diff --git a/contabilizei/src/main/java/com/luan/models/Cliente.java b/contabilizei/src/main/java/com/luan/models/Cliente.java new file mode 100644 index 00000000..6bb6733c --- /dev/null +++ b/contabilizei/src/main/java/com/luan/models/Cliente.java @@ -0,0 +1,33 @@ +package com.luan.models; + +public class Cliente { + private int cpf; + private String nome; + private int telefone; + private String email; + + public int getCpf() { + return cpf; + } + public void setCpf(int cpf) { + this.cpf = cpf; + } + public String getNome() { + return nome; + } + public void setNome(String nome) { + this.nome = nome; + } + public int getTelefone() { + return telefone; + } + public void setTelefone(int telefone) { + this.telefone = telefone; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } +} diff --git a/contabilizei/src/main/java/com/luan/models/Pedido.java b/contabilizei/src/main/java/com/luan/models/Pedido.java new file mode 100644 index 00000000..867a1659 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/models/Pedido.java @@ -0,0 +1,56 @@ +package com.luan.models; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class Pedido { + + private int numero; + private Date dataDeEmissao; + private int valorTotal; + private List produtos = new ArrayList(); + private Cliente cliente; + + public int getNumero() { + return numero; + } + public void setNumero(int numero) { + this.numero = numero; + } + public Date getDataDeEmissao() { + return dataDeEmissao; + } + public void setDataDeEmissao(Date dataDeEmissao) { + this.dataDeEmissao = dataDeEmissao; + } + public int getValorTotal() { + return valorTotal; + } + public void setValorTotal(int valorTotal) { + this.valorTotal = valorTotal; + } + public List getProdutos() { + return produtos; + } + public void setProdutos(List produtos) { + this.produtos = produtos; + } + public Cliente getCliente() { + return cliente; + } + public void setCliente(Cliente cliente) { + this.cliente = cliente; + } + public void addProduto(Produto produto) { + produtos.add(produto); + } + + public Produto getProduto(Produto produto){ + for (Produto p : produtos) + if (p.getCodigo() == produto.getCodigo()) + return p; + return null; + } + +} diff --git a/contabilizei/src/main/java/com/luan/models/Produto.java b/contabilizei/src/main/java/com/luan/models/Produto.java new file mode 100644 index 00000000..33d04a50 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/models/Produto.java @@ -0,0 +1,42 @@ +package com.luan.models; + +public class Produto { + + private String codigo; + private String descricao; + private int quantidade; + private int valorUnitario; + + public void setCodigo(String codigo) { + this.codigo = codigo; + } + + public String getCodigo() { + return codigo; + } + + public void setDescricao(String descricao) { + this.descricao = descricao; + } + + public String getDescricao() { + return descricao; + } + + public void setQuantidade(int quantidade) { + this.quantidade = quantidade; + } + + public int getQuantidade() { + return quantidade; + } + + public void setValorUnitario(int valorUnitario) { + this.valorUnitario = valorUnitario; + } + + public int getValorUnitario() { + return valorUnitario; + } + +} diff --git a/contabilizei/src/main/java/com/luan/tests/TestPedido.java b/contabilizei/src/main/java/com/luan/tests/TestPedido.java new file mode 100644 index 00000000..a38fc1b7 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/tests/TestPedido.java @@ -0,0 +1,48 @@ +package com.luan.tests; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +import static org.junit.Assert.*; +import org.junit.Test; + +import com.luan.models.Cliente; +import com.luan.models.Pedido; +import com.luan.models.Produto; + +public class TestPedido { + + @Test + public void testCriacao() throws ParseException { + Produto produto = new Produto(); + produto.setCodigo("ABC"); + produto.setDescricao("DEF"); + produto.setQuantidade(10); + produto.setValorUnitario(9); + + Cliente cliente = new Cliente(); + cliente.setCpf(1234567890); + cliente.setEmail("eu@email.com"); + cliente.setNome("Joao"); + cliente.setTelefone(33333333); + + String dataDeEmissao = "2017-07-21"; + Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); + + Pedido pedido = new Pedido(); + pedido.setNumero(1); + pedido.setDataDeEmissao(date); + pedido.addProduto(produto); + pedido.setValorTotal(100); + pedido.setCliente(cliente); + + assertEquals(1, pedido.getNumero()); + assertEquals(date, pedido.getDataDeEmissao()); + assertEquals(cliente, pedido.getCliente()); + assertEquals(100, pedido.getValorTotal()); + assertEquals("ABC", pedido.getProduto(produto).getCodigo()); + } + +} diff --git a/contabilizei/src/main/java/com/luan/tests/TestProduto.java b/contabilizei/src/main/java/com/luan/tests/TestProduto.java new file mode 100644 index 00000000..9a0c1576 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/tests/TestProduto.java @@ -0,0 +1,24 @@ +package com.luan.tests; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.luan.models.Produto; + +public class TestProduto { + + @Test + public void testCriacao() { + Produto p = new Produto(); + p.setCodigo("ABC"); + p.setDescricao("DEF"); + p.setQuantidade(10); + p.setValorUnitario(9); + assertEquals("ABC", p.getCodigo()); + assertEquals("DEF", p.getDescricao()); + assertEquals(10, p.getQuantidade()); + assertEquals(9, p.getValorUnitario()); + } + +} diff --git a/contabilizei/src/main/webapp/WEB-INF/web.xml b/contabilizei/src/main/webapp/WEB-INF/web.xml index f5322a94..0098f2a9 100644 --- a/contabilizei/src/main/webapp/WEB-INF/web.xml +++ b/contabilizei/src/main/webapp/WEB-INF/web.xml @@ -9,7 +9,7 @@ com.sun.jersey.spi.container.servlet.ServletContainer com.sun.jersey.config.property.packages - com.luan.rest + com.luan.controllers 1 diff --git a/contabilizei/target/classes/com/luan/rest/HelloWorldService.class b/contabilizei/target/classes/com/luan/controllers/HelloWorldController.class similarity index 52% rename from contabilizei/target/classes/com/luan/rest/HelloWorldService.class rename to contabilizei/target/classes/com/luan/controllers/HelloWorldController.class index b70f15dc10d29b2f5af302611d70b25c47e39250..52653de81bd93786efe938179b001bbbf054e822 100644 GIT binary patch delta 140 zcmeyt+0SKp>ff$?3=9lL4EF2{OpFYg$@#hZIi-nt`pNluB}Mr;IjKd(`W~q{Ir-uF hML8+XaM6kSY1-O8L@VF8?K_jGBsPOK?`O7T1OV&~G=l&D delta 117 zcmeC@`oXDx>ff$?3=9lL4EF2{OpFZj$@#hZIi-nt`bDY5CHfwzIXU^^`9(P?!Kp=M dnaQaWEz=YgeF!MpcXsSj<`(VchUoAT`9$y zEOwbsEt!vPY)R85Gyk2_7^>ciAtHHZ!;<0+O0q)*>mpgsef=&F1MK`QUW&u$Go#9v zGf@zB~alrNe z~xzAcd`ndJ5}CZ&}2TLKEzQ8NbhR_ zq*V&?2*+z6FK*E*g6y+hdjp6VEFdSPj`WL;bV@;u@vaJ+PVR zR2QQ_U`hDc@`&ThNlx1mZ)ER5dF2Xl^kglrOn}ysksT1$q!9 z<}sFwI|%d;p$}Vy5{P9TgTiBo5bYC%G%fd9RqTu()^VkS)QhW^W{5Uq2SFcE2(CtH zzX(zsvYjP)Tx*sk#RS5hP?#arcw;piMpSr5$1q0N#iZDBn$4Z-Bau^Pxg4gW(8D%7 zD=Z$Sv4IaYe4sGg?mJ0N#|_+MpAt!7B1}CphK0p1+4Qxb485AZ8G~%v^-@^tX5O^y z)}eVKEI-zLyVX-@fHUXN4E^`!VN-V2@ET|{cvoJ5S}$@O}dK;)tspGb4hixB61YCboRUTeuw}{z$~6q$r4I z_();*7fi35;Zudbad&6=DfaXH`x*VqPq=+g;iu>SDiI-2ILid&U!_T0!#vj5@>j7! v?PMEDyz_Scj&t?Zz`ZTsV$vj$@Y{RIJ*>BnHMurpdQiD1qBl+`otE$b%uVB7$$FtG-M>S>|wT7#Q%1(O9|{vB0v zcTLnK*JSR$3yw_PyCoZR>+HJMfr(paP(b~%fL73{Hq*w-W=V@jCYqAcX3Bq;wE8?= zB(DD|5R=UO1)s?K;DDJmzPAodrsGZ%(kzl7i!941J?J~v4Sv~-ig9iD9k;(`vNl&E zJFMXj_adbL9c(fxbg{)%l26%0V>E`3uh1*9o7w3)bIhzl?^=~tkm`acjqhS7uT_A2 zL+=ZVYA8Tjl_2-3LHcEoO}6W<01=M_&DG wBp?rQnAci%WdC!?k-bWgqiT@jGRPr8j#hxkUm_qUl_1AukdsOfE5jZ90jfcxZ~y=R literal 0 HcmV?d00001 diff --git a/contabilizei/target/classes/com/luan/tests/TestPedido.class b/contabilizei/target/classes/com/luan/tests/TestPedido.class new file mode 100644 index 0000000000000000000000000000000000000000..f83f0ec163b4b8f2a08e466466cb50b2ab4e8128 GIT binary patch literal 2174 zcmaJ?TXz#x6#k}7nhOVsp-@slkZVGc1}ciSh%IRft)aBEjo<~HW)5ZQWF}-LSagY3 zyo=Z6i!Z+U=32Uz1Iw=E5Af07<8t|(N!rp2&cm5=W?#PXPV+K7tMn zsj5>eSWVq7c+&OU!VK3*X_$r+K}bVlLBFXNEZv?jT%22wRZm0LY11~nGa5S6nTm!` z(J^Ekornp9(WPNq*|g)D zMcP$$M?<`{Se13pbZj?*M>XsUg7f5}SD4fru3Qll)}^NHnKfB4U6XeX+qUEBfh94O zoyL4&p-B`0+`$NTXy{pqqeeiMTbOJ(M$>cR=teAxUBo+lwx~|M0=uzCL(G*P!JG38 zZAZGinyG28VcPS9nMxFo(QKqNs?7EaJg&?H%|@hKZI}e51P28U;jo6S6il%ao@wX? z(-umPWhzSHs6bjNB&bl)EvGTd(3wq^=-4KK7cEoT9&3_8taI##j=$BePoSWDbg7{0 z*P=MVNMv(J)^yYABX*_qguqD^Vw6fHC5YlF#xd@wKr?t+;29;3P(0z(WT*DePqRvJ zTHsmbdfb{IFB(#P?|Vb9-BU|xD~j3KxHtFAv~|hSk`cKle%oQ zP-z~*guq2iGKjh&lZHc^*k&FuRH2sFSi3A$XDi)4C3($z&x*js76HjVEIypIoBepkwJ@_)**;lj2R zx!a990w3YyR(hA`OZRdTf>GQaFzkbRYe;e6J=7(&s;!BznbtB=!ZOx!u-#c}FAPzM zd`YZt0}hsYzr@F7Ev$bYHoL zo#kw@$44rg-0NdsHWBx6Ae)H!II@Hc<=G3lWX?xEmptyHKbL&c$EjR$z{g>xEP}>*J+VIAQpBH5I16xp*q<D(P7-c5iH^;ZgY@-f@Am=S^S6`enuX@(}T+I znO3&i`HkWiYJSRmrg0aa;d54`2p3=AOJ;qR!{#o&Vur8cGQP$)ETu-Ts&3!?2iChC ASO5S3 literal 0 HcmV?d00001 diff --git a/contabilizei/target/classes/com/luan/tests/TestProduto.class b/contabilizei/target/classes/com/luan/tests/TestProduto.class new file mode 100644 index 0000000000000000000000000000000000000000..0ec1bd683b448266f025d12f427355292738e4b3 GIT binary patch literal 1009 zcmZ{i`%=?D6vn?TEp0=95CTZW`-O%o@iJbENGUMFbi9F?@z2m^YM3<9Tzmr`#7FR- z!sv_-;6pin+g4h}F`3ytyL-;r-?!)d`u+VUfP2`^BO_31h8@dKoxn=mIEk$Tj<2Jz zl_p^xSpn_H`RrJ}6SS>YhevKR5g1?d0xww?7%Q8$K(-#XTm@q&s>oqnV7lQ2?#r}u z=tc+5q3;Uljj-wXwi9`BJ=n}9AG}y#sque;s=$QAsxz?ZgaV6i(;)FWuIwm+qg&v#lL)zq(PbtLUzr;m77WuuTnCB><@9NR~JiWKos#UnhXN_vc{ zWN++Bw5Jk+b7 zS7f;h?Eb*a`(w;DD!S3dd_^yHu~gBNE-qEHVi(tRqteCA6RhYZ8h2 Date: Thu, 28 Jul 2016 17:38:12 -0300 Subject: [PATCH 04/19] dao, mongo --- contabilizei/.classpath | 20 ++-- contabilizei/pom.xml | 7 ++ .../java/com/luan/dao/MongoDBPedidoDAO.java | 95 ++++++++++++++++++ .../src/main/java/com/luan/dao/PedidoDAO.java | 12 +++ .../com/luan/lib/mongo-java-driver-3.3.0.jar | Bin 0 -> 1540617 bytes .../com/luan/dao/MongoDBPedidoDAO.class | Bin 0 -> 4587 bytes .../classes/com/luan/dao/PedidoDAO.class | Bin 0 -> 368 bytes 7 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java create mode 100644 contabilizei/src/main/java/com/luan/dao/PedidoDAO.java create mode 100644 contabilizei/src/main/java/com/luan/lib/mongo-java-driver-3.3.0.jar create mode 100644 contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class create mode 100644 contabilizei/target/classes/com/luan/dao/PedidoDAO.class diff --git a/contabilizei/.classpath b/contabilizei/.classpath index 8d409085..98c0f02d 100644 --- a/contabilizei/.classpath +++ b/contabilizei/.classpath @@ -1,10 +1,12 @@ + - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/contabilizei/pom.xml b/contabilizei/pom.xml index 332ecbaf..1c46415a 100644 --- a/contabilizei/pom.xml +++ b/contabilizei/pom.xml @@ -30,6 +30,13 @@ jersey-server 1.8 + + + org.mongodb + mongo-java-driver + 3.3.0 + + diff --git a/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java new file mode 100644 index 00000000..de8b7461 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java @@ -0,0 +1,95 @@ +package com.luan.dao; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +import com.luan.models.Cliente; +import com.luan.models.Pedido; +import com.luan.models.Produto; +import com.mongodb.BasicDBObject; +import com.mongodb.Cursor; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBObject; +import com.mongodb.MongoClient; + +public class MongoDBPedidoDAO { + + private MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); + private DB db = mongoClient.getDB("contabilizei"); + private DBCollection colecao = db.getCollection("pedidos"); + + public void inserir(Pedido pedido){ + + BasicDBObject document = new BasicDBObject(); + document.put("numero", pedido.getNumero()); + document.put("data_de_emissao", pedido.getDataDeEmissao()); + document.put("valor_total", pedido.getValorTotal()); + + BasicDBObject cliente = new BasicDBObject(); + cliente.put("cpf", pedido.getCliente().getCpf()); + cliente.put("nome", pedido.getCliente().getNome()); + cliente.put("email", pedido.getCliente().getEmail()); + cliente.put("telefone", pedido.getCliente().getTelefone()); + document.put("cliente", cliente); + + BasicDBObject produtos = new BasicDBObject(); + for(Produto produto : pedido.getProdutos()){ + BasicDBObject p = new BasicDBObject(); + p.put("codigo",produto.getCodigo()); + p.put("descricao",produto.getDescricao()); + p.put("quantidade",produto.getQuantidade()); + p.put("valor_unitario",produto.getValorUnitario()); + + produtos.append("produto", p); + } + + document.put("produtos", produtos); + + colecao.insert(document); + } + + public Pedido buscarPorNumero(int Numero){ + + BasicDBObject query = new BasicDBObject("numero", new BasicDBObject("$eq", Numero)); + Pedido pedido = new Pedido(); + + Cursor cursor = colecao.find(query); + try { + while (cursor.hasNext()) { + DBObject o = new BasicDBObject(); + pedido.setNumero( Integer.parseInt((String) o.get("numero"))); + pedido.setValorTotal(Integer.parseInt((String) o.get("valor_total"))); + + String dataDeEmissao = (String) o.get("data_emissao"); + try{ + Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); + pedido.setDataDeEmissao(date); + } catch ( ParseException pe) { } + + BasicDBObject c = (BasicDBObject) o.get("cliente"); + Cliente cliente = new Cliente(); + cliente.setCpf(c.getInt("cpf")); + cliente.setNome(c.getString("nome")); + cliente.setEmail(c.getString("email")); + cliente.setTelefone(c.getInt("telefone")); + pedido.setCliente(cliente); + + BasicDBObject[] ps = (BasicDBObject[]) o.get("produtos"); + for (BasicDBObject p : ps){ + //pegar produtos. produtos { [produto: {}}, {produto:{}} ] + } + + //System.out.println(cursor.next()); + } + } finally { + cursor.close(); + } + + return pedido; + } + + +} diff --git a/contabilizei/src/main/java/com/luan/dao/PedidoDAO.java b/contabilizei/src/main/java/com/luan/dao/PedidoDAO.java new file mode 100644 index 00000000..e59bf60f --- /dev/null +++ b/contabilizei/src/main/java/com/luan/dao/PedidoDAO.java @@ -0,0 +1,12 @@ +package com.luan.dao; + +import java.util.List; + +import com.luan.models.Pedido; + +public interface PedidoDAO { + public void inserir(Pedido pedido); + public Pedido buscarPorNumero(int Numero); + public void remover(String codigo); + public List listarTodos(); +} diff --git a/contabilizei/src/main/java/com/luan/lib/mongo-java-driver-3.3.0.jar b/contabilizei/src/main/java/com/luan/lib/mongo-java-driver-3.3.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..ed47962f8c280379f0e9a790ddeb831fee664b14 GIT binary patch literal 1540617 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 |Rqo`uc*vaTXN|Pmp@L5cT?a%{vw!roC}w2 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�R9)9_&VTy|(q#@l$Wesuk!j2bEthkU0Dk71IEA^vU^O!3V-|0Hfa8`sd(x1SyZLP16{1d8d^R(iLTjf?h{05|8 zPn6*XL(>AmbWyjXupeDVss9A_7!9Rv2*}tr289C%2&Aw@k^{$)d1E zAjtR8>|aA;2m-L)@sJ0hWahPT!wlh7=%wXn@W=VwZgb94@_EX}^OOyzXtPdL)LiW= zMsw{$k()TqKM^!*1i&1$d{jxNnmSYUV33<_+_LI@f(->tm>%i6I7s<^S= z+I=n-e~>-b1-TE)3woLJn>AGioy_T`OVxga|LTD9Xo!Y*vhD~@RX{6#VRD^Uy~xLH zORzmCc7|1-zx)+_b#Um6S)1q8mhx>U`GKOg1n}f-l6bz$dBdP_AxYuV`%Uz67XHr( z71eHeT{(hY#N?()tUkhe4&Wl?F>UeA5KR6l>2AcR;@M>fjb(i;>L|6;2{{_oDqOY< zP}QI;I;9?8=tB2{YmwoI>t4P9<&-P+gh%)|-F(A^PE-}dpQBZ3aZY~Jjw8iO+KyI^ z9V+uzw#DU!@Iwq^#|s-(?+H${EubFOWX+|zVm2in!SFVlZKV^Xmn)%nVWBgzM5({v z+XlPP4w=^256d0XwJ}_jwFW_LkD!)22-?HbgZ*}%=`l@@0}f!3no~L`j$BNQ=11Q+ zWa-bV&|-LR|IE($Kx2R?}WbADOTVyJB?G3JjC#+Tkdvx)LXw?T7p0Q{+g7I?u8 zxsYGj!CY~hTo#;eqz{YDY_0zoE#+3#^Rk3Wy+Rxn#C=uGOPqkSCV7SYDYMCX8MV-! zMvr>ZS!E=h{zcf!DIxa_|0T)6XCxFy9SZ0M#Kz#nLKf|Q7VQIO+`HMt1R`6R6#MuC zge^G;H)7svfr>R~KKcUHUr|f;h}KT^oAk6|OfH&XQnj>=%PFf?;}^}wZ1x#(7+i{` zb`=wJ*{LcTOoc-!xrDUo!f~1#`A-zhZb6T+BL>>|9Dvh8hg>Cmwny?O`T9xSe-4K+ zkNGU*92qj6rywJZddK!Jm55q_%|--#^oon}T^>mlINxD&1{rc3lD==W&d@>SPg;z#8vn{q$3Ia#&gs@S7an zhth*FN&3M3>pMMShD4v+S3bz{OK+F_fA>zW;ArP+@&9pst5w$>=he`3$-60#V^DSW zP(Up}f$?w^B>e^OHjaeGhJvMePG?$;L^%ptL`l;T-k=G95VLuTnB$zsWC&hoVhuIK z)w1=AbxhrFW@q_c8~$)vjemB(pW6W`w-pNmJn$hIi;06yfv@Py+sbwmVn|9@Cr;X; zsc}q`%_Il1LMyo-7^~mLEuVi3AmSXc(m=s2^OUOkysT(hOH6mt62Risa@cMvxDGfk z(atktczR2LjB<9GyqW}P_&Umd@0O4c$dBA?P+ObKI8-yK7L+d8OKYen)79<@8*b|{ z@B$&HDw$`=kgL3^T8=Ib;cgaBIjxjA(p~m2tktHY&YtkYiw#7o)b8$;e;y-#7QumE zt-$T`phU6dst$AQx|G^3VJvgou2|2x{;GEp`xWH0Cy@sKe39PUCjlJb%N~u%@v3G-*>6E>^FDI`U{oT`7s zuOfNA++uyBCVr;~l*kVYC01 z*1%DcQmf1nj2uv?o5nXN=p2z{ibsc_^Dc5RTiH-mjU3iuHLyW3S=0ib~Dk8y4*D04sA_h>f*zt8v;U{UA$9?ly6RRA^ zFeZLUZ`s9p*MZtl&+Bar_d3D#1bpns?4s{+bJQhEx>Pyi7HNA*TQjnJ1Hv)_?M43( zoIsgSW&1Gp4x1z|jromJ7tiIJ>^o zV_t;eJ=sSSN-Wn+z8DgzX-1|}ct#A;{la$g5eMVP&lkjl?Z2(tEDdaz{wt3i^~I|D zuPniT=CPgrMWs_&x1AS2;?0z9b&=5)63$41(2|l=DwA$E8Wct$RAu_!T!s?c(#Tqa zr+o+Br`HGD^qny0nPRXi@gbpv>dC;=?au_~{%w`t=ko_@FPSqqx(X)-Ok1dEOhzDH z4Ru=pDfoDsW-p8_C53+SKAU*9U__AI`Ojwhi!{MXT)`7_HMA$KC>ip)#GD(WE`t?8 z`E&4YRA*Y7v^?g6H9>WT39K6WALP8!!FICag%Yz+*7NJE!s=I$eWO?YarxdcCa5X?$Fo+wA;lc<|`5Rg4oqrH|VR_vn_e zF^1I|X(wu+RCNM|>+|=%eY59LxrK`5%qeq^G`q8p$!BTd3f0sMIZE#?gwNFBgZ3fy zS$BHnbr9J=_A=cYYN-CxV!uIwz(0yO&vBJXJ5A*Hk#kOxkKKvJlPsXC`HINVoRNf` z;j-Vh(PAbR@2kc(NfL0@-Y7&+&6crZH;&nWYGrXTJ|FI?Ofs+}f%*bks5iL5AO;WuKpb=>$wMeB zI6$*ZHm&F5PK?mw`=c|5jhNnmw!2N*jS%SXQ9luqH9mz*9J9EDUa&M6Q&SW~dfYWO zDZi4m$tXq?mg7Thkke1!iE#ct3>P6pq)G6+1QYy5sw2yIxG<&MF{mVbO5PYTruSFh z=t^cLYW#J^Lcf@sU#aZBQInKRO#gYteyV6IYpbGtxYA`MB0<5ou9@Q+(#C-mn4`le z!G;IwG&Lz$YC9$1?d%XjI+eGc`rWLi^I7U)l}oPd$-)|Jf85fBVBnNJ=<= zOXyYGbywZh-Mr-Xhv4($4%Z(!O|Z$3E1bgAc`(Qwvk};HYyP%7l+$8r{Hv9y#!MZ> zWAS&Ec9D9TY7=+@h*?7VCyA?Nm#UHX(3ngvHJ7T%%_8Hn<^^500+u6UhMZ zHK!Px`2$wz;TX+WElSMlelo@UUy5uEVx!KCw5V!*RPrznh*@H}Q%r4CJDIL`(Qxz{ z;7;WYiL6oV(N)!VoSbTgb>DI-<@7wpsi2+d4zjWzVw6{$?^Yis7F?WyjE8e_AKF>o zGEF^Vx=wJgte1W=zj<}!6aJpjlI{=L0(mXhcDm`hsV!2j?=#o#20LJ$?|v9 zl=BoV-+CECht3>~_>)~^mGopVGMhZNY+2&3WI>eLbiNRJG&B6UwxqI9m{Cq+^6Hi&jmVeh2S_#$*C2Z>oolTojb24k|=4!1VX z>r|1~wntKgT}hE&!u$iRh<-$K2?f8w*7%gk9+BNs>L7h<3gK{txk)jGI1=T`4xk?! zwC?y+qZLw$b``&7G5b&TN|w0|(y`np=np`%3hfwYVGTmN|Jfo)?JX%keib_eJsZ4l zmxX;EJc22OqHj7`PxnZE-{WHz3w}>4q(IH;i#%52!DpBvD-#L4n zg%;=dW*rDSk`-KnnE{X}w$f!p8UfRp>EV3)-xT-C6v7^7e@>_Wh8?N~bhV7hmU5Ag z=uwC%y2oH$5E3>Zi#rO8{ec>_ZD0e0Nh$WO)t+eZ52i~T0A-O{FU%*rf{oe_1e*x2fu(x!dklwWGcWN^=1OKu_%-`9HPPam$dJXQ+?07jRa zm0r`lj~BvzANT77K&JWt2bkqT4txMg3VPL`J<1`Nngem<^q$0iNm`YtgLHIjNGXxy z6$w(mC&;yd@DpF`9xSqgs)DjTd!&~`v>~&c`Qy;OG&mxfckzx@XxRX+>AH)rF@>6S zsbWQ|O=ZzK#PT|ehPG+pzIl!06#8zJ=k7gRJor4*rfBH>s@vFv4O4J%6rm;~ZTFVN zV!M-iCHrV%#Y)H0#sZ%51h3hMk8umOoQiX&s^zNM0NYvdonx|{q;X$}c8AC>pYU-e z-Yf2s@$BcmiD%%cN|b)hdfHTe7t+ZQM5b(m3Cv`|HxVn>GV8TcpaCR)kkL2~WksPR zdaM}4;H%%BRY#UD``l|WD&jSU4Sk!uMI}pQ)pM&lCfZ&F$r%}o6q4k{!mi?^wa zb(zqXk9*RMyU53ta?|&&JOBQ&%|!dUsZBIm{KUR?Ws-~(CBUUxG>Xad;Ks8U8|6oL zTEfMr?DTzjixE>TB=1oosbRl}(c}qz*S3O6-Nh!aAQSf8Y5*+7;~KZDj=ss{;+fWZ zAtMcCwbpPBQd*w;G9|;ySiFMa{G2$m&>w7XfoZtOC1er*VU-U~4L)>=x5ypoU|+!} zY!A?2AUH+1xI#qJZ^RTk!Wlmw8*Y%vfGwb%#rW5ZzWvclLN2LSJ0TJxrzw`XCR!7v zk#PMLB?9!Ei%eG95oM$c2X4>m%%p-8V~9D5G=k$BVobNa5vqju2*BM@U1Vz)}u&mv`2_}i4=o2lHL!35g z1Q+}j7d_;Rp@LaBzM!wbIxVeej{mX}J-)`OA#cs=68#s2k?E+o_{{tXSr_`*upi(g zXko=Ey5~e#D@7vx#{%DP4!->1w5FOJDv$x`J;z&x<8asTVUcczca+mTx)}cRpllA2 zFRfM5a84R`BupMdsUKBs71QtEG&{>!_pG-J2(et!cXv^i;b!>*X^4~>9 z{{cXMdooa#wfhRieQ*H|xO2fpEFnO}v}g$&KNaaENX7z)NQ!Rq$*2O?haK=!2kBar z7d{9)$MSW`z)-{y-oE1T%TOg^5mJP$=bMSl^w!30KkpA1ebC=5Xd7zw;(b~;C|5AA zIe`sWDr$j@<2G<%#D~H{pQ$S|p47Ag3h&ag_&NsO?CO#vGh}d`aAaKmKNz-+{`HpZy z+ogOf+}Xd}yX6|!ZJH>IYWAJpFPXbB!KYkl=8ryBNZ)-LUvFf#qPA-CUw^7aCn25t zF*vQMj=8fR33pV4IQ|M4!-Y5sr;d3ix`Wuj4VD(fy-On8bQrF&<*6TZj=CMMfsKPR zjW1abzXWG|Jk~|VwuE4^ih}qIjAVC&5CT(Czh%VCM1%8!~0>S1|4!DOnI++Lt9w8D>fDp+k5NVK(RU=AQ zhm9aM?iTRW!8O?# znkLLjFqYI&xAdc*kmim=BBkOC`QSk0J=FR)s&R5RVqCGLBT7+JXe0}?La{Qb)S0mr zST{0@8k}Ou&t!X4X+;O@gamY*&4Q1ChUW0jU=~jCjUeVh(vrbyu%)xVQMfg8&#kP# zZpH~;=alsCXVk>hz{T2GL`c}c+S<^-$m-vW=a7F_Tw7&ke%(qnkp&U8X4D=`f9GL< zX$cZOaB$0Yuub)LK)hFaqQJZWzn7g{kqL_ZW^g*%a=J?QGTYk9)dRjTniPcL#En8g z(P*f*CblyQF}Rpn_I00#qd~)kQyXF-9dMppzWcTP+t_}RS2TS!16haFeMkJ3!6L+_ z2N1_OuLXfV5_R=SIDj}}!9#xI@RmgJwl2~@nLa9zLnfv#TS~m-QObj22F5-9FKnxdY z#SA$*LSh*k_}(1DwR|5Mxg|zHuOnpv4pE5#Vs08fA*L4Tp6?EgyaIO)gF8%YBR-L# z5VIB#jf3QjnCHj!0_H;%l3EB3YE^iDZ~Ddkt#w)F3r>(HmW+B zuN{h`FcXa!up+XSqA*kmoi2?8Izo)%fm^~Q((=8CjyZg6eEk=LRn0sIM zI;>vsU%j^l1Uh&h7_o3+r$L9} z>e#xklvoKya3q%tNboDh+!A;O6azN6pJHtcvH2 zm+B^F^F<-1i;@?xxeP@b(br{f@#4C2g|R~ zHhME*AnJ1s{2FtrJ5p3!z}asxSS?9?g(k7r7J@0*0qZbZeVrhGz74ckHmYduzWIO? zgag8!B>LcTOjowPe<_MvN)f$7`QH@n7KmIpFFMejR->+MK`>p?qZH&YgxVl{=_ z*WSVxTPmn*@TSR7JYj4@OKs1yZr`OKep9mtg0vX4hAuqULoi9SeXi@gB{5oArTK*G zY)wmqyIfrU*-?v}rIaw2jkD-`c2I3*@1JBkkyV(nmvdnqNUpD*E}G8ub4raj(M1hr zFfbFd)Db2`=(lopL~M|@d@zyRkGH5*9?k=;t(-*SyqBqzQ2)osZj@!{_UcHSh{2*7 z6ou0Y2J}ZR4SLe;aZ6jdo~scr%A-0;y?;jN#(tqlxR+P_0Q+N|03 zHa3M~cy1P^n0*w-;!CgwK>Z<#4ChHKk#K~H>!kQbBpzn54ZZ9G(#a8H zj|cun!XFwI#S$|+X8t?OFT@M~M`-TpBq^`w;i%%NAZ1?Ux8M+QC{mg?iOS3+pH91c z8_=xqSKC7Im8cES*p1Lfx2Bqb>x2?s^b&%^5=fXc(!19iifo2b^DVgA0$wrEtG1}A z)e*gwKd4OcE@0S8_1Olt#`xS=w!3&X9avWd+$)Wd*{$}T_r|}x=cwhyA`gN(m+IF^ z5s3P7zB)_UF4u*DL?tz7*vd6eJJbD~eLDmQLSs?cE6a2(ql{)lI zBOM8>8gv4qZ?eo)xqJUxHHY-vZJFqoFU9)urT-<~`?oLsml({yU8#@4tki#qmsEDz zsF`X)BlAAw@imcx3C;>SsK+rz( z8I{neky4q8)#oZRPW*-!GeU@UWs$1Kk7N6hTu#oeIU!Lx&Nyk>lwrv{~+qT)UZFg+j9ox2Tr^B7K=C`kXX76>*sULM!jrvz(ybo{W zXmj3~-+mi&Li2$NEDvNx37^{quT5Y(0!l6u}9WGlyhJC6&g)!5sP|-h(ZPjLvyih<2SrC}@Z@Omj)-Jj!--x!O2by0Ya1 zlHN%QWtE0%p(6Zgj#!zx!}o+`hY$a4{5BqtHoxnh#pAaw1Es_M-9#JN>j7(VY zcim4^U%*xSy`QEI?J-g{1piiXX@9l z*|d!go3m+LE-B865hN-3_;lv142`$^u=!(fJd;@wjd5vsZRs+n?-OajBzC8pgzy^R zJM7RBVccMc=oQoey+im*vOcGl36(x(a1m#l@ubM8kPg~RXc@fWaiy$4`Ko;*rb=Ha z&p{U9S#pQTB|f|Q&|+fmdiR*AgC`2Xs7BTilan&B5oGDdZCkZk@2DqW?MPAtxZI1Z zY46jJ)b;pU5Ta?X;9PBAknIlkVn=)=J2%z6m3gdlqC8mDguxPbxh#3!{hf2vlBFks z#3?r;x7$ErYOz;9ju=)?z87Kf8+Xz*EJdCC2;&g9Y0Dvux4e5bZ6q2WV?!nvuTXIu z;SH5bE!nv3ozJeguBDX(grVG=I3X$vckC3tewTF5kEQqJA}UFUd@MmdXFxb<>?|Ez_7TUOD> zaRo&iKQUefdNpV^vr%oM$`~D`jtRSK-C`{TPQ^@oz2K}I&M35tr^CvLW^sn;A&U!i zn3)mFGM`LO>>h!?8Umzh4*y3I(6JC-RAh5rO2<#EUeJePNUH%^`Mc6cy=jtTYCmp} z52t`k`waqErAVcNFiLSlRi|@|FP%45pUBmvJza&NYvf)Idt_igL?jFmBAZr_8O1WX zX^|U+CH@pD)E`b%`nF0osU`s^5iPe0wj@dWLJJ3m!tA2Adw_jIluGI;a?@U9?E;yD zlE_sk!!oT|Pz#hYo1rnT91lFL6D6uGDxv<=k7lkff#H>tr~wjKS7 zd=LL$k?%iu;Xlm*z}gWDfWgzupG>_*DxX)I+_2g}kfCNZpUz5$C7!Q<#oVu~(MUTc z*xXC|MGzml334|3Qug%Zb{fdD{w1M)1jPEs`Ta%8HcP_4F*?3fzY9tZ`Lpr>@h#=0ftUzz4#l&U z2vYf;@Hr(p<+9Rs(9fm|_T-du?8@W?B>5&*2hX65_}|i-PS|O|XY=cl9QA3Pd#N@9 zw@t8fuATU*-v(8__~lDrf+v5x{p_NLK#<+nYF$>N>JBb24>(ge%Hss$RWm!uz|PthOi<@imL+Y7!^gb!e1qT4e`an1Y(NtX@}K8YRzXB%0Kg zPc$mVZJ7jJfk^FkjG+C@23XeM#&Q?u#RY+HK=EhG8mL%l=2%Zb98ca1_rl^zv1MtL z?s?WqD`C%ZJREcUxI~G>M;SW!_rnxy;c*|Gr_j9n-Y%m94)kpni=HB?5jJZ~l{A_!j4WEMXR~TT&`em5_HunG zW*d)0V25d@$1A$&`dJi$GR2)l~R5vG8iq2c>yklT5*>~U3yb?V^9%3w^bF$~txgcmPaX}VmKZYRz>jfXCAnZ+kqaZ2WWI2x;U11pq z6SOa2kUPW3ny&qc5EtQAPNu%c+0W4W3{Tj-o!M3M%tnYC8I%)TU}47pfaS~O__k2c zx(K>3roGl>fwU9=JG`>iBCt^SQ%D?S^DX;WsErU#>800^yihnXE*hU-rk{O=lYOnH z)l+Oli38+{VT}z!S;>1rS(im*UM3H0bI3u?DytQmTT(jkv)_oKKXQ;u9L0C&k8TLG zljkq~5CswYa@`FoKQjJvj`%`Q>GxpOY%mt?JT;|YC600s~c>EAVwxucW0jiJ+jdvh9C8B18(S^X0Y7F7TEVh^BxMtfCITl?qt7meZ~ z^Xu%DU_##vlaFIT*9^mX+igmkiV10C?<46%SpU0WzFm_ z?qjFfVbXfD!tj23ZKa=-eC9^)Mi7g>%(A?~2uVS(y4F=JY&$ktS1$=ca2FfmS0ACuOk8XKYb z$fBKiWIETVZSYcI%i4)dA7eOA>!{EHBw#K`lMNu8G)!QcD>>h?_TbXy$W2Vev>?2L z7T`2KXz?ofbE%1VtB^w;Y&2C>aa*00w^e2&ZBBxlL~Ngq)`;M)8HK8nw<~eePH47BKRnhO+)+Zf2nuyhl#F=ySpjC1LgFt)f=w=Q`>Yd!OXZI0$J%(R zX-&V)B^Q~X0oJy?U29fajpV^yz}_%(f5R#{4w}Qath%|-2syce16Nfi@lRT{ujYJy ztebecG${2LDqqdN@m+1p=Vc52u1aPIjes6CuP^$rjMYPoU#}muqh(NlrMSYtjIKPe z&H%kW0pt7$_ln`NjtVQ*kiUg_^xYqbk@1$R2IGWhLHScx9;GS?GQg)^DSV zXtOZ{nYn%o$%Xvkjo}JUE3+={z9gTN z=_~^nI~>i;QjHzXOloHF9^YoO?N~MT^w*4I@beFZ!(_YR?E6@4u834}W8=XXwNb(> zw$F*=T_2jR4_H$kREJH*gxxGiP^sQ%~-P$%srPC4phk;zlX$?^>LO`y-!9ZiuiC0KAQ$pDt2#^_2 z*1VA0_QVsw&BDvU!OOqAeB@7aK4jSibRt)12=?^oRhYr$A^d7^3;G1HRqt1t zrG*WDas5XX-iJWovm0?Ef;~K;1^xbB_#1;xBk+r2T2U<% zaflt?!>iZ3)^s)sUQAZ4`vS#bqLmoic?#UlS%QKX<+x*LjH_+4T;$C5ctW;@*h zSvoApLq}{*(~S0)NLb@05vL-sKFQ*u=BaR^8uKQ#hXZhX;_{_i#PNm-e>>6|vMp+- z8n9>5a#stn2QHWsW$oIY{*0#>uszA9%I^==5f|j55*|PDMzR@c>2m_o@5t~x{r&I# zeH`IleuPUUPsBIZCovpJ-Z6(oO%$r)69F2To??imejm3|}CE-QNJ9dMx5&Pg{ zkxfO&vqV_vP$W`KdK;((D%?rh=Y?!*1YMGNb)tw23@m5^V2u8Dz!2?cth*u@d z+XrHqin&P11g#c7-+ISh%qG`T;-ocanL@NcgOf~RxUKS zswKvFPpLV5NQdb)<@+(i5!M?-uEPaPv)xjBo$P=`7W615YQD2DtG#RJ<{(u3Q#V{# zXQa1Qfo^KKRbD$3w!Ap6bg>aA5AnsuZ=Qta>GpoEi~F;VFl6pv6GWln64aDZO6^?A zxZJzALi;)NIWV>&iZbmbdm@DY`nbFPYJLei(Ap3P|ABp>hr}C*;7rVYG5EUkD3JF+ zR4}%O>i}f~_-^$>ee!}q*QH6t$kcL%b4R;hOuIvXZBH{1uA?4LOA1UY0$Y06`Tk3x z`PpapulWmSqSd1P*9gq=3w!Z@88X`%I$ImtI4Ro-3w|LmlpXYK98GK;tpB$6ops=;J>kKub9#g8m$yYC-4rWW~{(k z`3;E@8_f%4H~J#Di=Ud?@#-PXF*@exsG4pIXuZFa8C-svzTA)&4(yII91G1U(a6+{ zyg07cIZR_-&q8h1F5nA0^{}p&CO|`L#Yn6oJfV+K)|P$OF;|D<8=xtZZdBfTI3aV{ zUKbM*rZ;BIgi_vQmPWI~B0RyU8nj`~p;JSkg5T|Qip~49>b%p8)7?9bj?)P1IB?3k zwPTXt33nINc(E*CymKBZP(6?c+gf&wU9^CvBNqZRg1dPhNIJ#AQ-f#sI)UYjogvF{ z#n~b8#U7dSo%sDt!sg~tB@qnlE|H*Yj<73aB=UTg(V8qtc4#Jh9_Y>yho78&4*y|Z|M|l+=b1V0J*Uui(xH1#) z6t^tWnkf@JFs@pllT^RTdoOe!G*|K?)92@XcC8qWMG2QI=Wh|S;e<;P>0QQT2Go~S z(#W@R^y5xKfT393C~`8Q%59A?W%cyTaDkK_)Kp5OoH%LQAUtgHbOd?w;(j2Jb~4EG8rl8oR2xN+=U3)Wcjo*rtWC*?w+VJT&&a&^$gxb45o z=4B>s#Q)lc27Nug{};~R+0M$`P~XW|%Gh1R&CvM29mW5tn}ZZaB!vVJDxzolTdvkb z5Z76@SqMuM9My_d8S?4|e-cHYb^n>lj6J+4)in z5hljKTHh$|9xr0=Aw5{AKhFH*al-lgq$fz?5+W?5VKj^@DN6Fxu$xVZeCr@|>(rGSm&()_t&k(_I!moryzoxh||?Ums!O}{1{X<2z=u^{1t6#wwL$85Ao`G+gDJ9t(9_1r#2wUVOzhfl;0gK|;bl z1A^b z&fl3nTbO7%i_#Yo4Uk|qWa;E5`~B*&i~~;|3boQC_F~$z$(|)ESsuVcM%?l|iE|pW z5&F6^^-nD)UW#l|<|nY!zo8R;CJIq*iZ&lF2dm4FwfT!WCKoL(0@n1@@P62qIcNR( z{u6O4@~fc$3E2^{pa^pwb;-tb!t>3f*ePxT*rGbG$PFf42D(i|?V*g)aF#t90K89T zpp6^SRo|pFtyioTnY8IwTKe-A8d$ss^w?*&I`LP(ZozCk=f>km_T(k`Tux zesMLGuAqh`)CST65n-iL^$rzC;q+5!kNseXf6(pl;@Pp!xwlAo1zr5OH^p0y|rdq=jQB17e1M^Qh27G}s2?0W1EfpSd6A(#ban zF6scp!ydf1&mpi1wYnm=4*v9o!F+BO-?NKfaPStR@WEozc@yb1P+=G)b46SR?LOFT z9?HoBScvGO*)PfM6(zJ!6_mCv^?%}hW#PqhFR7&{bh8FGTCY*5cLEnjF<=U z-k|!5yRv-sfPS5HjQA;bfAQm-^1Y)xv2VGChYJg^K%zN(Dr?v;{O8XC|C4 z{!PGY1YP38DTv?b0|nWIp$62?HQ;6HO4DQODu!HC8#IbVdfjk7OZ{|#(0(bbbLwmj z3=3deWK=;Vt{t54fK7lVS>o7rhn-uu?f+$; zlTtep>*k$@za$$IY0z4M&oqwhGCj@)+KrgGaQ89D%!pP4|*J4Lp50}la(-3SL!}Qwk{e~TjcwLHx{CLnmP*>t(jF*6n|9ac3MB5 z#UHB9+Ov3qSGZPj_sf(w+^=Sp?dPnYRf^XLi|mrg4BDHP=r(am7T#?fT^lBOEGkk3 znvJ=twW{n6b%()^lg6LY{}3Sv z5F?b!38pq(7EHzC*U=u+BJ$wK(;76S#f<=|55&lZ?8zL=6?mrb2~nQgzh*H|4UOQB z6Q(BsVIlMvzK0Om!LwGBIo0p25b+RCRn<#rzO(Rmz=NWm>#+QC`^@#ZGv-G9Sov!| z;bfbFn*Eh06u+>*Us`+rA}NTP+Zg>nXJN$ubwSR~*g@aP+}7rQ|ME`)X;j%z`2y2? z$TG5%VhW}UT4)rIlS@2HG&C)MQy}phg4Pmm>)Mj`0S}TgRiuSQd^wTg|B~CT)GjwW z5mD_tfk&^TGg5uR6jTc!?Jv~X&-8Zb>YQqR;_%E_dB0lP0?Hh61rD?)2*vZFEuiba zHby|VrwFZ%MeQ?!Okp6|J3|0TMe9pKFo}ivT3j<88fzItYHDeB>ff-~*bD8!zJpCv z6j~P5+El5`N@e@j!w&sHTRM$4XCUSgcTCVM%g+#PYoVK9`DNrXzA}BW1Kam=$V`V# z2J>UXoBNm=`|H`w>=hlfEUXysT*g$|cwOS6{WWU>YtA=c!RKsRqNCQ?JSG?>NY!f@%9G>^`g_v&AkR~87HvS(gHx?TjOF**$STADcVG&VUFz^jkIhSQYPAWNAgru!;SoD~SBB3^fOX4H~tjnN`a)YRE7$UQFa z9TZ}>zs@~H=uVqIB(FTeKnP=(g8XlgIQg2;Jb!HR(Pxz&BuUuf=tyY+%rR&cJEcJy zux5L)LG4;RefH18!ryjv*3(X;xLRbv!#kj+C5>%iyV0E?v~ydu9-Q=mxfU63W}z&n z%g~SIG9G*zDB!1;z35@EuvQgu~8^+{r0-1j}h*r)98t0sRg=3Z8B6WNqK<7^SB zd=>^IiwET<{{F7kC@@n^jJ3&dilMI5lcS)IOj(cV(T*$ zKZp7gyDr{a)$JR)(%tY0!{*=9$%BO`Odba{%kbh0BoRJ!bj!=1Ws?`2UZNlv71ssP zm9nd8sx{c(5a~oz0gHJhadey^F`lzSJR#tKP!v<>BmDUn9Af}zagoy7y2Xlu z*lBP`RmWt~X+@7|Pz~sYg9brysS^pQwfnBCfXyfG*)BGX5sgZf_#Itev&W1tbxqH^ zO&r_%w+J~tP`z5UlL1z*`G||>R0vh~8+$Lo9x}_)8xD9E%4d{5IZuS0t2?}7Xx_f- zdOR~|-l6MA2q9?RscRU#bCqk6VBOo_^4G?}x;J`iJ*t>K6A@|8oakHE+pHfx2@$sT zH`cUWeFLto&v@utN4pSOZ?O^hwT*m_J7jKt5jm94Y3MLFj#Y2|5xSJmN$3$bmSEjC zx!=1V44{0DzO)&qj^QizVp5xAbMk`^Ni*1s)6%^9<>~2ZR+VNox<$Q5e(_eMIJAq%UR- zLC?gPnKGxN)Li}feU*{r+YK2e&Le~O>}hD_v0>mXZ{q9%+e{vXBX_225V0A-UxYf} zv{O#3(Mz!D2}ks4l4AqFNT1H3ub@Kmc9!MES>vRwb9hl;$l^&$GqSd}YTfU!q(ojF zkRH=CxG^V6GSvCK5>R4$k)>(4YkKCvS(G9;DmRSIWT@cbov@S{3_+s4>z79yp)!Cs z43k=m$B>PCgH-YabD*5YVAsZ;hs}|(mcWzDRlzzRelZ7Pnp7i*k%K9wt@0TdH{p%< zY8H`wR6Ql zxO1GOuXNP5pqA7k8gr*OxiCe^gk9$8Ml5-mZGzunOPsGKF%#FyMd;cX@n^wGXG8NCfqV>p*MV~wX%W(ogG3p+!t+nVV^}G3K42;6 zLD)m1@qI^lKb`m8V-Us5TfTUCx|72ItGxk|4%j7FKfV#!P}Fpmcw8u|0JbN(&ZILy zNM2*!rgRD;3`;1ZAemL{w9Qse)=E`fuYK~Go?lf;)iN(! z%;d!FW;!}Ky9yqcIY_)M4Mk!zF1Rz3Y;CIG-e7dW!#fVoqroo@Dq49CoFc%6Nsgu} zBPpo1n@K$TkSR-nL7?rRc~H`H8Tm4U$-^Pd?6vq%GHda`7|dESTU$dRE?NYmS*m4U zoaL}i`{9BDQJrSC&B8k@*eT5Y9iDT8OT#K5ef3X+jL;5*2en=VHH_hv$t+RkGGi^> znzZ#S$P6J3|BVYmg;saeq}*tLwKbTCRS`9OtW!NsZUHi7RI|N$9DEXiiEf4xVIm%B zLzKkCdP-;dH?(i-jO?1MGSFx#WN9gVq_AD8jIJ!k5CgV3R=Stuo2{VgaL(Rgc1EtY zZo-Gy;i-i5TL-cuPpb|5HdgJGeLp!ncEp7vhBDA-G>B_hZC8$tcn>%$4CpA<=Hg_O zq0i~Z06~x0_2yotS4=q5N10X@AH-;NE~qhkP^e4crQxYX;o$bkznz|lr3V0R zsM@2dTi9qq!ynh1pzVjdm-YS$eOaf4tzWMJ7)x~-JzJdVm<9C=V4 zUO&K{%qKQbVn(K_QlcY23;i-L z)>G&yYAz<>bm+~^TsYRCI}_5^%Y-$0{%>C)fO!|vPSJl#M?T_waw!{=t-XSk@$WC<5^Zt(DI zcw2HURcp?PJ<&v+Pjtv1fk|End3fn?PHvpqeD*WDPHM*U%yK;jW}=$WzHF)EhS?6g z8%u@^hmbxw9dh3m9U1#Ig{+1%HrKpLlb+o;|Dn@_KKlOsDB2-u{^aJN^=d(br;Fgu zfMgvV?rLUnjz}oXRDN?M;q^+^y+AF{dilE_Zb?uMGRe=bL`((ER6DSjQoNB;c=@bb zYznck$Tvk%;_k%KVLB2_#bhMp7uMM;ja20rPy=MjoxswqDl^J0{=QEZF+UIi0$Df+48z@{9>DjlOzB{_3+87UVR8nMSNpT1a8WXje zB3EYcN@PR>ypx-<6E`VOPVKR6iZ>ZRPp!c_l2^YcGwWr~{j@gv?ZT)R5&;Y`r2m^h z)ih_%=~33UW ze;P;ys82XW%WGQ*Iu({EUB6B2e_4my?X$c0?ME{(z)Lj#~Ms0~Uj>5frk zlF<(;6M0_7Qk%=@L>O0B8cRR%%!}Gy_qJ(fwOwI_TsAANt=Ux`izKMKtf>Cc6&4JQ}}lrpZumiX8K<+umG^2L~PsCa5d>)naqu#(Ng} z_Y%0XZ5k3i7)!KX`B9&ELh*!#P|vFF$7Sp8TyJ~R2Ey-oSAD&`tM|fBUm?z>w-(H4 z6lV|aUI-YVHh_@LRqqhf4j23UAahf~?a8o!*)+WO#F10uP({~%q;@=HPPQVuV7brW z=i8#tQu9k_3B7iDS#Wrz(9#M+Nxsz)*H?$OHlNQH6vNVv?{yH3F%*HOGH#{R)TJ4l z)YEX9kf@N!9V^qOv`kTNv{7&8)@~&X%4R;5(bvYRl+zc&vX<6I_9PAJLSaQtkMB)p z_^cQtror)fly$S%00;Eqso!;?FD zevIsEHnr;Vj`zuDRvAXPB*bRlhNGDhK!n$Gh?t18G6KjVQK10{i^W7zL5U>n8mye6io(KT}c^oCPkYqQ6e~ zJ+r^V$@{aQVtyaVQbw9U6nt`f{Jx_$0rSc;t%nvSrGcKFRzp>i&ZKC<9oiEP*NHm4F^ScZG7o61BLp1>^d_AR{&# zR!WP;1(ouPl#f8X&!0TS{F;-c@5)mrbjL9__fCf<$h}hRClGw}T&{XTQeP?I3g^mtEi6S?S%%>p>4{R12v(U zePk)8QE`+Js{Q;Zz@Wf3po@%Cp-q&nhAR9EA`@Yy2584eYXIk>8Uqk56TSLz`a5;Q zqb)>xRe>^XS<+Z-maB`Q$&AF`LQEUDG?+`(!;VwWQdRO)1rI71QsSnWE7nTQMw^ga zycju|={Y%s#CSdv11&b1c1efge`KJUYbg3}G3=^m2~sH)6_QN67QDpNx6Ad;U6-W> zfN^)8nZD{SvS=-8tX3g>2yn@ku)=2~GsMftU`-lZGg6f4pK08NAEtIZMkZZ0NGvRO z5gwTjO%_31C`;DwDkD0#R+YO}ZIkcZh@z@ReDc(&YIFID_BPpRj%Y4se!Ho{b!72= z>_|pCh_#m!jIxX=f)g8?>1>Ukarbd>G@ebjsfbBBtA45)w>ly^w9pji7cZ;yVuzx^ zCP|PlbTotFVjY$OzA%1%9TS;psN*=C{R4hNMb&%raJIfAb;Uq{#e|%EXo4H=`t*+0 zK#X7!#lUrTJV=pXzJUJZhTg0Qgl`}__zr}(of}C9>J~TzEIf_J55Wl&m+izv ze%UwB_9x=LojOO|xLnFa-)LT(?a+|YV zWwTKi!OI53StO{C-d1qyDWe2h!#7bu-%|NpoXu(FMI<`65q>0%u~rT!O=~j5tnpaW zpZ)5)97S9v=^zai*Rbx>L%1|D#hAy<)Y)JNLw7)3eGx!9b&otc(SRd8r_j|=Y+5YcKXhn zO!67Za-2W1>KPWpYO>CRTD!_COdY|SGfJDDKg!ghbyg7Hl}u(?zS^$05K&%UZ|I;C zPuN(*{S#r0ScpV77x%N0X5M2Sc=tz}n~Ff;>M=25__o|YF01+iHiwT5uKQOF*6s9MMDxxR` zpPYQcIA8S8RJ;e1;txucBQ{l5pjwsHSR2xqB1@#NQS@1ko=}zbu{3OR+II`2xF^(X z5k_(bo1N+igQzmd;NLUleV5_r(7|1`!y*eU4U{u0?0x#qfcXvw*MRl=#|269ECPx` zgsSu|jYUe0H(`q*B8_dT&Sp&loYb>ko;OrG>2iJOG?GhwnG>}E{QCv&$c^p!J&unH z^{<6;0ij~orr=3hJ^YM=ybA}LSD$L`po_9)AH9ydMz^pQdY*fHIK7$1wUQ7a+?*b~ zbppkwQfoZ<5j=gQn3210j`tBCNK@BD*?VNO(V@N2qd~#$A_v?QScj;x3M-W4vosdv zOiqZVBUnFlCmo`xwI(&5&(1b?N+NfPDrM$#*4v31td-5sKmNje8*Imd|Ce1+`d2#m zdjl$A<7n*QB=_H&>i zQ+hPF*ZP&az!TU%L6swdX7>(%hS67I8*@LWm-PXrfxBxT3rF1S#cE=^`Lpm3825xjO#$a(4h zfj!UsatfC#C|=E6v^2c+aCYNgb$%KvME>S{@ZhNxOjAs?Doc)Xpk<@Qo|7rL6qh9l zD5Z6EsvED3CG_fvZIGe~R*vFV78DZyXxnmZ{hYLKZ>XP_&z`g9=$by;F`<0>0TR5c z#!+qb`@P1!v>rThrxe$BWmfv2$(xsJI}CR&bfr!(B*fJ4Zn;jXp0tkKe|2BFM3)&g zLjGY!kCl{tNld9=+Tz?vMch1n%5bfQ=hfp+bJ>;Wo3gMYHkWsSIvQGynf`YU829xW zy`7>Uca)M3HQK)3lISAOo=$|2``-F{(631$^NXaJ-hLRSdvE-d-${W{iWz`lYPfie zucu2)f6Rz!<`CQ_t`Qtqt%uTG^tmzjnM8za*mMj+RXnl#J>@9>f(PkBEObF&86mg( zFpslDKrP1~wK_J_9~bGI9K49GOdkzkRYJ`I#zne(hmm@j9BiG(zL1YE9w{Gymxblo z5VQtve|r}A9Hr0^#RYC}!FcDH|4i!wyL(@dial_*%)&y?v+z5H_|_1sBqwdsi*9!P z?|Ev8YUVun*OMmvwa5FPpEN~dduL-ur+=!BB&Gi>@wC}k%K}QV>HBl@v>BLh0fK~i zVMRT{uz@kwPmIu-Tj%gmpGl&tjNYp4g6kEHm((SC9AWj#J)O4@cEkd_Y!) z^^r)IN%SE_uxBFcbh`qWoOsD`L!yW=;cnyfOK3i;d-}cdj$SkMo`mP2O{P~@oez^O zIoyWR-ZO{1eRV{6(H8@R4X8+KbV6yu{S>(1S<^DJp-kKpyBFh^HBt{jSwCRowS%o4 zSt;sW&q4`4{S|}5kptg;T)1<4TzO~Y`_?g||)f-QuH5nF7J8qn& z@PxEmM#E%Ux)oEii0EQPo9%r0)8U+|h-nVPTR6eSJIp5tr_4cdw9G+`eqGrN4C??! zO&NAOQzdFKoCT;Gbv6 z8=(DFxuR^aL8Y-{f)R?=Ea%DN{!VQ|DF@F5w~*lqwxAAwt|c8IfrVvaPjg~=d_RZN{9qT74a!@gl0L`<@2hqMA0DdZAaW&p2>8%G0QUC97 zTXpq8$tjGpS;%ZpyfT$f!@6dM>bE>&r3YwGdqyK*0BD%G*%v#NxLFzrqfx!m-#QuY4Q2+MQ9+)#iq##w|Y zo0i7zya zMU1V5+7NQ^apEub^;S;Blw;+_3Vl#HkqA>K%MFykY{HjJmAucqc#vEm!g#t$G`^wP zp(a+?f;Lw_@snN6wjZ>M$1s%L&ClO$llw2fpIuP#)7J9fekYuXn`u(_eM2b>Glez^e?iN%64KlIy_kRJoJNma8=T7}KqSW3mS>J}Hi4 zpSv=O%r?&~bWGf|nPC!~@=Ft{@f``(izZ zclo)Nb5^ny>2Kx)8AijTD+YbnxLvkAn}uD3x~LlCIvm2M?57W`$}GZw6FGa?K|s2% zPM%Ie65l)gzcCz(7wWYFU#&FkSNtdV9}n*T#cP(4>ig2MSu2o<1X#XPpH2v!^_bZj z+~`>fgnGzBsLpu2OnLn_B+GGHudg!EXQRvD??fRI#+3F(TuuESF(J~nLYhlmNBPWhY6 z!W#td7Ai7Y1an7|w0dSw3%Qm6UdF*Ogl6h!0hA>0_C@Uu&cT@)}U ztwQFSSg9V~kkjLSpJqF}f0VY>V=+vs6*V*2qmJX~XN<#pMgI5yuYZ|50R0s>5x)ZG z-?{gn!1-@Nv$EwEfCj^7l66r5n((QeFtlBfpFb|5t_O0&C=3CXz{jlJ1g$;UsV}r! z(f~vOY0uO*@rGyP_)snEMri7wlY7dO>kB;d3J(Ocj5rhI4h%yG;zpT=9O0#Y`kOHu z%59R4%FCTV4-gpo$EB?TN)5e+V4EbM!BV{~fg#D^OR^bqWnx_5V*;^HShiluVWcVC zMIfnpRIG<@K?6lmq;-0m3WJp;%VI^D zJ7Q#sy9q4O2ZGVbu_QrtcI;0A)QK!|eAJbi1MRc>iaK2a>k~AEh0IJ)@SdmUdxCv` zjVZ(9XticO^A`&EV(M*F)Yfg40R3WT=1(02x=Gf6S0>?x;9k7qPY4N~>g!x6oMOy) zpM$!ryozLNDcP%|C+@A`bd$wHvGwLD9GNMs1#@#8fA#Max#-^Wt!w!XO6)eZ6#C!t zkxXLIV&iIptb@B$;v6$70-?Bn0pDkJpSVLk&GgZqTMA~~$L~RB|0+JU{o{q<(MfsG zslybx#j<+eW|Z^z3DB~QHfVpv0?lI>oz^3E`#BMVEke^hZbWHFIQ&yjUe!Ia=tPBj?>==zCoAB zF0n=MS_=7h0Svu7OBwL>9LAuwjs?XD`#hIF^eiuiX$oX#G+BI#nP zc{q@1n6it+9$*Q4wnS=Fj=TG(6h6_59|ZvJp~9&0^}8vR3Wwt zLJ5&2irc>+0SFTTBEerFtmJPZXFFsmO6K|#gL8Ec?5b4|EV^~&9_J?};k$A@;kbDnJq1Mji))jb~#RFZs>M* zdqdO&!{Jg;TMSzalf*3{4#h`fB(qeQsmb)t$Mu84!LwADyY)|h_TFS}lL&EVteJ{; zB!~Fx4?A$zu2m!jbq|fvs?R1jw6;%qlg(F0hHVd<(@SeMRiv?;01ot58lG29GAga7 zNQr$D^tbz6K@_O*VYu|v#x!QD(+`60rNz<*Oyq6BH76v447jo@744goYSXCb>36Z3 zqyIqQ9ioJ<;ae-fb+ywNs1r2_2vlFSCVao3;3sXQ&S6DX~Kuj6v$jKtEoZtbGZX@IMQubk+R> zSm5^rfxY?=V70o$oOP6g%Y_v!=IXn_0)DcZp*I?Uls)SWoeetRme`@lW{7l2V}T>m zIFThMn*8&)VFtO1w8Y`qQP%Uh=QbI8(n<&0mz7;TM2`m-6Da%WVPWxW>; zNDlP6vZk)<>Ah&0mFJL#8497BOr>6zltq7?>;71R9SkIVJ;tx8*vEjb5ex|r6V4C` zCJDxP?>~+;bfY|irrnIPL^7sjs6Q1V;|kIl?328rzpePa-OBaz>R*H01UT*Dc&Ci< zA*^Yuzl48GVTZvG!_TrY?oZQEIQrY!3gz<&3^R*p{nnm^o4ty2_3Ma86;P?IM(%@M zu!BkH7u8aA4s3=sW^#r>G)&|Q=0d?GkZ(xmg))Gw4OynewOY^H52!`27S(roU^uuM3SlhdVT(xkbe5_Cak01 z3mXj&_0S%MG<*4Y4P)6&(rm;^te_PI%8wTz-F9E?&=%^w5R^~;q!!)8;v8&ucYSMP za}_}XDg4;U+dW6mrlc=*8g8F`lM_40zKyImkOYN+qPY?ZQHhO+qUhbl2ocQd-htr=ilpKpN(&vzR&gWhHnyv0cqIM7*_dx zJtqu{+akPiN-c8L9e1q80{b1Lta38p)K?+=fFBmlSLtF2C+EaLmKZh?sTd*8uUE6H z>pS9@w-I&9ARP~(EMF-vwd`VrPhC>ay^hOMvV+94ykJ)YPnBL_(BQL1AA@pxQt=*2-NzR}FH;$} z1kmPobheDd_hs}GmO)$83|`x!#ybydrmA%d9I`JRR-mU{q;#fTENcQOq^+6@snD^z zW78`JGHM{0bsn*zEsxv-d z|MTJHO^NUyz8~KA`{Dn&^Z$45`u`ek2P@iGeM4w{Y;`x9rK&e8GB>NLm8#M)(*guT z>turj*NhW=?BDiDCr`E$w8a$-zDRo^Ci>vNe)uL`Z82Bl$dVkLbn(nO&9wjiefix6 zV72K5hjRhY%_%B%Mz$GOCfY{j5zn!5i~~Ypu5g4bl!ges#^)}upS07lxpXOwMvrr6 zJU=?QHo0MVZgO4m;LxLNJkaTvbP&P02FIWiTDPDn7;h!N`=4eS{34nHaR;OH!WgPP3z0)un>YT-)slEPCxKzWuA8Zc zxjS~S;CdI$&p5AX(Kn4&G_(EV6-x*<1!yE78< zb_eh?QO>hS?BF?h{7h>3IKdmA?dE#oYWoWwHFLc9-$+&5LSiF8c-*Y@sfwGo0lm3=-0`dY$gIFR3X4&eK5u}uoI7iVLQY3h$ zP6d-}agZp?Aj(-J)IIuKDXZ8kg&uP3-nney!#NEmQ&IDB-l=P`Na8+0Z zq5a2&2tklVtna&7Wc`-pruk=@_)ZW)cGlJ=|N9E&^j`?q|H}g(R{QOSybAcrG4Tju zMn`Bt9yqB((TGs+kMpyUwl+fcN2`l2|7pR98G8&QaTp~E(oj0R@JkAw*KYUgw%hLFsh-a#-;dCH2?Pgjw7z`& zoKa{b-7UYsH`yOz#NMfFdQf|9L8%^($v<$D?kMei==^jccTcDBKNIogUaNbyMKSR*iNIp|0KWW2cKXnK21R)M$1+Ip3 z-|lifF6p}5v(fCt-I;<~?^ts`sOWSP?_z>_CEmCKxl7e06~`?OB}I)OVs#a2DDImQ zWQI$rm1avkF$7CeCQGaHn-V4&tR2F`2ol!li%T0KlGz{)#eRG5K0OuvIJ+jBS5;Cv znMvR1GPTrD8LJc}&0%PuFrvlCeVR)66kSeRT#}$EKBayH6M8K(C^;Czw6a&jo3FC4*kOA*AH_h_>@qn>E!_T;vj@@$yt^{efX4O3taaHx?>ccG~QKz0NQ& zKWT%>6n(B@&6y=;anh715urz~NXSu;&VIe_H?^1y%v^rcod+feLPUcc`rQ-NUgZsOzfd>x7`uqev zE{D>S{?5W;mf&FE9<8hH@bGQ0jdG=^)f{}jEK*m^hX2vIng%B_WUa4K!yqd~mw zi*Ut2)cuY8&Qv(}Vs}X#+Ad#hCWoUXRy9@dr|<)m#juh~(IleTok^02ZEUCkaV`K% z`L!J1m7_2iAJqf*stj(RuJ#)_aCr_b=+JyCC|5l4XW4~HtGlJ-7i%Q5UD{wo2miZg zJosXWr%INTZvq=ei)#95zb3=R>h-!mkBT1;Az|r-#-u(wy2G#wg{x<01$<&B&9Jlu zs+$`u?l2=5@D&fp$!|JU6!KZ> z9UaEsk)o*Ad;cgPm4k`f9X=QXdjib zf4y8;GIXF9T*A{yN+9Mu+_=!?qt8hbpyJtQBn35uu;j=gpVq(Iv2#sS?l^E=@&eB2 zrqvCdnHgBPnHhW{a`qMPqZWsDnsYIpjBm9sQJ9`YS9mX2ZnPbhNfn85@9pVKdbnN? zp2ML@Fw5UM=T+|MQOO!wo$WkaOSRvUMzE4&b>wzFF(Lnodr<1ER*Zw~#$5t$t3DR! zx2d1cg?yPWby(cVyhq}K7jpX1&({7}PLj8{B5%&T`|(VH7U3|FQBYz`c0#@zo`IBA zMzN`|ExC&ztKgfasn-{ZT7efs8z?d;Qy;tcfieyHR=A(?AuL9Tj{s|ThMKJply9!S zvqJ5O1#KQ3!e;XrxpM;C;?1wl8ztWkjg$;NFO6zV0PPz8#n7 zm-@x)`IExAMXw!8#paXgX~sD*aWrA>t7foO~~kt)!ou8skX48 z?fGbh^}sEnyKc_50Pa!o$HTbr=cd5ji?cP#&k2xLYG<3~_Q$YER-=%nBh1#& z%?{ARQ1jjG?w}apn+kkhi6M9cDjO8C8x*5!I0vqNIH&>FtWo0W6lL?*GI|lCq&FMD z%%-T+{59y-H6d)oKH|b%)1=}!L6Y!M8%;7dGn#qSjZ~&-kf%1Oczlx$=qr6vn&!|{ znLY&}s7(q}PCU{}t9ew-{>9oRRsAfR->>iy+Cv4b55x^TTemw_*C|n>$u*4_p2G*( zxqDfJ-4UY}H%TY6?Do-YrV9DU94OXZqZikpHkx|Cm8IbM97^jE(sHU!5kV+(5QjPL zLY&aV=?TsPO7oe8VWKW2(e}3Te*dTyf^PqEMvz*ZD+JTiJkc>QG%oxl``jr0)-eJ&$PLzdfr=5 z=7v$OfZ?sa67^IvL^b{iGOwMhhHabo4e#0N1mo1jy^ms6e@UMP<#Tc@pQjn`;XiYowxBwqPCNM7dj+yN%7?a`UPBPN%eyRXk2G;`nI%teB%Bi!<9g% z<~Dz{Zsx5crq(WI>W@1l-IGBoB;Dr%#M=AR)!%m^L2T{QTDr{pHjuY(`1>tr)9$J8 zw+`DM-fw>JbW(5f17b+Lrgs>cq?z>K$daUkbzF`z?fF4Sl9aeeN<1*lN}k-sX&ORC zYkF0;(V}Fa{Bn5dD;OD!dly1A?sucpk543MMtyg*`{1RM-VD|flv%EBvUvpk)MyHK5tWy+$9LMxe*awdi@H;KY91M-NDBs5Ti_U$!9b}rAF?6t46Z)l&}YP;-2D%oC} zRt@7(7e?v|XcKy6kNkx-yJ;P3IY&f7cubzS9VAV?xNykq>tN~zg`FXIOiD0fz@Z$i z>9fVnFZ1cRWcFDBL^bK$TL9{cfwl}&g2&Ild4D1>e zM59@zR2HsC%eo#bM*tCEKo7fPgx|n6xZ0HXV)mg%8;~OVXSDD|wzx5*BKqvJ!?Jvh zDb|S>gX|u1xiCXMC6&aR@{nmOU#t17CBXp&C?v*4TbYs5AuGT9!G)yo=jfU2&OtE= zQ4lf`Z|Xhh%;X!A-ncu84r9$;MNqBDxAfr%y(sz%Krlw}aY^a^x%v^um&gd_kg*`m z)SQ;NMdR@V%Fuhd6=t+0F`Thy@YQ=Co-wB{*841xA#^fHOsiuN-4$R4BBWnQAs|E9 zm$~OZ0P38OK~TZCWEZ)FrD)+qohg0?rW6;fR3hMTNijXy(5m|w5LN+0tbBrRRjJQy1DC z;fh{P<;6IZy>lTStwpS%bZTgOuUdi9mfPJm9eJ@_wc zE-f~OFWZCY)OW%Ha|bU{m=dCf_cRJ5B*>dt?a`8Qz`Iq%Bh#zI55(RK}_d3O7tuOc8&Rc_nv`3BORLW>) z7_|7$>qWfMdlum3v!urz5}D2s#2pIM3zH&6UOFU**wy^(fl>fSv%4r6cBzFdd`_B{ zzMy6*^(iKmzQYC&?WPxvNHRB5+R=0#v0f@dSL|N_3)!1XyJCyfHWqq!v^LkY7b|tW zX}5|3rc0^DqTPYtV&L*X|axhz}A1RW4#n|*fGXme%t5rs|kT+Vx{n2-pl6RKY zT|m_8?tfHqRKe98%!%4AklHM*c4@6n9jGHpzv%vR5h7r?8$9-1&n~~~8O8rl&m?S( zP2B(IYNp|YEQav4($dt>gpJyQOpop~X%)l{3?#+AHUfsY4yHF0_oMPzQ+IB^N)==b z$8q=dSHcm4iUiaqfpYOfmR_7*qU5YOjfIQ4V?+hFd5Kv`X|J7UhnK4FpT`fpA1{Yu zY@G3q`IFHc+_VGcLGTu6pM=t+rrPZI2b9RU_6E6OR?=NJ0|JO_X>Uc)WSI9TIj%~N zFqs}HEVJ$99y@_(_K7TX5$@yBucry|xY31Jo^?eGzc5iE&vNpD34XVw-{tSOCbTF+2eLcyeg zaf=62PHQAEix6Zd2S=64?UCnp5-u+*2L0HWT-BrLf$qQG5NRrEkgSL7iG|5D&n*8+ zj6j$SpcZa{dZeb%T+G#VON`pOJeF!1U{=VW+6v>=+qC&;W{!sRm*Yb-VowdF^jGelnXC@K_aH{HyiMHT!1SUC z+nz2w4tsy1EaL#f;A0UDBH)%(ov}vT+`XaYIbk=7!<>h$2v;>T%m(?P^dyG7vc{oR z+jhDf#o9Z3H{o=0eVud{)I5?#g5GPemJ|kSrF{}fxeN**FK^KLt=x#wW|Gy^Y*M$( z2*gF{lN%_^=fmzLFv0HaZ4(u1Wl!&-?QyrT_0&K|uMb87HTy?@%%!XPc7fv6xg{t^ zVl~q=DoP&pr29@;Nq3+P(4qb=Kp#J#EXet2oZc+#7eZ>R`$ zE$s3jS5-8Mr3Vyr2YOCy(HM5%Gkro)rg$CEg+!jX3j^aRXf(!o5a)iJ9~@M2^p zd)k4E^6iO{aIwztFnDG0q6sNmn?9Nx z=lr5vex#)NkmL>LlH%QV*9852P5sKE-gVtJ5=5<;*OsGFoij-F8C7A3;B^kKMs_xY zux}y~@uGkX2F;yPV zG8?iQ{2JJymhiR~u72wi%Qqz8-{N{lIr7wUzF~}%{(*S+lw`~W?Q&+;ygEi|TSr%B@7 zl-_xvpPp}&-+6gg+$2-g|A3i}Hk@ks6>}4sz4;3btK_IgqzSMYgW^7#{TPFFm{!-7 zsCPMAEpx(nOfB)`tl^GUeR)^c=)B!O!g(ab?nPo&hDY<``G}uK__YgmDe~4xKZ9|BtP47vb%i)@E!>{0EmttfcXWw} zGYU~IRa@stLZ?;B_BPC)Gly3B1k?y`G_8`cjzAyW_x2loD;(7N=%W=->(ZKFBs(Ck z2&Eff)`UdY1&IgjBP6(n=)j(qRK`QbYV2c8jaAO$7SJndUM(?y9kXy9vlZI)$h`=Y z+SLe`&@Mln$#kcrG$(cDR7r)b3HZyzzrg=l4ku70WB&yJHT=G568)nb${5(&TiBZY z*M|4Mm6w%wYnKztq5kp z4mJU{0^4OIuIJRdc9-lmOt0pqQo5kfP@EAxL1yzg76-GbTdQuOj_HVZZ@ZdUJtz;- zwGR!ubzg*b!)U#Z9B}!jY4i$B{f>A;V;p7>VwB+j^JywU zE8MR!Wq=!|nvuXMXhk)^^OlwalkXBiWw_t~dYUq3*WW{+&@-wG^C~`a$CixIZzg z)wP<~(U=(#)S6W1?^15kF@49KhQZN3=b1>*YP1oMzZ9o=1>ZpvkG%mCG8_`#Zuua* z@p#5)7R>P0sTpZ3cJHG%=U}6HJ#muq>ztz@aYt`}14@+)W;K8h39y=dW^dW38Xr#0*Ii*Se|XbNKUSLH)FUk3flb)9mL_IXLq>h9)m9vS+aC?O7Iy z9#mzi{{9FB=CnB>a#h^~eG7eWdb&<<&M} zGa}}8;kkAIHjqB#mk)yr)wS7+1*hkpDe!b&|4mUT~thWSsuD979ra9^D zOl%*szP^88^?}5?+d|NgLhecQx?v70d9}r41%G&i6SwnP=l9`l8hFzP48Vb3h1^F6 zk@p;@>Ck!rM%=s~d3-++LXbq`2@+UfrZs7(k|R_N&gN~V6(dZd4GeWyVwFZq6c}G4 zD4MIRLb5mZHmmxm8J|v`67ttnB4J88F^wOzBBhK0oT{?2%#j8~Gse}HWi7UtL2a9g z{nwA6t0JOo&R*dL3OBfBRw=^%1a+1-3THnrJMwK*VEmfo= z%St-~7zxMrdTdp!Lkt?&m3@>IO@_&fby471mPw!8-D=(d=>;5G3bAF{vKWK%;o7os z2?SksnsR_=zX)Bu#^i=_Tn+#P>hA=C6~S5iN{x(mGWXjidx|94+p`cG#;I}JcNHzV zQq^fk4dm-(P3dYYDpiR_kK87Kx5vpRY2%c|^ArTcp#8k@HuXHVm^Wl>golVA-5%$;w&Bk!rgR_8omo( zqNuAHAAi&C{1w-ibT?yabvoE!%pUWcPMg}Nab4;ye*pmWvcB(w`cF7}-zJ*In!5#b zFnG3$IWfDNvGZgghc3m>>=Hi3t+_it$DQ61nC$lCW_o}=0)>6L9R=s(%i5ayu(6W@`t*F_BzCL#k_?pN8Jg> zR0MeAx`dYuZukcKrYwFsgz)mJS%z7C;71R09&9YiB_3-X#9D|n(uB31PtPmlJfDGr z{aTY{UEmeM%UPWh<=G%_e^;LCAj7NX`fZX>t*;Vyz2NWYb&j-}MI4IRX;~N|@}N%a zeKMukCChevp5r-Q4NLn79rKc9Cqj%S8Iwb>GUn1)5-22tgYAehmMh)f`Q^^4jdqm1 zIj&PTt|Q-eDS(;_?M5++6TMcB?91h*$A0rkIO$S>>}#jU@|N~ic7d>L@ALN`oE=+| z1P!3?BC7ul22zabjsK<2f%zI2?u7rO$y}t~K8M(yWC||HH{}G#E`n zOi8uC^8FltMoO@nK6?4#6911iLv>Yxl-WT4<&^F;_QnJ|^k zo|m6bD|)5AL;B1C{6Q?aa-@a>@>wT0PjW%X3{~1G0r}qL1H&K7bb>cYAN7h`70R)h zf71>rhFLbIMK?{$zQp24g;t^4a=R#a8djS1SYIuZNH!Zf>BdewUcM?bbhHbh7RwLR z9TaprF9>2Wv`P4+o^UNLfSzmh&32z>#eXUKzC$yn&wv}lAx$BgmX;x&l%$a@A$^9y zoKF`9QLEf?vW}&eZ{Q{R2Jl=Z$`y)xauiRvIz+!ySUN4);{VkgbZPQoLt)6R(#!+k z2P3U_N=Qd6ol%`gR0lBueWqxk5qRO?XaCBlY=>5*^plS25|AdO|2N&qzij~}S4E^92nGio9s`v#%u zy6*?`35XJk7VdB0nQ+@_BvBB|k)C?U&2r3o%yc&9_V#@Jpbs^~1}-t#8i@*P3gcn~ zW0;)I3L;1kaN_=^?GlfAKvKj&BZ;!_AUos=RHfurP8Kr;cA>s)`uBc$ZW_x|)>ySj zw)8X_-OwAW3_3l;oU(R{^7IzisZEROr;*G$IJYv~f8(?ebSTtv5%sDxeH!}1jgnQG z8zjLU44pK#$*o}8(N6KBt}k5sRHV%sPRo%cbpu5)YT>dQKip;du5h<0OuL6_#j3q*(oqgegbnRBOmo zzV2->UuiRC(bO90b&3`jBHZEjmT>Ro5b((D)M zQLq4ozmp##3K?f|m8Xvh2*65{|5ohz@Jr?dratQw|jrAD0j)8NRFOjorpkc03x34(CeQz$WxTAt5J_n z{(dT`2wiE4w!KkHZRI;5PcK{5<+2f&#wjns*!{Qxg?vV@K&fP%+ z8Xu~>QF>I)wS+}`R?g!A8SvM>pie{Gu9u@C+Ffz;IFDyT9R4>EJ|Ab1Q&H2jizsIn zGyR^{-x3Mo&e#UyI4*u(afE{KvY{gdd;B8wsVZl`yZ9$0({?;7)1j$jmCtn}$b?Fn%#=EyYe=kRV(O}wbZj@%bV$V7!@EkyF8XcQwt6TL0;S@Yk5DXwfY zJKLOW+9ueWe^?v#)5l;lBpB!9TXt7A_*%Ky?OXA$~+@OO!Ee zop>@#wB^JyfcT3v3QG>}6NC%Yz~dn#>BH4IUmfI_s?NP`|QQRmIRvh?qRMJ1HqQHSt0?2#5_Ks$l8nl*|F%V7 zBy4B{Q4O7>BsDNa3Z`ZW^aj7ZDRjQEEZk6fc#+f}1`pFp)ne==-TEu=0vXT7Lo<7K zsG1L6dfQmF^lhMANox-mXv2=;x@H0)(^%W_mP+Ff;x_4X6yB)(*fMT_c z!?9(mO4Gcy(=gIve7f~=HgmC^zcp8!Ou|65#Mz32NFhagnG{VHKW7z5?9BXO=m|ve z%1N85F*gRV|9b~6T|Lp{p#Q#|G==NId*-9?NQSD!nA#S#0rFRBf9l*Bb*~GyBf#rU ziO#3w;52WT)LOMZIFuIG_0Ar;rShy_7O=f`H4FgQ9nb)X&{gY`K|MX}(0Ho~;2G$A z@(*mVmF}fJB}MpbRTzc}IvJ!*)EJUhuxz?}DSe`M%iO_xRqna&I<1Wrmz=uYQ?vi( zH1Jf)l`zMM*=UyD2#K&K@-tkd9BNvMxoYd$-G&G8T5Q`c_C)y@CUl*TC$B7aBy>`M z_al@^#(3O=zubud*o-nGJ{*LHG0dONW>?3~u3by$be6iRZ$14lYZ}-lXobt`+ZGD- zUD^nuBl*}%2OlRZi=p1{2zzVg#>n85(ljYxs$J1FPhqu|ZI(K_OuC#Tg@uVJC-`g z!*9>d4F*BoWDFnNmKx?>Ru#&xy{wOJ_j^9%E-j9b2s<^_j8K4D4;cVnFz=B63 zFv5-a6?zQ55iAZ)9R-$^Sj{?9O$tOMs0z3&&iF z*nmO^y(0C9wOW72<`?b*jG1juuAG7_2=mvJ|0vp|-SpBSY8ZnwPNs_c*!tHmVoClL z)gKL;F=KxgY4R!(k&+r@qqGGN{h^=meLza;+u(zQB7X!pUUiF@hPUhS-wQDLhy zG@6Br^}GOWLCfHRRWWdB0%Ir4;<8B;nM$`_Pt=t)ChvqR63nNP#ZRDB`SjL7gq-vEtOo6C zQLOX9&xTYTLo{cIoAF57?6jWtl1~S^_0Xjvc({lR+_bjCN`^mX!w9;FMdeXC9W;jS zQ`SP=hRDCD;r8qf@V^LbM|+2H-1W>0RHMSd@*_zO;@VWv2`Nd1OT{Cv35i06=F??` zUaF?#$2KjzV{R%!Blds_D(>*_wdDWec67O)@l=&E@cZ`YJJGk1qgxa1&o0huBQ*@B z$CZ*3+*ZWJ=@IM5j)mTnq)wdKtB&y0Bs-KS?_yb-kT3>6E4A&E`*uj{)jwC>g<<0r z$MSqxR}Vx-+2jl6T4T+%cmMAF&%xlq=$W$ZTNcRh+j`@l76$*_NB!49;QvCtw>3Px zm6riuwk>Sw+%5bN2Jtwg$bu*e1j5WgAV>}TNWee}q=^#fStK*k{A(Z!c+;O{beKY15PL)O5eUO}(EdSx&8w+24}fuQ?wN zYii$$LHarN8ugHLCWXkp#t)9Hy8V^Z-KPDfRJx;BP&-EtTBz3@^Qchf$z$NAE{ zM~-r(zfAi5t-WJ>wZgsoS@alxM~wT1LC_;gFH{LHI0=W087CA&3`hJP7znl|RTViR z7i>1nM^6ciH*5ny4?*CvBor%1JEljOGKNUtCe}+oq(>Pk=7rs>QX?ayFw93-GK7yS zNRu+94;WJ>T1b~Lr5g-W8InphrcId|8Yzwq%@mP?gBr#FP!+1e+NY$d&}m{+hZt0| zB2rNpW+S5A$0ME()JY$mh8zyuTfRU@(<9XL!h$2nNmAdib=B%7_njf7t6bi@NpyQ_ z7k7756-T>zdR^lC>RfvpH!mN8DY;|x<@J@XO-E71!bkTnspD0a$U4Wj&z*ugeiq%7 z4ZSp+oD^q7h(wk<$@T%RUY;s5&F8umT;sAs!L?&vl7ZAhsrDYut8JpJqRHKw)ZWSw z?jTXlIIU#3=}LRIkFA|uIs)_iSp5$)ee)WNXwF`f$5QYa^g=rux%MF1%Nqz=xT0Iz zS~{|}34HnU=;20oj~7CipQMsC)mY~)&nhlnINCMw*-T$#^8GefG18s9S{GU7s3xx; z+kP>7)W>LM`^1itXt}3@h`P4@f{Xo_N&`w4Ak!eACvcVRp{e1I%LpWqDhsf0;M~fI zi@chJc>hU&dF0ZR6^t<07+E9MZwg%X3IK7ZoikoP+qPA-yY@1#LB9dYBRgod4GN9K=| zs!Vs7b#3`JOeP3f(Q8nJ+n@^+ zZ1La<)PlaM28=wkBkZJ+%FYh53@hs4eK3O|K$V$lQiIthl~T{BbgV5j2F{LBlguc^ zgLq}m>}>Jf_Zg|~pEHZc?OE$1gk)Int~*X08x03-fHc!Q_L|79*6p4+J^dOQQ!iEF z$1aiJk>#VCIHI|8sQOMB&my)|WEu)8IvSQMB(n)atY_LJq9k!osnF#p0YO^Rh)tO@hWY6)pbsN()8Rgs^VlxNhKS{c)7hnl*QHySIAX_tzm-H}OS{sy|JYS@An>Zz z21waQQc@0mtNo6MP`Wz(<+)nvmVR+q{nMsAOu$_cCJAuclLfdP;(AJx7X8)<+U=F^ z;#Hx%5zCDTy`$%Wg7f;BFnb`_8&a}$1k=_j2-6@9m=s}=Vxi3GZ)6s!4=5qGRN11w zFwZH-!R~Y6O20ZV6labz8%2>}>ww8g`S{zzo zu4kdCP$ybZ+=@_jJyXvmEG80KVk;^ENCDu{qJtnM3XyPUbUirvPH@~EJcMgG=e zftiKo?3QUHUs;(OZUNUoysrOMAcH9TP-%WD-=?c?xlpR3EiVcOY$U&J-jQkT{kpC= z{dlHmS*5L^rK^yxk8WeE#xGk`#7(Jam&>QTdrg3hhRz-Pbed`q!fY|;t-)ViSyNqY zTTx|Rrne!S7N3}fSwc43Yz0z6%++a9lJVrnHoi92=^;udR3VpY5x8CQaiLJ=#Wk52 zt6lGLH`*~?BU3E!Q}e=*0RP&mC4I}!6mL^;k_MG*CsjzL&LB*#EFY`wW(=iis8;cc zEs{vpx+OuZWX*~RW2Ob(S^78Aw7#AZdsCL48#b10UC1Due&ds?0aU#etLt@qXmz{B zIMIrARj_P6YG~cCb{uXk}>#xL4KD9(n+AY0`8w7vd64xY~PIq}9V?v&c8O1#06&(8@z=CMQ^ zJ+H)NV-d#B=LvqVCzRfING!Q3r(@QfGt$!E1q9XXdE~Sb z=K}9vwje=KH8R!$C0@1)p&CA<5^qTh7w&ZmiqU18kTB9htu-ixa4YCxC*=cxqbntH3eMY*R?XFMq0)VVn95j?Sa*p&uiID~Aj}IrZ-izt6qj!O z%U_&zqdNIbax-I#FcEm<>KfXNkeAsxOgp}#n zY0JBWub^XlM9VD(&XliT+Y-2u>wIO~sLOVkGmQ%3L=riTM`G2cmSIX8XQ~;*DI0QX zr-=R|>Qy-$?nE@8eH_G8Z-J*7kB?O|v(SaU6=}+bl-^q;b8t)6fXuw39!4V*1^G0nNkG+pR`z)xyMmT`yp9D3D%*6=FB+ioxEF2SHT6B;VpER}VHDSWTbSiZj*4VNel(+!wI z=7krw=rh9SP3kh%vgkF#aBxO2jWSnj43sSPH5dC1vV@w@!f@iKxuRTLeyQ(nfJkM$d+gn=E$zBeM8ph~0DVRv0%ff}iV8Ed%P(o{pgZ2tC;FhAi zLQ)SWCJpe4SnSx<1IaB`9$|Dm<`z%Bxjp%~$I#ZEQiS^Y)0U%^uTH-G)a}o72izXA zct@<>lk6Zs?Vt?ar=W+n4jXq7neOW-M7<6%xa(2(fg5u0qR707x82vb{m2c=v>*;G z%D&IE-wCgX4r20Sncio3#3oi z1AoXc6-@89N|-ikaWX^CF?o~~usSG@9n7Y_&z;Cdnq_!mK;ZK9xoPLF55ic34K#5NBCrP&)^(unj%~YbZthk~@LEIz? zsxrtlIyk{pjYbFmW}SBp^OZh*I70JxQcms3lZIBK#OfI0*A3~<#wsmL@J!Ag)pUAR zEm`fv6b)%M<7*i*oo31s5wL6U=mY~iRCY`|ob|x1SSwfC`CzOpw7b%2?&Iy`d_ozu zNR91`#Rkv>VJ1^qswu0Kek--JRy0^iN3+CK&KK!rTDA6q2o)-~2Ze+EuFNc5+Er{h zZr~X(vlW5mSsi>LNGhxw9?(>fnZJJ>Yc5kJt@&Vl{$%0hhpynkyKdS{5LsAOzvV3+ zf>t-hWi&u$NeVP$*tXXTF#PeDq=s%9URSafXf<15-xNs0nzBoaT4+YR(J9ozJIJ${ z*+@~)L|9uwDJCL`#tl~v%vp(WZc8n%mf+4`*Ho=MqecmDMbr2B&?o{E9AyX!1 z5C+xiHXosu>YQqgjwrp4ih#FQ84hhL*&_nr9U=pA39I**0Egnx*3Tz=x-3v0+em9S z;l~pfGM?hYr*8q{sY(2fecc@J3bDlC88_lc&!pg*y3$BTRDfE2$zc~#y+bU}UCKAv zVF&5TGy}(gaS3T9eylCzBM%nD)3Wl6YEFLq`#YmG5Uop0-u)3R&#^@-_>R(Kk!r?j zy#|xftilz#agnB#sOZ|n8B@sZbxmHrZ}09WmL45UvSfsx?ExD3t`|CX+UTX)D;|m= z2UcSG*UD`=4t<5UaLc0aTnFdTEda_ACTSqt5{FW_X$L2q3=-f#cpZm#T8unC1pXwk zkhcFt*E}kFd;?nzs4OT1s#ct4hErzDqY4SN!H}N zVS3(wua@kRf`X&q{BG%d#ZOqnBSW5f;*xYV0YS%4-5uy644m1Y(>+es+R=%f4W z1l)Z5Mj=X*#UZpaIxUPeMPFb#_klC!Isfup`fNDl9ls@PlK2OKo0|J1#&C`&2vDus z8D!}WCE&9~vgnlvl^`t5&}8p-^?YXL->vuZD$x7^|YJ4?SJEEC>|W9M)}UIGSC5L$z)Td;Jlt zOT3%pLDhlqsRLn??+f+vW!UIjD9ESImaj4AQ?~X~j`m8f%B*+N>f1@`J@I1g+3U*B z#==k1a{B8(+(es0g1y3Xg54=@rw8i`J_t z!-Tk!ItI6Gg@3e!_*UF$lN(zzr(8KRDIC%_6yC3XkaZ9wBt9sIY=DIgGIhO=&%bu^ zlegI&d_ExVQCHA=cX<&|?0fe%f2IsHJdM>V#gBT>QNhW;N%@shCR<)3^|QCVG3*da z47j)L{B*ZdcQvYVE*MzylP;G5`E_XUK!bAXWOhkWA4J@HU;cPcwg(UU0b+|MjXL8A z##OsyqC)q=@-w^Wu624HgtQI2T#rfOLG!2 zB3WRWg!@Dc)@*7I4&~H7NjW&wzY@X|JF~!KFYri5R+trA9~F&~T*`Ut(1~N{;0x|b zGJf8Zzs6_TCg2Cs{6htE0U*#e*m5^ZBf!?!k*h?^sQ8fBcx67#7QTRGZbH_Txjfqw z3|;{yQMve!Z!y48y7vSgRQD{)^}RYyJd>sM*0{G!6HHf4RCJ}t=w>ESeyL_WX5u2$ zW~r4HkjHP;N=)d}6!bHlA(jZb`HCQ5*u3+WUjOzT`4{OwR4;9dc?_#kD9JiCn+``_Pxh9;;gLr*>R^djJ1iJO7)- zO;*;iLlQvY0a4#{u{lG31VN>4s#~&M92Io8SRV?Gs1FOb8)RCr(QnZ}EBuy3t`7e% zCCu&2jS7^FJsX$T$u`%?rkAVh*T?50b|3E(%%;G~5O9lhS6>U3qr>4r-2nvyO|Y3R zTjOY*ro(5<;;qS~9cvcyBb{Q~p#(h*Gl>)P{wt@@<(wT9pg4kj_(J!G?8dTd8gEp* z)!DAO?^C)DU@keus8Umm*sYuH)Dc*Gw78t&tsfmW+j|n!e6~&4?nMBC=h5S|1GQ5P zZQK`5fa-=E5<`SIi!khQoZ)jQoi>>)XPpVbMhapSG#r}|>950({>5BmTS$6F7V_fA zh%%THTBlrzI$5!x^dpj4g*GRoUxq8`q?|2Qz`s__rwH2HC2M*PK#!=$V>a2!u%i_+ zs2R!!8~y(KOcUqpbX>jzt?h7GKC6EY+gfRFfsZfIdgaEm#)-I>z7u6MIv{na*#R0yv@+2f(JbY$mIYtc7TQ0gg)(%CF4n z^u#jYf+l3!0kFkwRSX4db2QjQ*FQ{Zyk+6fG{H?8aH3o$m z@Xjjmta_IGYdOod=DbtGbV?g*lWe0-VFJAcZyCeyxN+mTiKCiYa*PtU897Cn#ZL_} zAS-JBqws=|zw9!9q(uHd#rHoK9`k<>nl=hLQpAiXJPzkE(FdB9E47bC==hc)*#&j< z)IBJu`BYW=UKs$abh5Z~#P5{>x`_X(JNHC1Z+XE4FS{9@lkLsazollsyj~PUKqqk$ z)%VQxSw=LY>=;)tdr;UocWjxb+=_8agsi|?cBE!MJ~MORo92fJg$iHC-)C5aijCeQ z3|cCqIq5@rj%tMI3&p#wipOd~7Ps-isdZxrIaoy7Wy$We<2zsCy}WXlh}Ez-Gj&7t z))ypPs(4`G({fw)W#b;=Bua(zIg2N0n+t>UspyhB7ZaE=rn7DJsi3oq7qB!q zOQqxSwx~7GR-)sVDA5%welQDLqeuV?FxC4YSnR#7XsN5;RkyC6!{e)_Rt+v#nyF)@f@spdn49} z#~_YCk|wa`X3^OwcEE#Cl01=S9kIihhau4)CF`pEMLOUSU_ zX@xddpthstNDYS=qRQW($kY=%1a{WO<6?RsL4B0#XLw(Bww{C?x9)NseHo)@6560l z%du+l$wdi~bn7&>P7tavXw@dRen%VJXKqX4WR2Ntfr_4M-BNYn%iZS|kxjDx3wMI) zZtIvVQ0{&a?9gS}soLE=-}Hf6cs3{FH_Z%dwtQpb5JQ)I(;_2L1Pp9nHRpuc&^|uM z{9Gn&I>wN^VdrMmu6em9>)Um;0Ta}%gV9vEQeu}bYF^C@L*KeJw_T@t)kl_L^7m1Y zxQT}i0nrt@@j?i3<}ptxUWYSHd7zosc3n9XnP+)zkVsL|ty)e*=h-C!*zGuIPo4PB zROgbshCM0^mOQ}yloo2IQOy1yB8Nu7TsFW8w)QIXXNYiCOq?+b4vj&NGf87NoIs1( zWkpU{hohI&Rw9<{xyobVfuuAKYPX+ z3_InydK)J2*VS{*%;SMY8b?1f#mjQ#C+mex*%7d|!Tw;QfG>WeOxVAM`GQ3G;*ed` zxL!RV#pDqQD^#eeTKY9H8^)KHEa4Xb{slVD7=@fs*CowpG{D8z95RHq1g_H-^O}le zS!aYI5WYp7M(|mAmlRn=PKq+^Dty2gFl14ESlSY=J@E}?@`k9$_yJkXdyih?7N<*` z>?;x9VQ_>PbNk&?ZcywCKW<Pi9ed^!$ovuiBYVv|)u^0R&N)WHo%m?g6WgrDW%P5h|aQ0OF5e z@PopEwVJJ>KwRI{btcP+we$Vq;|4+>^VD3GbsOywyK>OXjFNXw84l~lC zM_8#mpIESDnIvLAHR*D09MLm*LC$@%)Uo&{!%TOK;c4DbN>%dOtL3SPq-bVPe(q4Q z)$bn{(`UlCj#{vRZLz%m>hyO=*Ue(NrCNyFtqN(+H~ei)CPVCp>TU$CTy{KW|0Ij= zIPC+01z}7uDDv9xV~oq44W^>x2&I#TbDR{b0UM@M4;LE{9jdW~&d7PLr8tEcWs@Wx z6Wk{12gN3H7fEE!qa+{rE#0mlQ~IrdE#ak}FjEAvfjJ+NN2iAi^wUz`7MVhN5aHwo z1BK$KCTDms#-(}(3ThhD9l=gt9yT@BHXx-|p zqn4wLN!HZq#!#FRR#x^Fv)lGX-2`h1`GHB2`0aszNA*)t_=7;Q1pM)Y3_w`GrUeT6 zel~r6a(#Z1MLPWU^T~BJbKB|SwcE~2_d320#RKvO-KV1ez1j)&-i^-g6^r-9pUSsz zklQ6c{Uu%9>%OM9wsShT(|w75nY;9sn%X_fo3|3`{2E4wzj(Cc{0gtbd)pwlX3*hX zQa9UekLV?5Al4<{w>=5?1s=joFFl9fHV}eNb^(vqVLV5=7>VD|#hvMO#u$pXY@IV1 zI)7mAIW>7q?9R&*qx?capL9F_zyS7oU{tQcFMkk6$eV*lE^k#ZK<;5skCHC;bVuoJ z31@w{==kEy8$=fZm3tO)-fe>pE-L1UDnKy zNxvV7+A{=Q`KkcLr@1H9-4#fGFG#E>+Z}T&2%?vNW7J(2Q(F`|fulQIiK?48X!S}J zf`1Z%?19U(v}nTe$eFXvg1{Wj(G^~+@S^GI0}R<6LpSZLA(sjZwUahnpxYCkdm2*R zMH+cEwwL)T0ma7=nJXA3JH4-k;+uiq;mq=avVDGJ)1|YQfo}LVS*_u%#d^K#OE3I# zrfY4Z=H3TwR{z}KPQL9CM@QJ#vEfcu`>O%h(%?M^73zS?0pw z(-x?yrg%X`-<#nVjaN$;SG#zm>Dd+2qg#7pH#f+J>Klaqlwb5>Pwdk!vA0w3-g@T9 ztYdpSu=Sy8xm9v=?Y`$5JQBJAd4Ri`?x(irM&+H0?)mbJ^5yg9o{IkVvh~{`cEFGS z*{l18p;vD2z1u!)CpKorjQYbL9gq9~`~`&LL%^3I)a@S6^KyF6=i?`6Xx0nmONgFZ z>JR>LEX9WcJ@=?u!bhm%OYDnL@R>u%ciP<7&}8mzW7iG!moc1Q1Yh=G?%wP|XztJD z@#^&9frY|1yVtwhTOdK-K>>Cg>8j-$d>hQV~-mCC2(UR zv(UiLeuD|DeK}vB1LyKY+4LY=0zo~28n)R&% zLBO@qPiqc6I;37|i=cx>?zkYIc1dF!6Ur94xi#glGObpC`Es^_pK@W2Ci|Fv7p!UG z5%vHav{lbjvw=+|;E(uMIP0lPOD#mM&<)wSgG3+Xlw=w8xfm#8nq`n>k(WzfEK&75 zA%eTRmb%p_o39?h!fvcE=Ap)efE_~F=B;Hrv@UXV4P-X>BJ|2C-j%n?Rg7i4AoXv^ zd9*N*g7H4{{Ja&>yrX5#-)9XhEvPKbtT^j?slQE2&y`F-NM42ZYT)$bt^VpDC9AT= z@%?!T+Gu`4Hq?x|Z18~CrSqhgW+5oT5^EiQUIv;*7cM1M=X;%?aVu!HlTpC@>EG+~B;~{s2`dHnTU5XXc;Vhzcudma^Kwv2at{Og}D)CUgZG zdpzM7FS_REo|4$7=_aWR6(!9B`=(%#pj5CcNd5r6R znuJP-@)@4vX2%q;9a;|&P|^(68-l?k%UzY z=ouk=*&$x-7l~dmJNUXf}{fm>Bbn z#iCt6dy?{^OI)eXn^(gWu zJfk54|$oh6U8@cW*HE+f_D-% zA&ITFoX^kym-dNT;?|-)F_=bceK5ad9}v;5dbb*h^w^ zjrllR8JtcB)Qw7KtcB@Wv~t*_3vkX%=+SYOxaKxv z_(SgTYiGn_s;k$izH~7VRkro(=5sBt>#mt^x&K(BvO*kcwwpP10X5=$HgE;vGRo_o z)>fZ)ki&h-c3?M_kzCJp}*ZgZRU{@4yHRAd6 zM}9&A%+>_!aP1lSexyj6@_KCH7*%Ogv)EMEFt+avcVGA~C+5U(r;N-sKwy!HllpAK zYn_BWU99iaQDTvcl1D$GT06%NMqDbR{kI%~shtuVYt}32i#o=#6Q4|jSk;qE>>gpL zAM(ti*#e(JjiQU55Lb@c6YN*E4`K6-n=xZ!k5f0-SxV;4F~9BUu4nKGSmf}8Q|^i<@U2soeDj04RX>H=Q705f(mrEk z^pe{4n+O;Zwe>o)b2I3}{`Ox(Ol(<04^W~VKE%@9lGgiDD-DK$uDA1B{9w}x4E5;y zimv1c%ovrOUm0|?G-?_L7d`66?3YLpK}qC5i$tAd8{+mt3K6zNB#jph50bKn{-*0` zHim`_PVyvil`Cy3rLY6|l3+nDuWyg1V^Drld%Y?z8!+CJf7M9tI}PPE=i-Z1Km{4f z#6x5_bp#F7hNrQ#^`aPpFhh%j2GIU4a6x_J2B`=s#bZq*`&mt7>OHrrvA_gF$%xO8$r=z7oY($BKu=nDB3>X=o*%2a95QQ7s0Slb!ufb zNZDq;-R0q^L<-ppJ=cn+h_quaxkTdXIbLUsL z{J@Y(XF}DPicQ{;5F46SxE7RYlM_jD1Rw{&VAQywC zVSk`Q1sdE3sPgVFz}0e(MeFZ13}&Ja1&aJ0^9#UJnR%2&cf zjFAhJpT^O3BPZ$?+_$_2X{F)|HP!d8uaW`1+kpy==m9;I*U%e!)GtVikHZHJ7|R&H zqJiE$WbUI#3l$u`GEEU zQzzw5at!e>#Q=|{34Fb;WpsXVbWs>%F82$qN)#$+1V(AZts!uU{*$pBBC-T>qB+k% z%Yu+Od8J`QT1A9Km5@m(WA21(DNswc3B?DCiZnTNjJP9cvP*p)mFZkD!rm*QrHA?u zqidx%qMw$xgajh93Zv8%S%V0apAzbD!BBvXq{xNdRkm-_6`g{lR+eLN#gI;DrTLas zkoGhaOIZVc139AvTu5tjt0;xvh?Gnj?Mir|2%6@}=YpQMLJD@duFMBF=+ zhia9jEB55Az#!G7a8H#gvZB#QFqJ` zL91n9G8OFcFXo7ul+L=P4Qv>i48!g6fmE`nS~y07OiNZx)jjG2x-r#v z3gIo-!ziWY1LT^xa0bzcP3GYT$Y#m1jar%JY9VAT6^5Co1n>`)`_2KHIcCFwp!If{ zqPmJb9k)Y6!s7kx{ZFnLVz$O?@xG1H;<;9_*C@6zakdmeuhiUXvfz3dP z75W?hME&M=&UTCrmBXP_Q3c3^6va)zS3%M!J4|UiM5C33O?FJ&6m#i9MHfp+hK>dP z#x?Pqysv$xxgV4vn(04PM=*pWd9C@RnJr9)NwZGsm<^RlgH2d@WBD#HgA4*9`hXCS zxwOOg2{tKLs0>r7TqAiZ*b~X(*K8NGkW1U3esVyqMY4o6+0pN5RIv7XMB%S2l@|>VeXLi9SahN%^f^Ftg#&mH=l4Zrf}Ea2ukjPD0VTV zG4pDo$f=kN3l2hD&z0Qv^eyqhl)$ORancl3z$p8&k^#i$Z7cLJ0I}@tgp(inib~0> zI$4H>v!dheNy9oD)i`M}^@*@eOt$Bs2%i|kx=m=z(?Zis&8cm6p~2HK&HAqEV1|0T zVcw~hOlSQ)pk(6wAaljqvaFh;rUi^|d8wvibFL1LXGC|ft!hp|AQ2tf6|nxPbyQE5 zoe%6M3?EYYfl>A0)nsoI*VA%A?I^Kk5$rlY)z3Jh`aA*-%eb`{`NyI&&YzsZ?&*rf zDTM!JeFHc2bl-Hn%4(9ePuaVkwf?^3g}Av$YbXdGLav)S852Y;&Y2F*VNQeI$B+Fp zjkL`qW^D`?YRg>bY8~))K0!O(e37kUBsoQl)EOwcCRsWT&^|4Z6w%(BZ;C#Zd9=c| zWHg6OUWx*etB*?Nlg=0mU?p!u(Y?=hy162t=9SX!@q+%lERL#wJaksVV z$CR(uv9{D~2|uB-3N$?s@u zb(fTvU@}WQZw0e+e|i!m1TJ(GEQ2_I0T;kVva>d`tsQ7o@LbTBiM%g}4)h+E-qQc2 zLm>bx3GB=aEA)(?#7?kS`J|n=kacT{FHXb_-#bqnUN!|F(TGVtfl@?EXQ9>MT#b#A zY~8Y2G%kOJO{44gW40^0F*O{vy$?mlAI}Bg{@K>k)5ccz!!C39lgD9r8~i6Z2-G&+ z_e)94j0Wtiw9o?O9~HdiyyJ%0WgTttBd#_qz*my<4qY5&ibaooz2Y^YiJ2+BSc{uP zX$RNjGNT_4AUR#KB`So|Nm;M?R~8&P`JZ}5XKyE-q@$Lj417A?gzuOI0=ehd)0uPtzCLmOoppU$(tW46(4NMQ|s>{j&u4zl-7@_@@c4ZLK!{k9Ygt0$gu_eVHb5}cQ2Yfs(~yo{f1;0_7Lh6~oGAtG95%?W3y!zOB}YVm6(H?) z*=fLj8NWJudc*0uh9x^8DL_7(w;1It-h@b&-C!%P4WR?$VINNNN99@{2`eAD0Ih3Q zRG;20;gxJ0hI%}lC+>)Dqgni}BS5?%-db5Qp%6A9c{P{8G&QLsu>-YXmo*ZrQATmi z8U{O4F&Y#s0E~p6##2gC>GYa+4Dg9&&_xDXD=Q#avbe(@q#BvuTThA!UkEH>;S^a~ z)sEg!Y_3bbCnjGcMjJeu5j@&(3$|Bp4cwxLm}8D$D>i`Fh0YE+8&5>8@Wl}oq9;B< z>dBYr7$DKkUn)&Y*(KgTNOFTQW7JwiLPaC&7nC!ox5{NVZO$iCTovNI^&j(C$nVAt@o$uP@RFe0bbD$m7_g zT>f3e!3a9NFmywhf#j49MHl=pAE zXbWP%%S5i@xFwJtI5xJH<$zF9!=6h+=A#YQQzCy*vVZ+1p+wl@jF z@J?X)D>vdXb@>> znJvHCeIHmBz=r{EU7u{d_jk2k%tWoga%UYy;*wCw)ZXUFhNP-VnoCAq6Tlum3On{rdDSQK>Z{Kvj`qTvumiUNmr@TF=2abfW=~+$(FKrRDl&(m3&2?!%P?i( z+t??8-mhY9(9rJ4+b8n!!MvC;VEM=ySn&zaI6$&z7qU3FjmZb0yZj`p#F*?Z4JV`N zxXXyJHa>y@>I@D96S{#8_9uADNa~qaeLazU!BV2Dv$Aamu6X#ugcj8xFg_!U}nX)HYQ7fE|`kua7S35LvE z<8f4mML$epxhk&z!M|Y0)e5d(k8T5DzUo_ok{1C7lq;mdi`nl$C|3fJ;=?84A(zHV zB&aV2Y0*U0%Bz$w|CF6+c>?Z;N$NZ6@Ub-C^6QJyGd%TS0TxLPHt<<<@E4kK?Z>w2 zcJ6xk)&wGU(&DvNuZ$QYc%kK&qZn4XE#`*#D#!pgYX|egKgY}u-o5d2bRzkqsZaf6 z1ulk0Yshg5Exq`%)|8aX999-d2&WI3paFlT1>!i~Cy}r+VoH8LaW*`Hr9|2dP&{d+ z&1?f+FLBkUe8I))ceDn+6q#vgOsX3aFu{teqMHkKPY(R&>qz(E{4hi*tuGAHV${@- z?FQ=x6Se)k@w1XH-@fe~d~{@dhnzWAa%niGx!bX29Yj0i;-?2G7o>GaL_W8clJFtxEIBn57;`$w*3aNeba;=J zHXzrK1Wj6EO==CkK?%Mo+!A>u8Z*t#En?smm&m-P0mfH7LNrB#%?DfjN=Qy$3`XDa zF&IX+1L$(@`)xZ7Zi?v*GdPf1wn)K|nQb(uWjplgt;~-O=w$iWek=3*Fg9h4PL>Am=M`47OeWp6s5-yxI*ZuIhsHk2qmbkf)j zw!b{`D{~dzjBva0e)bIDWD#)=xWAkE2e|Jvxb_9#h9*qaGw$b_A9_c1Cd0jM2ei&C zEk-B97LO!lZb9pyilJa z!y1D_&kzJS=*~eG+qUK9KR~8s_!*20+Q(PL)7jeI?p`51{HjW!b4jOooyIV;b)bx4 z(g*7luOUlEKB5WHi9$Xi#fYLeNyU7SD#}36qSs!5O?4YYeJ}1n>T%(M@C7%%yEg2d zTtoHbQw{%$;6T?_GOWIkw06+};niIOS7W@{gi^8qjnN%y_HuzYUdUpDk~;eQ1D-j@ zbJHyP33T6A!Xb*sZW9v^uB)?0No;(;9Y&Y~+oNl`J0WKr0xfU5>$bPrh7I+?!w|m% zJ^aDTp0X25vk6}L0>Tc@2f^rzK(||FyKN+!#b~6k2$C6R8Lt4RM+`0NOugD)^QT%S zBURp-s^!5BA3Fmd91~Q<{Ao}=@b9d?H+Oy(>9R+1I@HBpSphoBI<($3z>4u$`!DR@ zgDY%w9Dh64L0FS+dn2~ZV7s1W*qxD$=`DLHwoT0ld|N5@5#y@v06rLw4@4Nb*Z~q> z2&mWCyd*v_sh7bNc@;v?!d@t&_6*JNWt6RAsv>=dve;>t}q>H>CK1>Af=pdTFS6S<*SUr8c0ob5@1 zel8{2E)tc(F02+c@eA5!G|*81oU?7NxJs@|Uv-4%!E04_$q|o^Jz3{ow|4{lk+SQ2 zcwhX^O_70z!7W<%Uhr=}|L^CgKA(}w&lI)dD*S(=HQ*RM?s@2Vmw+Hh^qM{ah!4=T zDZSwI4^oPK`az;ED4c1%kmL`Rq<5FH13P|ZKV+R(HhUyLXy6ZAi2GC-HBrC5{S(i0 z*nj#veGLI$u4x%-@kQyl9i~MfC-SE^lBwCoW#?eZ%h8u)gEy%dw|)}gI9+bYcWb}F z-*((1$eB>C>BD0`ZE%ME~;rCdKgmMV#MCR z?q5Rd;{1%u85-rsjf&rCSpmxoY16iiB9N~#aAdF1?SC^Ic>KUY+q1U}gwLT0i^eZP zc_WhH=PAwud{4YT!$qt-Mr={$;A6DUzbs~Eayyg$^*z;Jw>#%toYJ&eom@9|YIDjt zy3ROXdAD*XXmH87xjuEc_Kcde?+c`zTyoPKIS#{{2gGfe+1K@ri8V0rqd)b*XS?4e zCdyy-=5E zGgr+9?8bWzMt&wlTWrE}Q)ugMok$#so@fx9W(e8%O1AC2GVK`!Q=j@cUU5YTW6c>7 zA{spQFLcym?t69o(mC>YYQf+4+aksQ&N){=s)#S1_yH0Q6|akLTtCaqPXsVO<*pnE z7YdwblXH9bPr{hl5YIRQltG)OA!&?Rn!~hCY_%{U8dFgz*b0ej$k$j4leBC!Dqic? zC4}z7@Wd#pYJMI5;>4*O47#Tv)Ljwb*i~43NpiV)ODR_Qm|unv@^+2^gBjm3O9RWy zeOd5i$UFoW*2qMsNSM*EYi*<%s83ldn4(d1da?z$}*J`yL0=kFEF`=*0v7Loh(5IA%gv zSs!c6!&hZ}Ne62Tf;pWP^9;{DK>~{&!!xK!kb_bq03)LG(EnLuj zabfG41EE)Z@Ri6-*E2nZJK%n~Lj8QN?7q>Y@7e~pgIF@d?;6*~hp8Q7SU;s$y(9Q)s!?EjZmkRx!8F<&Q zkLkK-mqG>TBgmZETj_VO14W21PoZPy=~@Ri?+crcyrb1){&7HZ-sK^Z4cOXOW{18; z52v*+XP2R}MZ|LAoigb)>=k`P8MJ%?_CiGE#{Ki>R!Xrt71L5>Pdh6@mo; ziU6SLjvC5K#h{k*(#7IJj-XU_yK5x+An6{=Yq6^Dp^gJ*>#>7efa6#1mfx>)$Ge7AyHzcTdYm9pqKPs6Ul-PUFRh9s{o5(>*J+O**Zxm> z68#!CtiN}0rIFzGK6Rp0W&^&S+Z^=FHYa!gyubsFYmLr4XiMU~+5(?1zk&X5#QKao zP6zczwx|E&DErUUiT~mv1r3~y%>OqZWo%&Y{Qn`6I!+tHC_Glw3f9yP_C4ouD5*`+ z)%@C;yyqiuGJ?Ps+3yF^ACP$IcSBlw?*8c|>2sKGV9XyBfX)PK zDVOy(f%Wd^e>~5ZKg(6uetut|yPQ4IhEO38Wc5`0i-?;sL{ZHcEA@z^CuZI)<7Sye zEd^l(eLT7M!SpY7KS8r?lRhF}8+*Mv|2B~8>G!1&^%#e!BC7FhnyOPQ7->*c8slx! zM5n7%8%&iNQMA~iFFoz%p@fQx{=y8~YGDbzO=G?~dYB|Hh%U7pwPB7#!Y3J#ZnQjl zwv@G6N62;`o*Tm|t@NxJ>Tehyx(KzZVb;LOyOBEe5m=|G6kyVy16nq0mH$*$DW4xo zpvb6{<5Q%}*vwL{ig6})ApP3eD};BeuJ~gU&1T3Mc3ZaA9}f<6dTDR5i+2YLtED-} zU4pguhb?reV~t3PTT!!fU1;NW#|(pZE#mDnX5sR3%04jhENbJV!*Hp=D;YdvB9kv^ zMjlA8zFG_?WJ!Rh(!y1uF@~j*IF@7LN$F9H(yJ@8PPJN7Gm?|T&lZ4QlB6KCSRwoY zE{DPOdROfmSovA=t3vZH%b@E!&XRVMaSN@=#)1d@v91HcB#w?CloXPweSkr|+P|E6 zOSa4s6RYL!nSN_taCd-D^KH{}M>R+9ZU?$f|8%fbVX z_Hg0vN1Y%2+<0!DAKx|0;li|1L}F- z7}0q&0e3`6PU%$^ZY(vsRJ&7~6_Ekz9oU&yOk;D>BS@bfTeJhF-qTLO@W=y{0A1$` zIIj3fS)Os7qh&1^cX!kglS6~;{Q2;4IYiDu1|d6og-|WP6Cr$@0KfN4SFAw=+(AslE1YFJ_Qy7XPYmUb zHzR~M0~B8dDE|fY8mCt2K{WMJ4sT66Zp%Gxiw|K9d8#YNJWy0WI;`%Knl+F?*Kk&aZ~YdoJjz2~R&4s|=q5e{^H457yb^Kb=&?uP z*T`>J+4mWS{+kQxA=Rhk^lNHne3T6sbgeO~1==chqp$y<=)cG@v-y8kH%NYj*#Gmh z#l_l6&C$ZyM8w_5#NOG$&i20vy=ql0CnXh>FV~F2B8!D!c}+Xo9$|BgoM@_%<5Du!9%!pZBebi(czeoBmm8-> zHtH@E2T6muGH$)XGy%gjx0~#F7q^0q;!T#ySQXeItgmL3m2OI%K2oN^aK#AZb@Qsh zX4a8|F#C)55A7}5)s)&n+@qz(|+r$(=v_4x4W zSEl!zWiZPvv8@v%bdi5uq1Vlc_|}Z@Y9Hz7^KezZvpqJ>b5+-DWRmt(J_5PAa=5__ zqI)1JGP`KMml9JIRK%1ls~4`YcW4nN>MZH4Ayg3ObPBF~^M^CWU4>3a*5^xf;F zA+E%%ekC!_Q?tNB)*3vUkRcA-jJs~C$m%MB7-ixif3Tl95PXY1bxXWBy~D|X>-ji* z4RHd|(zWUv&t@Wpq}<9)RuL56(b%;NtB&HDxzO6RuRlLcPn5p3JLXn>yh*U(=RcERKLRMW zC&hpMv5tJK_j(A4JKS)4U~oo|V)o!-x1hQrfoP#PhpS@PWyw|k@|7S}0aDe*E4Y@V z7rP?@H6WF$Ugj=g7dV^LH0h(2dvyR}tQgCv{r#s^sJDzqT*cbG7pM;1rQ(%T62z!| z7D?BDHHeTg*N5MU^Pm)GGpAa9L)w`Blj%}gCHlj#``ta8Mr{?rR(!j zo?#)hTe0Ry0hzXloDaTd6y9q-r}A(~C&X5epZXbY5CL01m1lC$J8z*YMbYTIOgXY% z#(lg9Jxl}r=xYY~2&ie@m@caN9a2qVWTW>8bX|LAc|#;8W);)?0JeMLtIeQ^tG-{f zk%6=2);|7&B|G~0eFOsS3(Vj18`x?RqftXBqaAbicYeAO#cdh}tsSPFuVq+d=n>@x zt$+Pnj9i>`DN3~&F|iy{xpC3Cj(EJp2fS+TUfJR-UA!~PC^N{R!W_T;LdEop#9daX z$6qO1rN-&>Y&|DUjEA!`d0Tj&3?hv}j;X}ide!jo9! zV6B}|Vj*Rb&n@VHRQB$Vs(?_WT#=L_BL9SJcG%%KlFTEzU#l+=r%tfqjk3QUE}uAp z<$?FtY=+0_-&AfdpC1tWfE6w&H*4O31f(1+iURWuj2Bi8_QU9c{NK5`Ib(_nDf$Xr z25XmWedAc*GqAw`pPVS%9c0CBLix$W982a)_4G2&-26F6K%hbKg@glQEEv(p5IC<0 z)mGo0Z*Hh=Lk<|UgeBO$v?QXdH=amf%7zA}WoVIcxSrm-9!7>L8-$J*0_cLT+?K@d zP@%HubA;b<%WSdLv+}6~+dO^*#S`kF=?EQw=VD|eHi&v}%27rL#&gz*RLw!0{B#R! zs*EqXxUh@Ag=t}XWxWJOls-&IEXy-o;s_h=lH9)GImr2gfas-NKDA$d5E_}j-fkaG z8hNsATx(oxU@pEvgfxBB4!hh6PRp`=FwqYhp9XD2OB zUI10x3=+FgbY#|vh5D5d%814%`@l1^zd78i=myupMy5TcRNJ%g6?>Sm$)h5?N*Fkx zL>Y8bPGMtJViepxP1J2XtoaY3M@q>M-~at8p^Io)egX08*BjQaU%3DOb@tyazF8g8 z?SEO0$#g|?C|WKNGKXRk*`;td!V~BSS1W=JNFA(3M;x;%@=1&=ilnJ5ro^EnplGcq zQOu!}s!jAXUCDtag`EvT8(JVRS;mtF~4d55auoh}#=<-~7pvcU0=_F^U2N1R66Sfa?=U)bGp z4+qSB0wd)dZz&OT(QZ*DxoLl3D4JGYasy~y`h935&Rdax-V#Hp9>>($ar*}^6=7y= zzA2Hl4!16lJTHJSJIOZC9i&?u#GUxLP%#l2DU98>jIax&59ucY+pw1!VY-EvXOhjC z$B1BJ?wn-%r1wfBFpZb@HcG-!{4jUfp?e}-gxzduGE|>Gbft=tlKk(hFGFKz<*!bK z%ti-=C&wdl(qJbig1~Un7M@eRX$uKob!Z9$lobgIEGhFxO_D){-0Y=8OUjzPOeA^4 zB}Jo2Wm(~+xJtku-S1XI6(>MIv`UtW9LW+iRBv5f7^U$e{u#=PgTUvW&-4)HnF|As z-U2HsIjkn{pNrbDBPyinWFNHMO6W&Y4SaOuMqm1xYKirP zBbB{*#S1W6f2en3kT{Q|r)cW6C_$8#?r?#){vwx}CowQtFla3}88v{NW&7okstVmg|1Y@}Md#JXggTQ5U;Pxk%FxQhT_xj%;xGpSa)0F2guGrfle{X>q5UPDj8uOFMD z(Nh@|C<&9&>jfo}eTn+ErX>Q$Bza;c!DUSY-0P@U3vNu{n+=^1f$Hv2MR}t&B zP~++kJpM*m06+YOAo^a757ZQer$(mQDdOFT;TzNLW{*+uyiVdd(ajnnL5J3sc5=vx z%nL&Yy{z=kc*2=2yA2b(hMc$dxE1OOc{HI@ru%n7v^R_-cS_**ysjWs^KEQMDLcBk zZZTR;amh+Q!a%n#ru%`xce`Ku^8XO_mO*s|-L`1Z;IMIbch`-(yIa_}yIUZ*26uON zch}(V?j9Thk8@9*dUe0L_q`wM$6D3Z-K)B*YtGSgjDdsq+%_SNx5^)?y@O@&j>lLl6WLVAaF$u1s9la$xmlt(4s#GTGhib=cI8Qnu<{Dr_d@kYsjaB2;1p{y zMKYlII_oj>ujAnpxs6~^!{3Y}+-8gYMP{$^t7ZRLz&@l_OXSnY#(JR%3kV~r1N`sz z6rUTydOU75-=hVL$1j-I)WzA@&B)=^3(yOT65mx@I_?7U*;_}yOZRei>|~Nknz>Sx zpUAMvQSZf9Q<{AEoViiJm5}>;&Q9nl(6PzN__ahEYV@ZyN}SJKt1QBievlgVd$w|S zE#Gfygqtq1KL^aHe~DiE3z8pDfc;X)3zuV^6vC))x}?0rIbFF;T9XmIB6e63D5$Vp zV_#TKkoyyEpF^=>hBg>~O%LegxXmc)rZG&SaKE9SC@rR*E$G24udH7z22B8mGwm;N zIP=f%FnFn>>t9^f*S(vcVU_kc+;hD|XnXQF#a$VcN1+x3HQv?L5@J_^jqrc{sk`HHahGMba_Wdpez;2RXAY{U8ic%Fkp2?s$%F1`|PI zEnNdcM{OUIzJAG80&0OSji>~nmdX-{*=DcPOy6Z zsNIN-S_fKuBG)1^(8deB$hEv=O|oVGI9qfH&gAk#QiUt;i^ zgVxqGXX_%CAFF;?W3D@$AOPH!;hLE`HtIa>Q7wtyG0Vw37Z+WM=UO%75{o> z4}2);Bl#v`y#C62#fL6+CC0WI-TguRUGM?P)R7z8YI0ZOYy%S^oM%I!iZ75v5lM0> z$N&rBMe29?ef%u4izG}1-%g~y9;&$$Ko-z^WG2H%kVZ0~- zEn7^lORcMAG#X0!d&54GI8jHRGX{HwX23Ke!a8&%rb2yX&_-c5|+sE=xg$>3PbBUoy9JFCfx zMSJ`4edFD|`UnqO*OhEu{=T>7hFIdo&%U#8<^uy#4$vPZ9JCWGr&+}NEEahcGkwC) zLN)w}AGOo2_^o?l>AxrT!7tMWXjW3$i+XDxx2c#DC8-Bev?S9%;DzW-;tK3$llvk0 zCs&lRNDC#rBfP3re4)K%xaZX_Avbf^hRO)Uho%M%m;y%hlYo z<6h~SMI}4JS9EeX(Ho#aW;#MF;aW1)SpNS(DYb`aZ7uj(rM<7`|6{cj{}*`W{68s_ zZxjnspb(1qCv|%m<=iR`oOQTCfCWgH8VE*@7ewC>B93gn3kFPd3@-|2OZ#LS^Z$JC z1A<+!V4;Asi8ye!D3lvlVHhRhR?FpE5Ba)XS`WCbA3SB&0&5qBm-LFtds0=1iN)p` z9r=h&0iXF91V)Y^4gGv)>m-UGQQb=C>b**f#0%K-PYNT*ewb~Xj^H<-T&8y_@53e( zqo^qH{eOh+--(7G%mLrNjdFkc_9d|W&Dh?S$@afg5llc#|LYduzf;8j`Ard5%l}s^ zVNu)DLw7Mra6~i4Js^T)Vf<7*v~u!p8!O;*o5CPf>5uXad$h zSF1XnO)x6apN<(8FGMX3!5}-KV{zIzpO;lN;S%D;+sHOAGVSS=e4o7)nX~hD^mc^& z8FSU~^gh*g%y_(Y-Xh?Cit#NqLXb8i1b&i5$dm;yyRV*5a$gC2nDwR+Df{BMJ+>c zYljHDl09}R1@{5SO!{wvKqDwi`1nzi3NN=T7@w!$Kdtb@B(kOb;p%OQrDdpuBD|YFy!)#_G7`F;^p= zIo0L3uwYXD2EaHd0$&ebRfC3w0#yk`q6s>`%e8A(N|Aj&Fu8V{u_DkkR_#9dU6$lS7Wf?u}b=JN=E0v{#Mg`EuIFlYW zxsug4wsW4VAwDzULA5DDmJtgdI#q3N855({8_6kCmzFH0BBhFFIXglSeZbFhALpfr zC#K__Tm7phyGxE?%#&=ReA=W|e%FesTVkAU_p3~_q!1NR7OhE~EKiI*#lG2A;8(Sb z?jl~q42pQ-w-I2sRyae{FdEECzv~@zLwf^Sh3CvZ;;w^B7wSdS6tX0Qbw)v*&3>~9 zH{c9DG*N5#FA_y&^*O==?JW6iBC3B1zRb<{f~MpjS}bo{xH?6?Oz?$*W+%`iWAGHZ zjEX5t%8A_}4i*GuJ8+QhKtcnQxQ+pt-^FwoI;7_Z4%DOi)+yc?RjP%Iq019^`?C8o z>ptQ!N`?Ft7(B@*8V6#|a&45-k*3DHKjG!Ok*C@1*q?dmRp;~ETci4^L-}Z0Zx?5o z+nA$HMOY|W#qzYE50J!N<0vg^JEV8T(X5jp*b7bUqwH2Pj?T}`D|q2aOO|Jsr>BD0 z3zVv+nh;$9!AEL#7>YAOteCOG>7oF*<0ct;v;$#h5%%jN5}55mQy3(JW%R8jB{56I zM>o1U1-nsQEO-Aje0WFgw-c#KB;}K=zX^E`zs(aCL}sHnLJmFj^5Al+;ce;hEZ4+Q zBNq@^1PoNkzmFg;xN&wIM-{`vYz3r~P2L{bwB$6C18Ak^F|pf;qGMYZwe^@IEVT%^DKI}T+7L)W7%4l7dROfC}!`2A2YvsP}Y1n z?_|Lw#vvr&_ieCeGUty;>5dU_Du|DxFy*q?u!Ty=kMB-SqbdewvJ$!t8eY@Jr)*D&JE^74~^8{qMgJG>N(V9)v zOO}prFrxbD+ zD7{KAVsrXI8On1n=AF>~Y^bGE9G*hh4EwW?G_{yyb}G{zm#tGnCqJ81d?qvRLeZ20 z-(zwh7n6^(hhrGcechQ(lC6EBrJG~Tmf6m&sJ`#xm!~U!CI2N7gjZ!TTr+i$RSygTwOUb+VrWe{N zlg7~Z&mjf!iFISZfog!{t6sr;M;kUfu!O<`JUelRc!RtT%tI=01m}_M!gyt(Hk8AS z4LIz;w?WcZ<&XiHv5N_77g8gA1EYDdH_V6Q#%yE0GF+Qv1V1oMuM5ZJuh8EAtHp;-;5+f(#i34DrN+&JBFgU%e2B1?ILwYIV@Qwt{2#{5_zYJ&EOyR z{{CW}Vf;H(Y8szt%!ZJmHBT=+v5U4P!1uS}5oj?5($}csTEIO}JXg=iSh>)cKIYS~ zc`O(t-zfXY^>4OH_IDw?VL!3~ryPFn5)YsuD6#^B6=k0hBtNu)SLjA{W zdr%<*2sCy+LA%rgEFoAp2B3tIxF~--!?+tryQCX(YoG6mJh$qwh6C3!&-_4&-E#!{ z9U8cRQ~2PP6r|)WyCFXN>XeWZdD!j#>k84eZPuE+6pgt`k!;5Ma*o$0=wA?mI}f+U zu-n7#C=xp6JiO*QhqO9tm^h(x&S0LR{qDE?5xS2ybEroJYON$o2^U5B#(mJ)*k{g0 zuH-mK-lC37m){LmD>(noAt=x`&fNG0vAoz5zSc%@_Cbh5oB;$SqcgOfEi*s$J8b0HQOtA|m0-waIOP;Mnl;(g1B+0^e);6R^f~c3%1| zq1Dai4f7emDY6+;o~Qci$jo?U1I`&7XNA8}CBhJ2RBZmjI))|qzJj{K_C4ML^|oc~ znklYyv2XNP{1|7AQr1`PPdNUhXHJ!Jqy|&tLI(6c9z$&Us&gghhM78D6YEwnOj&YF}tem~VYTXo7Edu?tI^7S-oT+L|%4vX~bpwb~yY<{$%@elRnGPr6cVz zTmxrlq}K9*%h0GUEzaIlcHP-I0!?t-dz9}_mT|6|sv6!_fKH#*3MALJpI8ykFbX{p z&yY1Tyi*nNQ;+3^zXYU_4e`G1+C8i$29fN?;%YMWbxC4lX#;`c%Z>Pe0o+<+ONsfiVFnz#Rcvn3}DmZ&|;6z zKbU^Vyc@$oztOFC(fppvUoce82IqQVr-5Qb{Xpj)Yg$7`xZ_h%x_HXG~BYS?4M?@y^duSe=0VJ4*mQVuuJGy9wfy@l_<-GUB+FJQ-@ zAA=9x(W6XOQv`q?xjN!3y*^$B-usj><6m!BRg%>#HKKqnREz{sA;vlxAVVK~yWnoEDq zkjgm0#0*7yt%zO-*`U*X1jY$kig8yfxOq6;tw>nCNak(|uUlh)GFETxJ^3=`w@)vCK|aOL##16i zCaBh*Yf5xT{L=;Yrr^g%(;x`+$Y^a=hsT6jrYZa{=)SWuE|{a9b~=fJukVyw%198J z?jHw`BTc7t!IWHh1KM=Y4V(08G_PiSMzahSVt4)QIzKY&W*qAx15JT=pU&o`F#NE> zif~bvFv0wVr2d^*dkbXra?qRHlB(6cX5s0Qeb{BjZi zi*gm=pE*YyB=JZZLc`kNkJe0wud9eH+pV;S&Z#I$Yh!xe2Ho??KR4wPZpyq(sg=F27q-r1#kB-V{Xf#PQoIRL(@n&O#vBP-aNB>V z5R0Uj9YQ$bInhqVF$;Yp%;(m3yX}=LlGKczFg!oc-!rGTzY=;sZ)JeXr24i?9uDpf)!-aor z*(FH&r|-cO+f|d(H5&2H3$!hE!KGE(gG^L@PsAoO!AK7!< z_y@wfma$TIrB63V6yj~B#C2x4dG{f;92phG6LL0?fM=~pcu~DoE1GH?Hv!mHRW534)(lNnNQNvNu zz?D$L)#!)?*!#3o1EB=j|{IL%?IAzi~Nm zBm2&NcUvwobXE0(;JqWDZBgOJ^pE2PXE=Fq3WTE_qaccy4$+yN5$!qF33LK z2gxv%y2FM>)tg<}ZB3O?#3&y)nq5EO5`wV~hmE;UjAk0jKcS#%YNWVoTCQiJ*fyw! zV@v%@h^wVvC2{W3fq9IqH*}431#%gTK;$M=jZ)Mf;(xzuWy3QhzQFkQ4O;O3V72{U zz|H>#*!=gEYmpA@54A%;_KS3V>>(f?MWl5Pmn^839EF$|7DieqA663ulA&FiaID{q z>&mWm!D~<1KGBQlAz#O)%MI*SsG`(^j&{r4x@oPWSxwe_%iFuN@+8mO1Py(85&dueg+1D+z1t7i?G7J2p7xGmr~!0dWCJ0ds+! zgf&i;abxx@v;-bbR^N%7ggMJAO+f=r*1(CL#4!tR&MZ_ECrkV9S@9@FGZ)x`9G3RP zS<@&+a~G%rIvo9>6DumaVQUZW8rMC{cbGtXAq%{Mx0mDPi+8+c{$4@k`q$rRM8lF=(cHU| zQLJlI79-y_!efzo^`Egnfmgj$EANF6?hQT>{@F(`J+6Cf&y{FTJI?QafuEhdP~HU3 z`GHJ4BwyOT-evB*AP;YHN zdLXu4`ziGbcf9Ghk8_aG-+v!U!ueJ1P{H|?@0i2+RqtTI`IYTlx86L#`4#ODp}*_& z*`vP~1b)fLX9fDJ+)V3zU_pJB?`)&LcLaVa-Q>Xe)$H`3zqbT_M}LnE6r_GG2>evP z$t4v6l)?xDXQxS6@k!ByZExP1eq>Ff!C8_(O4_z8FBd}rpc^gomU3I@E)bsqcet9~ zOJ1}-g#O;*&fF&tEt+H|-#HZ5`*WLR;H^G15RFWXt#cdl*>>!a8=KVVn-k-E+8Iv} ztzE(90@0mYhrG2_a9)shRved&Xadl(A#@>Zbk{aWuZL zr*+MCj5nIM;0}AV29Q_aPt<7WQ1a6-R7Nv7|xh5p0MqyP}7k5?@zF_c^rjw`1uG(fujc zW;e`1+4L&JsbZu1=j5545MFQrD-p2JztBz1L%7kV6(!p98DYQYmsDzQpAe@W8bcu7 zcO&T&3cHtd462-up1qH>CMxztaj6jIvHD-(dN8Xk6c|aj1DCFTP@`m?Kg>JWEd<^Q zGg?IZcLfLhjO7IsV~Fi*8W7&{7ASC-@8*?Zj+`ARuG&=i zefyIWq!G^vqHaUuIaoZsZQ+>1U9fl~F^j3|a|!M0hT}}o{4}%g*hafTnmf)0(N))} z6;>_28{x9a&YY!r$#>hS{F3H)piN9F3dJ=+FjOfV>k3=2Avq10+{~rfd72xPj?mmZ z_u#B1_dPEnKa=fJli;DFXGV28DY7cH0e_4X&(kRtQv|#cd6X1{^YHtHJ)uRk zPgl0ME}lhQ^V^a8@WBSeGDJEss}%)K|CTAoH~7K4j4AZ{6&asq(ihHAzOd*Bi_5;c z=pb1iBTD%FaB|LwpPm#MAm-y#jXBxfXkQ5_}E-gEN@f7rjwu}Jyrg9J0Hh`N^JNCW9{!2Ekk zN=#ee9881p9e&jeUb$>S5n_XltWS z?An;_Zv%~@Ob;QQ?7n7i{{m`9fU2?e3;WXO>g+CVZlRv->J>Kx@8Nzy`4J!eWg?LI z<=Dh(7}-Ia<=CSqG!m;(*=Fovv-UWL%w8eNj0NU6hb(IY7R&|5*oSOh*|R9hx&839 zni!(ud2s7Sp|m04yR;WUlIkoXQEEn5z~Ttye5v4(U08Mez9_7;UC=#h0U1u$WN9i{ zPk&r2=$^I!RicK4H+}XzN`lSn*DUtcVaCRU3X4Xt?@co8_#ijNR*1XWF6O@a3i5S% ze&!b%c3z5truGcptu`bkVaQT$a?ep99rXcY$UA6)ffPnVTh84}Qm)3LE~h#h4x#3V zP!JGR%!WINv{+sWV6%80l*4c?MaVWyoUlM9aimvJ-SvI$B{6f{S*1N;L%^T|H<9aPkaHr`vh5bqH?nXb11BU6Lq2 z_t4>}E~^%rIsB{C>6B7oltj0Y*9O%0dhFNJq#_8b{?Q_+Q0mmd3E7V5Ed_rLITkPX z7P5N=2i@NI!{ZknzC%^MzU)4Qr1!$fmMzPLZ@uW3Jx_u1)9- zw^*cTV>$Qt?=u3R>C*jaoA|5DxcfU!<0#s-pkcv^6ETO5N<}-i)}N1)!giW>>uU&W z+lb3SBqNvgz{EI9=8Q_%c*`bJc9TEO9X3yftVoeKm#0uk814FVp&VUf1QKl*j?twU zcAAD;%kg-i9u{n}xchNVvZkYzXkiuf4wlK8k*(Jav#7Gep+ERk=SjlXwJD6h)KC>C z#+(zY*N_`2$!)n7Z zzE3muPs%XTsT$L}o1u_fzIj(Kx^%+CfQ8xmTKhW~^K(mrk zqD#Y7rKF%sNJyd?lToi{<8nN`iVaAiqc@eeB!~cN^e*>o-f~IF;AaQsT=MQ8plVlk+pF&TZ|Rh&>NYjmv3g;|)6393{2(;egL*i3zJ|>i4@u1WcP_dX=86R7IPxEJ2Bj4v(!LQ<$-7q(C^X$?uZwkp<5S_`e8mwFmQmVX8uht|bDn~CI6yGMp`Uv)z<-FFk}fibC_j1t0>m4rl3{ztZB!b1#BI}rdFHRGWM=b?8d`#s|1 z0C}g46fOidkq4kQ;h_f~(2fb~l}aukRT{htgK5dLU*vEq3e$C8{v-l`3-l6b##z@}*J(9bG))7ak1EFoF% zkLN6*k~c&psUH|~LDo6hyM)Pr;22X~WIt)YCd>EE;%%$VX@X!5z>RVPZ@4Nxlwf!~ zHDvw_M!{ie5I>8qzKm5hQvVDA7R}<+ac7TP;jX!DyDbzF8k!tUAlVXnUWQ{9co#1mz3ftVK`Z$e#9QKaspq>HkFHLoHwjKNnUCEJp-9Xcl6UwI#M}ai8zQ0d2b;51 zf6G6FM+n;M0N5nE26t=Ngny#`OqUN| zrSDJXJI!D8@j~8c-sWjr38e%!m(yE~RF&RB+nlIZil+$dGKq0E#vX}R=lZh3l2DzJvc4vtO`bJgV5_Q)PeGwL zOoMvI?)~Rb#VM)r==3q&n%tzftP!Fl9&6n?n}UMq*F42R!llV7C!$s~2WtJaLN*n} z^zWt4IR(4Kc=NqF)Vou+JCRe1>Hbydw(a?YKc4uT+*bjUQMUV!GZZv%c*C>)?xJQr zw)<`a5>s1Lt*1TfEB$PNiL)#eIf?J7tXYYtEJaa?^{IQ5Ljp3j^ua`sN`$ctEDZ(AkaPrFvD}tu ziYTf{27WM`U68P@>-Ty*B=rzcjMegZf^rZNPKYS<>dBpx*#-&O5p!nZF7M)uWV`?? zocYi_>0D&~&3x(=>1NV_p{Um%1#VrTN!A2|z0gG)7M}6PyRbVpx5vv%GcW^1|H=^k`UN*jJ~_MK-Qv%x2U& zzL8Wd$D7K0#L5UEN}L6ba7lRU>w z8%gGlpENQX#9ht~T{VY)*y>wvRHDDH7uhvltGRkPuet`JXUBa3+^R!k^~bThX9xFz zkXr|xnGJx*&V%r^S{G2U9)R{i*~VhS5V}D+hb|9{E0mg98Bc=zJ;W7;t)MOt(FNKU zYuXd98})jod?mKr11oaSn_IXuc7Eu)7L&l>%N`j}+9!%(4{d{5VCc^tTc@H=Ol&yQ z4TaH$JbYA|+0;p2EBtZ4U3w@m);{QcL)+sw5>@-{U$9^sj#{C2Lc(TT%t!Hmgh$$l zvfgU8HdYgkbrawpS+Bimn_K#|mM?Ct%-8wUdN%awkPJI)n?5Pf>t1wxQ`xT2u|^4gGKiqTa+aE`+)G?ph}UvPP)HTZu7U&SCPJ;tsTDk5^l%`XZ#fq$u^-HkKGlQdy{&^2*B{iR1kOzU}w15jX4 zsE=p?IzgNyl#p{Flq8fW;d;+!Yy#Gxw-3*zSLpJ`($(fN?imgPuzsvVb-Wl_5%e-P7(qIC{7fF-CZiVY&#-@CRODxG;xJ?+BdwX|zAV^OB!92MREqzy~71dkM{86}`ky4#a(n886(R zE|7-Vt0Q!tHLxT^07b0x6As!5cQ}fePz~+{QRkraP(gTvpuW|#$L!6BKHr8!5%qLMKSgGA}w%Sqz4hUjws z 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ΜZ6|8$D|^{;C$hBb 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

n1BFiS=zw9Ux9a^iZ0nL~0@l zk_TiG+x!Suv zR6J2Ky0@8#nY8Vcyt6cgM~iA{$|m25PT0e_g)>9I*p2f-R`h}GpQqyOaM25Td1W@I zB=Rb9ShN0O5}Wb4pu#(Z5%IxR$VGG$Zfw!d@eFLBQg(k1HsJjEFi2;q6UvfECX)@o zrddo(K8Zf&2&<_lMYL64?2>CGe`xUdQjAwu&aM(yk}S1hqQW`3~h(uD)}y63MeQMLef%Tx%jPS384@5E(c%EoIZ!e3zN=q%l< zZD3jd!%7l!#8sprtvlT8H39En&s()jGp1t4=si$)ga@W&7EQ~GHtsp0s?!Hv$lyoF z2;S0_G_-1i+~KHoR}u>NT)sp}q)el2B*>hX42Jx61W+kmBSIFnZg(lF_$(tS*0c|% z(!K6%yb-3{iUw%&Ysu8ajrb?|@X_8IH(z4)w=wYB+omDqicI(nRi3&pu;MQ2qcQj_ z>XXZ5{}aVQA%yFfO=P6cKgQuDbh%YRXjjUnUD$H~S%r;8dJkPh;=HR_%yg?@x#@-ECoG{0bCbON*-3y9XeOEgnaa`L#O z8}zOpyZn4@giyPbyJ8=zgEQnG1U)FXGO#`Uzkg4u9m>NhrJ?yn|7Gs$Np>KtNxk9w z&>w^}f0@9r!mQ0TEy@4D09Sr*+)KBcF`pbJskG*+Q&81Hj z3c38_uqj!YZNno-Pn3F30qrxYN70cnS{Rg2=ClZ+>$W+$o^(mQM{KD?*keIOhyUiZ zJSFy{Uq=_`4P(`ljIspbU){eh8e5h1yn2JkkfySH&Emp%j_9Ikw+Oq2^MQ5kKRv}|8tp1G#(_d>;{-QbT@c9DzWD@J9}@Ii=1SNzTtQ0$`4`Aiz&kM1WV(m= z1US7ckig_f8QcVlCoaB;3M6%d!^YNee^oJbuL!%cMz1o}5D)^_55oc-&WQ8 zMu7<>sI?)#13oT8OkR*M&8Z0F>g658Hmsx&OT8ejIj%zwZ6=G5uo>0J7un?RpD0Ux zP_8$YUs*v9%{k^zR5^ihLQ}BXa5x3^F~m``+)WHbG3n|{vzI*`vNSxa2=XLO3m&~eu5{ej8q-(%u7ZxPwit z9~S8h7F@`Y8N-68TyuTg{buwPbj>GM4Onu9u~U;*VY>%U(5z)Mzi2TXn6PJUP!IFm zR8TJVy~=m%#fnEE-AEX|53ew70a7*((97lyYm8soZ<@>L*xRzpAkXm<&xx+cifw{0 zOhmM8D=AqGSUTxp$!+O@UBEKEHc0z@xbmI`#IzP)06h26oN5qAr-60yUk8i2EdMO} z`a{$Ne=s?ZB;yMfo8f)PnASrZK%bkqK&2U)Cno*pqdKNSe6y3D3 z8C0sfOT+tEUVAxm>y(kJ{+E-yZ%&t2yzwXh(6bEYo=zVq-=B0$b)OLyG43+mb#_Mr zaz2O+r20i93#e^jo$*!20Oi>U(-Fvq{bY)bT~oc9YJ+C*{*6BH0*d7gqiSuF>U+(7 z>b5}f9LY~{$4B?TFJefmZk}d+OMdi*!Hie z^H!6xU5p_|DC^@n?I2~6FIt#rU{)LyKGr#{@`J)uJB7NYP?p{LwP2`g;&Gjy6B7Qk z(f+}qt8-ib`NQ(`?zmn3038(Xas3!45 z&*{TY7e7=&u)?;mbI5=V9{F9#3}-htGP!W+oyr03{_c}u`eF-c0~VWXpP`zjl-g|} z>Xmq)dKdb2L7kWTv_IwLbXL>1rB+5&qu_`XcNgteAN3mj)(_P^{N;BTG90NO1m2a~ z#xLKr$#VFEQaT#tfeN6 z^cWA>IqPUrJMXmPODljGKnBDO1VHR_Rv)}wOZ$kToo0cxOUMT5Wr`8(%AvX;{EDT% z`6U~Dlc={MF+|t)Prk$s9}y42!b25vjFKvzjh`;TGaCpO0wR08ZkIc-1BK)CYM&J9 z3b>0Rb4Lj2z{|Upe|C}H_LC_C14#4>JRAZ#+l6^}K6Sppuf==s{zo$WKQ7C=Le5U4 znaO81Y-8~af*dJe;k7ujoBM*uIL4R&8oMzPmdRX*lE>TRwa5&G?65x;w`4l{a4OYT zIhnb#ggh9oMfvC7$~Pb(VW;Mj(N0bbLIdwrp(K%c<4oLlHJN2A#&MIkl)eEIXk!$d z>$IrlwvNtW{U(<&SbvUiGVmO1KLLjjnVhN-^XtBCKrXjX^rsmb#4iL-K#1R7my3wE zo>!iL{IxTNS(|vPyCOCA=;EKCr52!~)rQF6A7x1)lBCL}nz;`76V`mrI?4EXNgxG1 z_^won$*vTZ>Pc7Nxe{)W+bg5~JJjI>P7X{EABh8bjKnV>zGn0wGO1(4U_E>p!a{H; zdhlYJ1Nu6i!PAra35We+5BNVQ`v&Jo z;B4JwV%wOgW81cE+qP}nwrz7_V`5BfClkGF-Mz1B_rAAPx2peuuC6*?pWpd}Dnm{< z(01uc4l@aRWvlQN0CYFk(d2gh?f>Ok{P;LNcLPF6 zmlPNiN5-J9Ol4?Mhl+07lZB>97oWf10wq=HPV4^w#V5ImFIc`c?w^Fc01S=zzjbZq z(WLp{gTnfNiP>sxC@LFw7^C6n$uf}md{#~b*$Wh4L|Cq)*|HDCkJIJ?Pt`D*-#1QS zaYEPb&Q@&zuIknRag3*d&enFzPdbmFGZh~siRv8dnilE-xPu+=^ z)(NdM&kW>JwX zjeC=;6C%c4Lwvg9_O`Ov3>GIG37PPxc^#5oa`z6g6mXoKx8h=C zozBG$5@KAOnBX{B)D`Unf>$sbUVlgTxGD*UPLL9itbbLiu?EA&AhT&VP_?=LUQ6X= z8-&xsRAkp?@vJt21Rt7vjjct7F}{aAdA*VNq6@>4dH> zh!$!;UCF5kK~z(QF_Kw2vgYAj6hTF&bPHR>5|wKTgx<;dCj(Pc+zWn*;Yp1C*`tf* zTf#67AT-hoZLpKtd-8-v97ME;5 zIL##X>}B>ykjNvGGrl57pu{g(JT7c*(koda32|yTkP8hz|7~i5$1DR@zDcy^|6Gfy zWZ-1||17qtQ9XA;Q9=E($!xSxH-`iU1uIk?F9HC<4Yi1cP=(Ra`Loc(csb=?L$ ze5-^KxJHp`*6og2@p>}mkI_}X5rwzL^wTQ=eUjI~dnE`?7j~Zm;VJ6F9|MBn&j6u= z`*sw@O=0xVkBW(3?nwL-ATk#k4fGATw}Wxn{eMOZC)p{VjC2_X;u)xik_Q0PxC$}o zFlIdq>&PP&Rp%Q+tEm+Q8#k;LVgN6no$kY*%N@eBAI1`nx@z?1}WKtZF;J}3L^hRT~#)cZ*g|0 zMcx`jfRg+7&D-1d07PiHnw; zdA0m>Oq;kWDO?VTBqV1(N(0fNWU6i4=y1t_7?{8dn1$AI>|+%e87U()<36KqqJhHg zF9I(RCGCwA4#_=&(bDEzCY3JZ1cn|aV6=(${jF5qLLBO`Mjl!Eu2Qiot+m`EfRxdO zb3%3r(_oKky}V;vX68UtXU4giYp$8e8nh&)!VMvz6ll?T6drt zT6d_@pS-|T2h9N-cclTWZjoL}cbsc^7UPa_)b6NfyxlqPBGb zmBC-iUIHDnBr`{$sKW+la-wz*))JUD)IdUAhNOJ?p%-~b1*Ug^v-i>l-8-ZKc6`$l zJi-zwJb>_`AOO1$JlnGbcqt{*7_9U%>wr%00jh|#;sy7VXQJ|p#Ig;8KYBWW;g)u`n5#S%NXzr643;y~k0N4X`~ljB;~xn-UAg878$*gs13aHO+?5d=Tl_3F@kKLL zm9${@lib!7dOQ2V;gtwvE~VKvshG_#ITJS1MNb1IKOWYtV}PvdcUgIpXNa8DY!1tW z(P;fe@%18s58R*Z9h#x^eE#|Ng*47 z6tjF*5nLNL+pfdjkF6&d^QwMbu|@u@9j(!Kc(*J)3L^n5m{~))=II^n(7I?5cqPB{ zpW)lVU;g^kMz=Dc@Y+MjUki+>DiS8#@}qZF>JDOvsa;k3KXKb{uImDkdt$?A^+iM; zU8*}5=h;Pdx821$g$1B?sb`Ezn)FEGW)2#g*w`H;`o*lGZC4en_t(P7>cQlQLdxtR z_tOSUOt9)}2v+=82QkhF3f5FPJFTiM0i?BC*@Y z_<;z^BO}>;|50(QD!S#VHbr1%m(B`x(8@G!q&HS;w{otzFxJ1v0Oz?1n1AmG{p^|ABe=pZ^hzBn1y?}9-Q8sW?Dstb(|4b<~Yk`CyQLmC@>f!P6_K}`# zI_~2Is}Jsh$_}VW1498&%j$zmd3sC^Gj7xF0=k)E-DITqc~GtoKtNU>Zo^2S)t4v5 zztxDmQ=jwZb6BA=cK|N3PWJaM6W!xU;OTR>-{U>6-{{bA?#urObSx8*dzo; zpKTek`RbdsBV|~w8Vhyhe1-fl-%F-xD|bhKC(*zneC>|!ek0H6I+?;F_fTYGKYJd3 zpMun{29^6;G2uG=ymplJqYiY&Do;62=G2{%U}J-5Q%whE^)@2JqTA2_+KeW92o6T; zWogjN9DA+R9)$~CS16=%MMY8l1y>KV-J~EyC-iU$&6=FZq}U>Kuz?Onuds&4&t#9) zRvs)=v_ha;mc}nJ)qwnyX%$v&0gy$Ry^SWc5=Y|VWpbtNvN3U~Xwita^&_?S?@Yft zz+@T%L_Ywiq?fK(MS@DIX9!OWRKUX`AUph_$w0WTFTbzmS(TBK^(Xs&ZfglnE7_n+ z3HQL^%_Q@)VH;UvF$YVu+)w~)YX?RI`+-}c!5f=z=z96DR%3GS@t#qC5!+bV%#uXaUBgF)HKRZ3 zem|?eqTlK08(*MsS{7aiN#PAX!z=oR)g9d**-)R5@zxnzcx?cVV(c#Ai*ftvw8Qg% zEP7&apCH%qmTp*7Z{T`|+88c=^X3Cv$4-)u88~zYP@yiV6pqFBIDa}i$jEh*q?#x$ zRhqUuagm;fk;BhMp)H#36NGiBS4#3f=#FJExPjlhbA)CAI={G*F2L?u0vGcB_1%OK z9BBLUJ>8w(w9J2K0RDeW_dj_V)$fQ_6--}QHyHL&OwIBpH`_42NCz*uGUn@o=8guYjx$$YxzAoZ zX3u$kU*53#;C!PA{Sc0?^0YrI#P<)7yaVM_rVM3Az_hUkxOtN%0|UFE(V`T!<>iy# z5+yyqgBELdBLhvqZGJlhtJQa0!{qI~ptmiSN-;9kYlji4F>b*b4Y^?3_Lw@$MVpWz z<_=vB=9;Hghn#J;T5Y~Z5IXT^yt&~nmTSrmp;Hao{T3()BAG78w|G6Z0Pjf~qI|ye zrZR^ntCz-a&t1xF!lg<#djTx=tpi~_;`q775USdr2O3lxbL?wc6_IwU=r&0(>N-}C zSZy}_@e#vJdS#S;#B=owy^HarIU9E;)#@B+Yd3HzGpO!R&4~@=*|Y16m1`wFkAjV+ zoe8er2&J1!H3M^l&8rSAO|#81Y+7Vik%Va#sl}9iRJI_7^F&+R+UZ87;>NO<;IkL(ntl#@oNwv}oYIhjg* zIPBEINv2YcCKYSZ#miDn9ayTRb`uhcJb|q{hJ&r>t}+CwyJ-Jo6;+v8dn^rFm07u= za*wK7!4|uB6b_E<7LKLrOSfcJs_GoOcf<|0EY3P8^!hd^bkRMGG~bU6He%?}INjSr zfXjcIrnKXd?MEod^>$Qu_ILfUC;Wi|aVx@l2x^F(=gLt(2-fs3mJK)ZVP80;i~CV} z8Mz1k+ecq<-SD!{gvrXA*5I_dRg2&V6j^*n&)sxx5@|X4hG(`5#UlXr?;6v zeenHf=TToMb$n6gqM{_=9<$D3PA#V$d{V91JZtNXn^ifU&Ky`}Cp0;rk6`n{g2-t6 zTn;MVd0g|y{K=nWH>3sIg;iAH1fpJ&vo=AeN*m!PW^G8zKM9^7#);V_&Jha&ph+!q z2(b2USv`c@0hbF=LXGlcXDH+ad6B+((c5Ci7-N{O^vxh8$r~f|L)Vy-B0u4-iSP$> zhSfC$%SfK+%Gn+_L87^XT``I-gTmN9*}BAzl+^iwi;Q)_StVlq(GqKk#Fn~%l4Lm| z%L}4CG3#Zaj>=KZ;!EeE!Vh%1F-R3oNfHX{@}Cn3&ow%wh@Mb2z&L%N4sFTPBgyWP zH-5|7il$T9OYaP<^E##XNR`jSd?$#C+EgHalSMRZCe z*uW$kO11n(uaU6;v=lztG-iAwikX)yTT1T1^$p$22!cDj@Ts54Wxz)#VIld%$5mNYMWK#+p=a#91n_F|G7 zBj%VeU9FK~)XwxSk2Dtf>GllbujT+O5H{HE*?0{MUEX+u#VAbKl#hH{6(KzhfMuyq zSqG&G^UNF`%O*Xa^)5)L?uJ@IRVL9L2sm$5GOV>+Z~-iq=wxi4WzFBptJTWXgT+FW z4p4QZ0=DI7?BHY0b>==0QLl9S6dV~w>dYJg-2R^Wsrbf^Ok;Lc*Oczx+BFmU63RS@ zeTDU?IIc>jb45 z53L#OS9Ro8Ol&B(XNPSQlRz^nUZ(pK*tGHDle}EL6|&^{&5{pZ3#!iU87*H}Vl}*f zIY8IhXZK6QGNm7o8|5C5qGQG?qOO`CLSMSIn(8MU5O406>qiWzqu}JyK^_`WYB zE^H$ahb|s5-Emr+wYso{VMd0{sQU~KIv8Uf)xjnl3WmAW+UpOnH(dV^lG71wqU>ZI z)X(&Ca>3BA?g+XlC-v$wYJ>p9Tz1f`SQx4~ra-b{LeG}1DgwHCeTI|gf>~*ZBv+F) z)G1n=j`e@Qjsa4P45=0?ESGqG{Gg^pHjo0Oz>C6 zSi2aeuil25aCWYT)gbj8#i^*{#a5zMFt`C zM`GX;D7<5h=ZPoxTP?XJ5#59n2+%{-L^`?Sg^OV)>SF5Lulw^AQmtfCZ9{a$C12qe zQmytt6|r0u&?ZRP5j90@>-D3UkH+E^YBMf28~S^^&z6)kY*K2f;D~Xa~DRe zp=N_n7AAog9NyEUxW^iij+V#H)XvmTAUnR%L*AqSdkJg(*Il6*j;7gdGru=3uj_2R zFW(0m|EM`)^D#7D?ZY7!-fq%eX5Hf|3*gmTQ6|p#qpA#gQ?OO%~oeKm7^?2S2d&PJyZ-6yb;IRbW4wU7Oo`Ln!@Zh8KK-l1GAuJuw@dv z%AzcAA)=bhsJlW7)M-K8+N)oSp+y>@ijtR+znH5jOB8h#t{I1)u_&J^3nnzS$Wxnf zGIeM#x%p1iYJoYQo9Ai-5 z8{ubJZ5n%&M*EgoRWfAfb1GfWkW1l{31qF}1@XE2WRQV^+!kh^8kC40wD*sPn%#w9pc!dU-%?&Z4NOgVlssz2{ zCl;YU>BgZ22ks`}_$1kT+D6ffJJLn8RUOU=$BC{>x_;#gPrqkxIL;4mm(f(T?iww| zP61cWM||%=4pcqm97?4c3#dh|aqRLVxwHe8b%3%bafqX2MGdF7Wt-3rqg3rJS5dmG zKn@GD$!(Emk8-zz?4}13%EUs|^lD{eKlq>rc22lT9MDrjkw<~LdR1MbD`}B~8D-+) zd+r*alNeEt$2m^v#wK>LMvRklrOYhzs{~{mNO3Jl$#J-s;sCgpl9_(+^d+oK{zdH5 z7o@U=$>qK{Nc_1Z8#tSnL_}|q?Ui{sE}`IvnV?|M-CB0uysmx7kE=){*mkN|#&D7v z5kb|2hs5GQFMnfYNoL39bK{{)rt!RavYMiZc|>tr;s-plO>Pp$pGXFA5f^m~p?35!*Yr_8HwnBb>0N`S;#J#V z_<~>_2%h$kYl3dZ41tjm4A!FblUv(0g^6H&XWM2UY1&CX#36kheUwka-Fdyc<2=H= z2jxmR28=wSQ?sBN-=iE54{~oO)5{GmtfpSjx;2N=S@fj?R2f~6m9DY}m24kh!+Xxz zg{sigSl&VY_1!iNHBUGGy=~p$f1~FA0x|y!B}ddFgiw#a(@Yx~&*`z%=TMPG$WMQq zL0eWDN&~YD1d7pPE@i@Zp{VP)uKd;s!I#J+mC0;9O=+@NCzTPJRrc}^UCP9l$l8AP z*?IPxd+5oC`~7=MLto1xAP1}0W9Rx~`)%86=j|!PkH-g?ALo)Q=L{iNc)(dXT%F;@1L^WAZG~0);Ef^@%krzu!NKC2C z#lPJFRDgmKP!;4<;cj_AHC;?dFlE~aUPXhj@F3p3nQLtG=-Hr8!?3(|pRSzA{wXaD z{?8>MGU{h>i^itoc2`N5v6f-^m)&}c>?3}H^?>mBWW-FW(%_N~0hZKk_-Y%c;kB#6 zMZ4j`OD;$k1-(q&M@tEqXk?AS!QM4_K`AroLEqi4D;b29i=7EVo~}cNzys0B$T)uhxX)dtb2CWR(-;MF&2gIv?Yx?uE=Qu z(ikhlIN%W@JdG@L$pNpNN4Q$ssSbwO*%+Q9ER5HH*K;y$w6AN72Gr-RS3V`SCN5QD zrd8-{S|ej&DdDmblBIcUv?y7tAwJQV(C9iT^&`q3gKZk=_DEh)5WX(Vsgl?fK0DJ_ zjg6elTBr4_Gs#wxL)J{?s|oe*%@u$yl$F#SG7`5KQRfD`)-Z0i%+f*M0)56kz5G~m zOXuS3K+>sSj_Y=#vLpL{6Y<9jCB@L{krD=i}eDJN+3o+Hr zZOSE0CaFL>!@F&>s}pI85@lF62BITg6&~vEit2ww*^ribiH$@bwis+F($MKOXFtm# zxrUI0M-W3*gb`H?h)VXEMO8L~)hgHnizr(Ie&l=9(yA{`F!dJfFT2Z7EUvq+vsDOt z30FkhRlKnF7VUSv;Nzt~IX}2iYc#$SpFy!&OLovk=^M5qrLICBl96_WZkz6EE>SkY`pmr1R@ za9gwg7?f9jYExLA2hFD^xDioK{dlBCUwoO^P@h{U?A4DV*1PJVln zF`{3?^KQ?wlXArz5@t@Av0qUOdUf{@U6O-yP689TvtCL6lI)bRlg>7Ga1a<=nN&U@ zt^+-4&c=XsZ2|ts@VhZ%aKFsTAqTJ(!{coBKqhhgqjUB9cz$wD+7P}w*5IDym!o{n z7dJU!uPR+v7`LO?xs=%)_Zc^Tf>_BAeYhk_A0YEkiw$!N{SePAz@>bKNBIb!;`v}m zr?4$HTj{wR z*d2bx6k9e?(?&*O#$P2}}YenYp%8Bs60Mqk3)pagtj^4ZnLDSQF1?8Ng$m~pMq>&Wn zp&qID7=X)eQrq7V;=ZjayxI&9Fo5DatV54GVK$_jn|>%r)u?x;A#}`M`lG3J{=Dk| zF*1dd^HRV8ABR15^pB4L6CVR{Uz9@3$S*p~krScInwu}BKRUU6F3>F?113u4I5%>J zuOw$dRHgNf{^6|BhRdL}khQsknE|QC1Z~kp-4_}CB-j=&()gEb3SjMHDU(`w>sldi z?9qDQJ5i8BWW=;apuSj8SfW5xr`ICzNVkRoZ(s;7?Kl{lVc}d_o8}IE3)3GZH1G#4 z8o5`0?deqaY-;^&oZVSDuWV4S9&a_o$PfEXUL#ZQAtf-w`c`Yf50m#~2GInl9IuKR zAS@ny6<^~g0cf$6(8Uy1#ivtOsSc4E3k8zqTq07lN}5`^BKJe`nzV%;*>JW;DHYj* zll>$s;HxtFJ$QJ?5gE4;(Ob8#zHNsmA1149UU zD*VIeH7URoW2-P>7sw;xt%_nZbjUHaXeka|@}viFL=GmBRFc|(-ARd7o_q~bLjD95 z>uFv_>mvla`rwd@v57zi>k^p#I@!U&zHEm9F}>40_cS-7x!aGW4Uf}&^EGG7B^}VkA}FYo81&?fJ0QVmJ_C%C&4I!FY-d3E_eQQDMYA)^%?pWL5+St zrRD#_QfTC8V54Mi!0@k{4q+2hgYWhxMFU%7I~yfu$8QInn2D{4<3Emb|Ft&ODDB8C z%AZ5|g3Ij4JOic~<~dY&i0C4Inu8W4p*jTjjjKGyPZY^G9E>^qOTCCb(weDHw9w6@nvK;0YG--m0CQY_1DrLrMxmqeK zx!#qYrN>mMI;&Wy;B1aOH>@yQ&CU!zP89y6K_z&a4IYwbD7JRj@GL7!HJw|Mr3#U3 zxL+Za59f{3Xoc!LV+SK*EG)IVOnQtez%|ik)7F_Z)}NE1=Da1_%r-B{A_XqoQ-EZN z2&#=NK8(3Fll4;ewt8R@2dj@*bagfuLf0tz+1W|Pk0A{~4f^Mmo1ECJKIoRC0Y}S9 zmPQ+)I|UEt!9|YTGeQS%e95it+-=s_GNBZ>bAS3FQi+jrlQ0RO_Uj+%Vz{_KK-x8Drgk%*E)o2J>d0 zQJ0E){xOGNk)A_vMj)W`d0eFRAn z(D@AzNVIUCl{iCUd_U#=Llcq2=65d!hb88!JvuS9Q>KR~!6j4p1iRRNf`jfTdDTnM zR%$ywI{~J1fwJJK8~s2Z;$D}4h*9g?eygLpzwWrOeOx;1M?pyB_)=} z_J;s$NZ#x35V(W|`FTZtVB&>RLGg%qA`wG5{m}VF^VL+-FkD&@_;?|a3^*_u^8LZq z>gV^Ky6ZSOptyE925|>5OjOzI<6X#u->#pY`);ggQU-UsQWUw68ntG2TTU7x^CWG# z=kLF&9yxGxf)^a+`>cH^M1y0N*Ow?m@SjF2!pvJ|2NcqPMj23MfwA8O_JRye1Pm;Q1ugNZw*z7k`xNPmRT14W-+uQfYED~Fs zmrBIpPS2OdY%N*jG`kqFvA%wMF?mT)MSr)n%uRiHUq4^5z1^m;@%lxCbG{(aiJTll zYs&H|oRsN0Y9@Ul$9>i2e-)^8yT8|^e@;b>Rqfwqy1(bSziXGQ_B7{h%b!3WNwfdD zFoEDgbFH{|TKMr)UQJ$Isl8Vca-pzxUNZ8~IFaJsbaY5ri=JjR+^lM#2PkRRmDkL7 z44Q~BTr0j4bof=bP}Z$H8KtaSy?~XHEC0&b&>%dgadvplv3qFJtzBIs?@{7jha9)O z-ynKunzAY=4_~=SMBYNVS$fAA(5zFvLx8?owMjULO!?||0kZDdk?y&oTc`UC4PXA1m0`2sCSQJIGH^S7 zVrahyg{oWXaAU++_)sCljjB6ryvwKgK;O?!P3{^p$?m3}x1w$AQMlQMIVloQn3Yi} zXiAhbkCM^j$!(?2yTG#9VRR5f$YdCtp$Z>59q|Ok zgv3H@bZNkpKtGs~o?(7XoBhMZj@?8!T9~wSEF(2}6ASrT-WMkfXXqA_)Tcq2lgYSv z(R1l!MX7%&egOr^X>hQ6OB|De$EXx_JE|tZQA>Iq2(d)afhUJ`LAvLD01vM0A!6Ra z$48Boi8elXK?AWT|1s zjr8cFD(DZXfEIL5d#D(YWqoP`STnNG=p|bpYFo&nECZfiHMx=DOqY!}wL zo~VkM^kB6!EMn%`u>(<}NIbdw&#M-}<>gec$Sdg+d7qvU;;e{~jkm{#m-t-Jq)7V! zL8A)E(nOAyP44Hj)Q<4uT5A*s=FIsaF?*o}L0O^f!7s14u$baG{H4p75}_kuMqA@x z%-_Qe$^BJ=xdFfw3D{EnkNM#?_j3i!z*g+Q*x*gGnZKo%k|D73cMOOv1#Pg18>vi4 zW0XxJEnM!ky+;p|ycre;|FWEE@LyRCI!8g}+B?1vYPJHf(B zft9eub-hhPf{~>L+~YHp{(YclhSSlZo5iz3C@W3GYVuj)=Rj<&NAPz%r$#(2MzZ}W zPHs*79%)%*?u@L_QD3jrKcY~<+p^LdIo=< zYrou%3kaJ=m@`S_or+rp-)gV{BU2gXBlh6X$3x!5;t}m=b0{2-V8$##=(u||*gC;z z95X1;WX!A_6*mfSXp}YcP7eU~j1gvk|K$^_2bUOHn2j%-4{`Q<5xvn)VyF%#XZ(N= z(9KqfgX;9^?o?-lwq&;-4b1((Rs?>m`fFh&^Lu7v!K*p?4`sF%8Zl)r!J~F%5Qy5V zsaFZxG-Z%kzuko$ahZOEO<5EDsL^(7nX0^%$VGhL3DEAS@)DEN3nQQX5YHv(z&};p z^(aFmC+sZdABDvgv_Y8S>5@HgyX`{rjT?QQwM6vMpk9{ z4%CN$-=hMHzx49)4&45@0>^{RH;fQvASNe~+Th8vH1z5y*?af}@D3#?tkt}*F&>J8qi*Q#!Bj4-pJE*I-J+iV%i;w(HO}D8A9_CW%&@ z{*7^0Ob!pR$I;JfiGbwSPCMrkG65^6s)hp+R+d*aL0}=k?X4C!Z{k)JqjgC>ZN)y; z&u9{%>KaozVn~>#-q6xvwbXw#b*w9C1%Aznda=~x>x)Z%9-018a+#8Xg`ziFQL8M8 zvBNg~CUmETEX_J4^<=r_?lQwv%~KlF#D{DgI`vp~kA&KHn7k8UCg7>DAN_0jZ;ysd ztJI%ggU`zNvHGOLDnzC4h(cRZWC#1^zgOC=@3m&Cz$bpX>?@^OC}ku&#z=??bm6Rq zYms@V4>$<-wVbdKxAu2S$j*KQ>=TF(jX^uLay7Gz613nQ4^0z@46dz*rq{^oD z{1)A7LaA6f$&+<5f66{74X6~x zN@>7J`Ih`O@a@KR%PW_Xpzpa_-6f~=Z{cAoR%P<})naprvkne)>x}%eef_i=j||JK z;w9|zUitNpWj;w242uC?y&+f@U0V*SF&RVHBU-5Tq{>@vAmHm#PEN?nv*zSc{Zq)A zpi8zv&$huMpZawIYrN1FGJT_@1;t+kClB+QoYMk|GeE0 zsXZ^72Z1x-v!I)L3Czm;&!kpisZ;#FcooU`>%wsoU%8+mJ0rg|h^`Mh`dzgLHF=U5 z6>-yTdh^lJa%lS|6UzV?=`}={8{Rfgz;0P~IXn-4j4jhB?^%SBu{sA5tCc8L5_U}L zDxWI##w&i+t$$bO)o9f{Vw4k~xDhM8@L-q^!EUXc!u{>(ZJVAOoten*a}2dTTe5a+ z6}{(dBUf8Xt_t*>)&pFr9OU+ShO)Y>Kx(o@wXEyU=~1=KCecB3Duw^4qX<_@1JO+& z(=)Ss4fM^k5uq{ym^0-53J-i^;TyRCa7xw9CE1^ptx4q_hgR!;;`{(rFZ|UucCxWhrJV1L z-d;v`s(!{O?Rt@3*mtCbvoYst?68Os36S+u} zKu=a~PaE%s>VYHL`*qW5Z|ZQ{a-XeydZODs)%}qpxG+Vz)sS>S1Ppf|=46ArOOaP8 zS&8zFqa?7@kL|@lO0n*k=DQ#4?n7vsCoh9m<_Z~1L&AjeeCi&bv!!B zS&#U~8<0`Hiv(UyZovkpPA?vYdHteK=$Wu1NHbxdnErj2$PXOfOjpL7mNwhAR{o{1 zqbtsS_(HS}sP9ZcKaOnw6R))o;3vKQ2tSd*PeR!b$THo+tkW^YVi3gjI4-|HddGuc z(vW+7z35MA^x*C8^qz;~g^=NsNyIfmF};Mx6)~I>x)VA=M?|P!g=9+&f!S*P+ck4~ zg^W3BUC;Pmi&aq0+4*j7aJ z5J?G1&@P2@K~KIpP8N<<=ahEM1eycnS^3qd=HgolVOpHgf)gTqBe&G*zp!QBVPhXD zWqV|;G92!pYl7x-E|NKM0&IQS-`XDBfYyx9r(#^?qd#?9cSbnh0=J4D26GCLMaZDP z*aQr~E{qi#m=8OD9MM)(9G5iqs>m<3y`lXbt3;OZ3G21;dY)9T>i2pRS&!p%&@UH3 zjpz#75SHj^p1<5YvAAJw|5?Q1s}@vNq;yNw>$SP)T(4yFSTzIRcXpOu>UGV2xW}Z{ zJFiJjDizYyC`zeD7^14ggzN&bx=kkz%0zQe=olR4^L#qk)X#)vra*m-dzq$gaY!K%0DkDDK_6;R>ZNdja2*|uHw5tLIU#q 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%0DWj7>L-<)B4l0^bY+S5Ka@)Gvf~$Wkc^mbb<697E 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


_F_0Vut+V+Ej(WiyW(tn! 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
qvMuW3)cL^@R<>Tu<-PPyRJ@@vl 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 z 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 + + \ No newline at end of file diff --git a/starstore/js/app.js b/starstore/js/app.js new file mode 100644 index 00000000..a7f87095 --- /dev/null +++ b/starstore/js/app.js @@ -0,0 +1 @@ +angular.module("starstore",[]); \ No newline at end of file diff --git a/starstore/js/controllers.js b/starstore/js/controllers.js new file mode 100644 index 00000000..5a8d87f8 --- /dev/null +++ b/starstore/js/controllers.js @@ -0,0 +1,7 @@ +angular.module("starstore") + +.controller("HelloWorldCtrl",function($scope){ + $scope.message = "Hello"; +}) + +; \ No newline at end of file diff --git a/starstore/lib/angular.js b/starstore/lib/angular.js new file mode 100644 index 00000000..54f65588 --- /dev/null +++ b/starstore/lib/angular.js @@ -0,0 +1,31768 @@ +/** + * @license AngularJS v1.5.8 + * (c) 2010-2016 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window) {'use strict'; + +/** + * @description + * + * This object provides a utility for producing rich Error messages within + * Angular. It can be called as follows: + * + * var exampleMinErr = minErr('example'); + * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); + * + * The above creates an instance of minErr in the example namespace. The + * resulting error will have a namespaced error code of example.one. The + * resulting error will replace {0} with the value of foo, and {1} with the + * value of bar. The object is not restricted in the number of arguments it can + * take. + * + * If fewer arguments are specified than necessary for interpolation, the extra + * interpolation markers will be preserved in the final string. + * + * Since data will be parsed statically during a build step, some restrictions + * are applied with respect to how minErr instances are created and called. + * Instances should have names of the form namespaceMinErr for a minErr created + * using minErr('namespace') . Error codes, namespaces and template strings + * should all be static strings, not variables or general expressions. + * + * @param {string} module The namespace to use for the new minErr instance. + * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning + * error from returned function, for cases when a particular type of error is useful. + * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance + */ + +function minErr(module, ErrorConstructor) { + ErrorConstructor = ErrorConstructor || Error; + return function() { + var SKIP_INDEXES = 2; + + var templateArgs = arguments, + code = templateArgs[0], + message = '[' + (module ? module + ':' : '') + code + '] ', + template = templateArgs[1], + paramPrefix, i; + + message += template.replace(/\{\d+\}/g, function(match) { + var index = +match.slice(1, -1), + shiftedIndex = index + SKIP_INDEXES; + + if (shiftedIndex < templateArgs.length) { + return toDebugString(templateArgs[shiftedIndex]); + } + + return match; + }); + + message += '\nhttp://errors.angularjs.org/1.5.8/' + + (module ? module + '/' : '') + code; + + for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') { + message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' + + encodeURIComponent(toDebugString(templateArgs[i])); + } + + return new ErrorConstructor(message); + }; +} + +/* We need to tell jshint what variables are being exported */ +/* global angular: true, + msie: true, + jqLite: true, + jQuery: true, + slice: true, + splice: true, + push: true, + toString: true, + ngMinErr: true, + angularModule: true, + uid: true, + REGEX_STRING_REGEXP: true, + VALIDITY_STATE_PROPERTY: true, + + lowercase: true, + uppercase: true, + manualLowercase: true, + manualUppercase: true, + nodeName_: true, + isArrayLike: true, + forEach: true, + forEachSorted: true, + reverseParams: true, + nextUid: true, + setHashKey: true, + extend: true, + toInt: true, + inherit: true, + merge: true, + noop: true, + identity: true, + valueFn: true, + isUndefined: true, + isDefined: true, + isObject: true, + isBlankObject: true, + isString: true, + isNumber: true, + isDate: true, + isArray: true, + isFunction: true, + isRegExp: true, + isWindow: true, + isScope: true, + isFile: true, + isFormData: true, + isBlob: true, + isBoolean: true, + isPromiseLike: true, + trim: true, + escapeForRegexp: true, + isElement: true, + makeMap: true, + includes: true, + arrayRemove: true, + copy: true, + equals: true, + csp: true, + jq: true, + concat: true, + sliceArgs: true, + bind: true, + toJsonReplacer: true, + toJson: true, + fromJson: true, + convertTimezoneToLocal: true, + timezoneToOffset: true, + startingTag: true, + tryDecodeURIComponent: true, + parseKeyValue: true, + toKeyValue: true, + encodeUriSegment: true, + encodeUriQuery: true, + angularInit: true, + bootstrap: true, + getTestability: true, + snake_case: true, + bindJQuery: true, + assertArg: true, + assertArgFn: true, + assertNotHasOwnProperty: true, + getter: true, + getBlockNodes: true, + hasOwnProperty: true, + createMap: true, + + NODE_TYPE_ELEMENT: true, + NODE_TYPE_ATTRIBUTE: true, + NODE_TYPE_TEXT: true, + NODE_TYPE_COMMENT: true, + NODE_TYPE_DOCUMENT: true, + NODE_TYPE_DOCUMENT_FRAGMENT: true, +*/ + +//////////////////////////////////// + +/** + * @ngdoc module + * @name ng + * @module ng + * @installation + * @description + * + * # ng (core module) + * The ng module is loaded by default when an AngularJS application is started. The module itself + * contains the essential components for an AngularJS application to function. The table below + * lists a high level breakdown of each of the services/factories, filters, directives and testing + * components available within this core module. + * + *
+ */ + +var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/; + +// The name of a form control's ValidityState property. +// This is used so that it's possible for internal tests to create mock ValidityStates. +var VALIDITY_STATE_PROPERTY = 'validity'; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;}; +var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;}; + + +var manualLowercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) + : s; +}; +var manualUppercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) + : s; +}; + + +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods +// with correct but slower alternatives. See https://github.com/angular/angular.js/issues/11387 +if ('i' !== 'I'.toLowerCase()) { + lowercase = manualLowercase; + uppercase = manualUppercase; +} + + +var + msie, // holds major version number for IE, or NaN if UA is not IE. + jqLite, // delay binding since jQuery could be loaded after us. + jQuery, // delay binding + slice = [].slice, + splice = [].splice, + push = [].push, + toString = Object.prototype.toString, + getPrototypeOf = Object.getPrototypeOf, + ngMinErr = minErr('ng'), + + /** @name angular */ + angular = window.angular || (window.angular = {}), + angularModule, + uid = 0; + +/** + * documentMode is an IE-only property + * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx + */ +msie = window.document.documentMode; + + +/** + * @private + * @param {*} obj + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, + * String ...) + */ +function isArrayLike(obj) { + + // `null`, `undefined` and `window` are not array-like + if (obj == null || isWindow(obj)) return false; + + // arrays, strings and jQuery/jqLite objects are array like + // * jqLite is either the jQuery or jqLite constructor function + // * we have to check the existence of jqLite first as this method is called + // via the forEach method when constructing the jqLite object in the first place + if (isArray(obj) || isString(obj) || (jqLite && obj instanceof jqLite)) return true; + + // Support: iOS 8.2 (not reproducible in simulator) + // "length" in obj used to prevent JIT error (gh-11508) + var length = "length" in Object(obj) && obj.length; + + // NodeList objects (with `item` method) and + // other objects with suitable length characteristics are array-like + return isNumber(length) && + (length >= 0 && ((length - 1) in obj || obj instanceof Array) || typeof obj.item == 'function'); + +} + +/** + * @ngdoc function + * @name angular.forEach + * @module ng + * @kind function + * + * @description + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an + * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value` + * is the value of an object property or an array element, `key` is the object property key or + * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional. + * + * It is worth noting that `.forEach` does not iterate over inherited properties because it filters + * using the `hasOwnProperty` method. + * + * Unlike ES262's + * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18), + * providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just + * return the value provided. + * + ```js + var values = {name: 'misko', gender: 'male'}; + var log = []; + angular.forEach(values, function(value, key) { + this.push(key + ': ' + value); + }, log); + expect(log).toEqual(['name: misko', 'gender: male']); + ``` + * + * @param {Object|Array} obj Object to iterate over. + * @param {Function} iterator Iterator function. + * @param {Object=} context Object to become context (`this`) for the iterator function. + * @returns {Object|Array} Reference to `obj`. + */ + +function forEach(obj, iterator, context) { + var key, length; + if (obj) { + if (isFunction(obj)) { + for (key in obj) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (isArray(obj) || isArrayLike(obj)) { + var isPrimitive = typeof obj !== 'object'; + for (key = 0, length = obj.length; key < length; key++) { + if (isPrimitive || key in obj) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context, obj); + } else if (isBlankObject(obj)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in obj) { + iterator.call(context, obj[key], key, obj); + } + } else if (typeof obj.hasOwnProperty === 'function') { + // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key, obj); + } + } + } else { + // Slow path for objects which do not have a method `hasOwnProperty` + for (key in obj) { + if (hasOwnProperty.call(obj, key)) { + iterator.call(context, obj[key], key, obj); + } + } + } + } + return obj; +} + +function forEachSorted(obj, iterator, context) { + var keys = Object.keys(obj).sort(); + for (var i = 0; i < keys.length; i++) { + iterator.call(context, obj[keys[i]], keys[i]); + } + return keys; +} + + +/** + * when using forEach the params are value, key, but it is often useful to have key, value. + * @param {function(string, *)} iteratorFn + * @returns {function(*, string)} + */ +function reverseParams(iteratorFn) { + return function(value, key) {iteratorFn(key, value);}; +} + +/** + * A consistent way of creating unique IDs in angular. + * + * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before + * we hit number precision issues in JavaScript. + * + * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M + * + * @returns {number} an unique alpha-numeric string + */ +function nextUid() { + return ++uid; +} + + +/** + * Set or clear the hashkey for an object. + * @param obj object + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { + if (h) { + obj.$$hashKey = h; + } else { + delete obj.$$hashKey; + } +} + + +function baseExtend(dst, objs, deep) { + var h = dst.$$hashKey; + + for (var i = 0, ii = objs.length; i < ii; ++i) { + var obj = objs[i]; + if (!isObject(obj) && !isFunction(obj)) continue; + var keys = Object.keys(obj); + for (var j = 0, jj = keys.length; j < jj; j++) { + var key = keys[j]; + var src = obj[key]; + + if (deep && isObject(src)) { + if (isDate(src)) { + dst[key] = new Date(src.valueOf()); + } else if (isRegExp(src)) { + dst[key] = new RegExp(src); + } else if (src.nodeName) { + dst[key] = src.cloneNode(true); + } else if (isElement(src)) { + dst[key] = src.clone(); + } else { + if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {}; + baseExtend(dst[key], [src], true); + } + } else { + dst[key] = src; + } + } + } + + setHashKey(dst, h); + return dst; +} + +/** + * @ngdoc function + * @name angular.extend + * @module ng + * @kind function + * + * @description + * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s) + * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so + * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`. + * + * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use + * {@link angular.merge} for this. + * + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ +function extend(dst) { + return baseExtend(dst, slice.call(arguments, 1), false); +} + + +/** +* @ngdoc function +* @name angular.merge +* @module ng +* @kind function +* +* @description +* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s) +* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so +* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`. +* +* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source +* objects, performing a deep copy. +* +* @param {Object} dst Destination object. +* @param {...Object} src Source object(s). +* @returns {Object} Reference to `dst`. +*/ +function merge(dst) { + return baseExtend(dst, slice.call(arguments, 1), true); +} + + + +function toInt(str) { + return parseInt(str, 10); +} + + +function inherit(parent, extra) { + return extend(Object.create(parent), extra); +} + +/** + * @ngdoc function + * @name angular.noop + * @module ng + * @kind function + * + * @description + * A function that performs no operations. This function can be useful when writing code in the + * functional style. + ```js + function foo(callback) { + var result = calculateResult(); + (callback || angular.noop)(result); + } + ``` + */ +function noop() {} +noop.$inject = []; + + +/** + * @ngdoc function + * @name angular.identity + * @module ng + * @kind function + * + * @description + * A function that returns its first argument. This function is useful when writing code in the + * functional style. + * + ```js + function transformer(transformationFn, value) { + return (transformationFn || angular.identity)(value); + }; + + // E.g. + function getResult(fn, input) { + return (fn || angular.identity)(input); + }; + + getResult(function(n) { return n * 2; }, 21); // returns 42 + getResult(null, 21); // returns 21 + getResult(undefined, 21); // returns 21 + ``` + * + * @param {*} value to be returned. + * @returns {*} the value passed in. + */ +function identity($) {return $;} +identity.$inject = []; + + +function valueFn(value) {return function valueRef() {return value;};} + +function hasCustomToString(obj) { + return isFunction(obj.toString) && obj.toString !== toString; +} + + +/** + * @ngdoc function + * @name angular.isUndefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is undefined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is undefined. + */ +function isUndefined(value) {return typeof value === 'undefined';} + + +/** + * @ngdoc function + * @name angular.isDefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is defined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is defined. + */ +function isDefined(value) {return typeof value !== 'undefined';} + + +/** + * @ngdoc function + * @name angular.isObject + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not + * considered to be objects. Note that JavaScript arrays are objects. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Object` but not `null`. + */ +function isObject(value) { + // http://jsperf.com/isobject4 + return value !== null && typeof value === 'object'; +} + + +/** + * Determine if a value is an object with a null prototype + * + * @returns {boolean} True if `value` is an `Object` with a null prototype + */ +function isBlankObject(value) { + return value !== null && typeof value === 'object' && !getPrototypeOf(value); +} + + +/** + * @ngdoc function + * @name angular.isString + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `String`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `String`. + */ +function isString(value) {return typeof value === 'string';} + + +/** + * @ngdoc function + * @name angular.isNumber + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Number`. + * + * This includes the "special" numbers `NaN`, `+Infinity` and `-Infinity`. + * + * If you wish to exclude these then you can use the native + * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite) + * method. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Number`. + */ +function isNumber(value) {return typeof value === 'number';} + + +/** + * @ngdoc function + * @name angular.isDate + * @module ng + * @kind function + * + * @description + * Determines if a value is a date. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Date`. + */ +function isDate(value) { + return toString.call(value) === '[object Date]'; +} + + +/** + * @ngdoc function + * @name angular.isArray + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Array`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Array`. + */ +var isArray = Array.isArray; + +/** + * @ngdoc function + * @name angular.isFunction + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Function`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Function`. + */ +function isFunction(value) {return typeof value === 'function';} + + +/** + * Determines if a value is a regular expression object. + * + * @private + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `RegExp`. + */ +function isRegExp(value) { + return toString.call(value) === '[object RegExp]'; +} + + +/** + * Checks if `obj` is a window object. + * + * @private + * @param {*} obj Object to check + * @returns {boolean} True if `obj` is a window obj. + */ +function isWindow(obj) { + return obj && obj.window === obj; +} + + +function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; +} + + +function isFile(obj) { + return toString.call(obj) === '[object File]'; +} + + +function isFormData(obj) { + return toString.call(obj) === '[object FormData]'; +} + + +function isBlob(obj) { + return toString.call(obj) === '[object Blob]'; +} + + +function isBoolean(value) { + return typeof value === 'boolean'; +} + + +function isPromiseLike(obj) { + return obj && isFunction(obj.then); +} + + +var TYPED_ARRAY_REGEXP = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/; +function isTypedArray(value) { + return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value)); +} + +function isArrayBuffer(obj) { + return toString.call(obj) === '[object ArrayBuffer]'; +} + + +var trim = function(value) { + return isString(value) ? value.trim() : value; +}; + +// Copied from: +// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021 +// Prereq: s is a string. +var escapeForRegexp = function(s) { + return s.replace(/([-()\[\]{}+?*.$\^|,:#= 0) { + array.splice(index, 1); + } + return index; +} + +/** + * @ngdoc function + * @name angular.copy + * @module ng + * @kind function + * + * @description + * Creates a deep copy of `source`, which should be an object or an array. + * + * * If no destination is supplied, a copy of the object or array is created. + * * If a destination is provided, all of its elements (for arrays) or properties (for objects) + * are deleted and then all elements/properties from the source are copied to it. + * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. + * * If `source` is identical to `destination` an exception will be thrown. + * + *
+ *
+ * Only enumerable properties are taken into account. Non-enumerable properties (both on `source` + * and on `destination`) will be ignored. + *
+ * + * @param {*} source The source that will be used to make a copy. + * Can be any type, including primitives, `null`, and `undefined`. + * @param {(Object|Array)=} destination Destination into which the source is copied. If + * provided, must be of the same type as `source`. + * @returns {*} The copy or updated `destination`, if `destination` was specified. + * + * @example + + +
+
+
+
+ Gender: +
+ + +
+
form = {{user | json}}
+
master = {{master | json}}
+
+
+ + // Module: copyExample + angular. + module('copyExample', []). + controller('ExampleController', ['$scope', function($scope) { + $scope.master = {}; + + $scope.reset = function() { + // Example with 1 argument + $scope.user = angular.copy($scope.master); + }; + + $scope.update = function(user) { + // Example with 2 arguments + angular.copy(user, $scope.master); + }; + + $scope.reset(); + }]); + +
+ */ +function copy(source, destination) { + var stackSource = []; + var stackDest = []; + + if (destination) { + if (isTypedArray(destination) || isArrayBuffer(destination)) { + throw ngMinErr('cpta', "Can't copy! TypedArray destination cannot be mutated."); + } + if (source === destination) { + throw ngMinErr('cpi', "Can't copy! Source and destination are identical."); + } + + // Empty the destination object + if (isArray(destination)) { + destination.length = 0; + } else { + forEach(destination, function(value, key) { + if (key !== '$$hashKey') { + delete destination[key]; + } + }); + } + + stackSource.push(source); + stackDest.push(destination); + return copyRecurse(source, destination); + } + + return copyElement(source); + + function copyRecurse(source, destination) { + var h = destination.$$hashKey; + var key; + if (isArray(source)) { + for (var i = 0, ii = source.length; i < ii; i++) { + destination.push(copyElement(source[i])); + } + } else if (isBlankObject(source)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in source) { + destination[key] = copyElement(source[key]); + } + } else if (source && typeof source.hasOwnProperty === 'function') { + // Slow path, which must rely on hasOwnProperty + for (key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = copyElement(source[key]); + } + } + } else { + // Slowest path --- hasOwnProperty can't be called as a method + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = copyElement(source[key]); + } + } + } + setHashKey(destination, h); + return destination; + } + + function copyElement(source) { + // Simple values + if (!isObject(source)) { + return source; + } + + // Already copied values + var index = stackSource.indexOf(source); + if (index !== -1) { + return stackDest[index]; + } + + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + "Can't copy! Making copies of Window or Scope instances is not supported."); + } + + var needsRecurse = false; + var destination = copyType(source); + + if (destination === undefined) { + destination = isArray(source) ? [] : Object.create(getPrototypeOf(source)); + needsRecurse = true; + } + + stackSource.push(source); + stackDest.push(destination); + + return needsRecurse + ? copyRecurse(source, destination) + : destination; + } + + function copyType(source) { + switch (toString.call(source)) { + case '[object Int8Array]': + case '[object Int16Array]': + case '[object Int32Array]': + case '[object Float32Array]': + case '[object Float64Array]': + case '[object Uint8Array]': + case '[object Uint8ClampedArray]': + case '[object Uint16Array]': + case '[object Uint32Array]': + return new source.constructor(copyElement(source.buffer), source.byteOffset, source.length); + + case '[object ArrayBuffer]': + //Support: IE10 + if (!source.slice) { + var copied = new ArrayBuffer(source.byteLength); + new Uint8Array(copied).set(new Uint8Array(source)); + return copied; + } + return source.slice(0); + + case '[object Boolean]': + case '[object Number]': + case '[object String]': + case '[object Date]': + return new source.constructor(source.valueOf()); + + case '[object RegExp]': + var re = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); + re.lastIndex = source.lastIndex; + return re; + + case '[object Blob]': + return new source.constructor([source], {type: source.type}); + } + + if (isFunction(source.cloneNode)) { + return source.cloneNode(true); + } + } +} + + +/** + * @ngdoc function + * @name angular.equals + * @module ng + * @kind function + * + * @description + * Determines if two objects or two values are equivalent. Supports value types, regular + * expressions, arrays and objects. + * + * Two objects or values are considered equivalent if at least one of the following is true: + * + * * Both objects or values pass `===` comparison. + * * Both objects or values are of the same type and all of their properties are equal by + * comparing them with `angular.equals`. + * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) + * * Both values represent the same regular expression (In JavaScript, + * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual + * representation matches). + * + * During a property comparison, properties of `function` type and properties with names + * that begin with `$` are ignored. + * + * Scope and DOMWindow objects are being compared only by identify (`===`). + * + * @param {*} o1 Object or value to compare. + * @param {*} o2 Object or value to compare. + * @returns {boolean} True if arguments are equal. + * + * @example + + +
+
+

User 1

+ Name: + Age: + +

User 2

+ Name: + Age: + +
+
+ +
+ User 1:
{{user1 | json}}
+ User 2:
{{user2 | json}}
+ Equal:
{{result}}
+
+
+
+ + angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) { + $scope.user1 = {}; + $scope.user2 = {}; + $scope.result; + $scope.compare = function() { + $scope.result = angular.equals($scope.user1, $scope.user2); + }; + }]); + +
+ */ +function equals(o1, o2) { + if (o1 === o2) return true; + if (o1 === null || o2 === null) return false; + if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN + var t1 = typeof o1, t2 = typeof o2, length, key, keySet; + if (t1 == t2 && t1 == 'object') { + if (isArray(o1)) { + if (!isArray(o2)) return false; + if ((length = o1.length) == o2.length) { + for (key = 0; key < length; key++) { + if (!equals(o1[key], o2[key])) return false; + } + return true; + } + } else if (isDate(o1)) { + if (!isDate(o2)) return false; + return equals(o1.getTime(), o2.getTime()); + } else if (isRegExp(o1)) { + if (!isRegExp(o2)) return false; + return o1.toString() == o2.toString(); + } else { + if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || + isArray(o2) || isDate(o2) || isRegExp(o2)) return false; + keySet = createMap(); + for (key in o1) { + if (key.charAt(0) === '$' || isFunction(o1[key])) continue; + if (!equals(o1[key], o2[key])) return false; + keySet[key] = true; + } + for (key in o2) { + if (!(key in keySet) && + key.charAt(0) !== '$' && + isDefined(o2[key]) && + !isFunction(o2[key])) return false; + } + return true; + } + } + return false; +} + +var csp = function() { + if (!isDefined(csp.rules)) { + + + var ngCspElement = (window.document.querySelector('[ng-csp]') || + window.document.querySelector('[data-ng-csp]')); + + if (ngCspElement) { + var ngCspAttribute = ngCspElement.getAttribute('ng-csp') || + ngCspElement.getAttribute('data-ng-csp'); + csp.rules = { + noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1), + noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1) + }; + } else { + csp.rules = { + noUnsafeEval: noUnsafeEval(), + noInlineStyle: false + }; + } + } + + return csp.rules; + + function noUnsafeEval() { + try { + /* jshint -W031, -W054 */ + new Function(''); + /* jshint +W031, +W054 */ + return false; + } catch (e) { + return true; + } + } +}; + +/** + * @ngdoc directive + * @module ng + * @name ngJq + * + * @element ANY + * @param {string=} ngJq the name of the library available under `window` + * to be used for angular.element + * @description + * Use this directive to force the angular.element library. This should be + * used to force either jqLite by leaving ng-jq blank or setting the name of + * the jquery variable under window (eg. jQuery). + * + * Since angular looks for this directive when it is loaded (doesn't wait for the + * DOMContentLoaded event), it must be placed on an element that comes before the script + * which loads angular. Also, only the first instance of `ng-jq` will be used and all + * others ignored. + * + * @example + * This example shows how to force jqLite using the `ngJq` directive to the `html` tag. + ```html + + + ... + ... + + ``` + * @example + * This example shows how to use a jQuery based library of a different name. + * The library name must be available at the top most 'window'. + ```html + + + ... + ... + + ``` + */ +var jq = function() { + if (isDefined(jq.name_)) return jq.name_; + var el; + var i, ii = ngAttrPrefixes.length, prefix, name; + for (i = 0; i < ii; ++i) { + prefix = ngAttrPrefixes[i]; + if (el = window.document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { + name = el.getAttribute(prefix + 'jq'); + break; + } + } + + return (jq.name_ = name); +}; + +function concat(array1, array2, index) { + return array1.concat(slice.call(array2, index)); +} + +function sliceArgs(args, startIndex) { + return slice.call(args, startIndex || 0); +} + + +/* jshint -W101 */ +/** + * @ngdoc function + * @name angular.bind + * @module ng + * @kind function + * + * @description + * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for + * `fn`). You can supply optional `args` that are prebound to the function. This feature is also + * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as + * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). + * + * @param {Object} self Context which `fn` should be evaluated in. + * @param {function()} fn Function to be bound. + * @param {...*} args Optional arguments to be prebound to the `fn` function call. + * @returns {function()} Function that wraps the `fn` with all the specified bindings. + */ +/* jshint +W101 */ +function bind(self, fn) { + var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; + if (isFunction(fn) && !(fn instanceof RegExp)) { + return curryArgs.length + ? function() { + return arguments.length + ? fn.apply(self, concat(curryArgs, arguments, 0)) + : fn.apply(self, curryArgs); + } + : function() { + return arguments.length + ? fn.apply(self, arguments) + : fn.call(self); + }; + } else { + // In IE, native methods are not functions so they cannot be bound (note: they don't need to be). + return fn; + } +} + + +function toJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && window.document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +} + + +/** + * @ngdoc function + * @name angular.toJson + * @module ng + * @kind function + * + * @description + * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be + * stripped since angular uses this notation internally. + * + * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. + * If set to an integer, the JSON output will contain that many spaces per indentation. + * @returns {string|undefined} JSON-ified string representing `obj`. + * @knownIssue + * + * The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date` + * object with an invalid date value. The only reliable way to prevent this is to monkeypatch the + * `Date.prototype.toJSON` method as follows: + * + * ``` + * var _DatetoJSON = Date.prototype.toJSON; + * Date.prototype.toJSON = function() { + * try { + * return _DatetoJSON.call(this); + * } catch(e) { + * if (e instanceof RangeError) { + * return null; + * } + * throw e; + * } + * }; + * ``` + * + * See https://github.com/angular/angular.js/pull/14221 for more information. + */ +function toJson(obj, pretty) { + if (isUndefined(obj)) return undefined; + if (!isNumber(pretty)) { + pretty = pretty ? 2 : null; + } + return JSON.stringify(obj, toJsonReplacer, pretty); +} + + +/** + * @ngdoc function + * @name angular.fromJson + * @module ng + * @kind function + * + * @description + * Deserializes a JSON string. + * + * @param {string} json JSON string to deserialize. + * @returns {Object|Array|string|number} Deserialized JSON string. + */ +function fromJson(json) { + return isString(json) + ? JSON.parse(json) + : json; +} + + +var ALL_COLONS = /:/g; +function timezoneToOffset(timezone, fallback) { + // IE/Edge do not "understand" colon (`:`) in timezone + timezone = timezone.replace(ALL_COLONS, ''); + var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; + return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; +} + + +function addDateMinutes(date, minutes) { + date = new Date(date.getTime()); + date.setMinutes(date.getMinutes() + minutes); + return date; +} + + +function convertTimezoneToLocal(date, timezone, reverse) { + reverse = reverse ? -1 : 1; + var dateTimezoneOffset = date.getTimezoneOffset(); + var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); + return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset)); +} + + +/** + * @returns {string} Returns the string representation of the element. + */ +function startingTag(element) { + element = jqLite(element).clone(); + try { + // turns out IE does not let you set .html() on elements which + // are not allowed to have children. So we just ignore it. + element.empty(); + } catch (e) {} + var elemHtml = jqLite('
').append(element).html(); + try { + return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : + elemHtml. + match(/^(<[^>]+>)/)[1]. + replace(/^<([\w\-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);}); + } catch (e) { + return lowercase(elemHtml); + } + +} + + +///////////////////////////////////////////////// + +/** + * Tries to decode the URI component without throwing an exception. + * + * @private + * @param str value potential URI component to check. + * @returns {boolean} True if `value` can be decoded + * with the decodeURIComponent function. + */ +function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch (e) { + // Ignore any invalid uri component. + } +} + + +/** + * Parses an escaped url query string into key-value pairs. + * @returns {Object.} + */ +function parseKeyValue(/**string*/keyValue) { + var obj = {}; + forEach((keyValue || "").split('&'), function(keyValue) { + var splitPoint, key, val; + if (keyValue) { + key = keyValue = keyValue.replace(/\+/g,'%20'); + splitPoint = keyValue.indexOf('='); + if (splitPoint !== -1) { + key = keyValue.substring(0, splitPoint); + val = keyValue.substring(splitPoint + 1); + } + key = tryDecodeURIComponent(key); + if (isDefined(key)) { + val = isDefined(val) ? tryDecodeURIComponent(val) : true; + if (!hasOwnProperty.call(obj, key)) { + obj[key] = val; + } else if (isArray(obj[key])) { + obj[key].push(val); + } else { + obj[key] = [obj[key],val]; + } + } + } + }); + return obj; +} + +function toKeyValue(obj) { + var parts = []; + forEach(obj, function(value, key) { + if (isArray(value)) { + forEach(value, function(arrayValue) { + parts.push(encodeUriQuery(key, true) + + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); + }); + } else { + parts.push(encodeUriQuery(key, true) + + (value === true ? '' : '=' + encodeUriQuery(value, true))); + } + }); + return parts.length ? parts.join('&') : ''; +} + + +/** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); +} + + +/** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%3B/gi, ';'). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + +var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; + +function getNgAttribute(element, ngAttr) { + var attr, i, ii = ngAttrPrefixes.length; + for (i = 0; i < ii; ++i) { + attr = ngAttrPrefixes[i] + ngAttr; + if (isString(attr = element.getAttribute(attr))) { + return attr; + } + } + return null; +} + +/** + * @ngdoc directive + * @name ngApp + * @module ng + * + * @element ANY + * @param {angular.Module} ngApp an optional application + * {@link angular.module module} name to load. + * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be + * created in "strict-di" mode. This means that the application will fail to invoke functions which + * do not use explicit function annotation (and are thus unsuitable for minification), as described + * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in + * tracking down the root of these bugs. + * + * @description + * + * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive + * designates the **root element** of the application and is typically placed near the root element + * of the page - e.g. on the `` or `` tags. + * + * There are a few things to keep in mind when using `ngApp`: + * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` + * found in the document will be used to define the root element to auto-bootstrap as an + * application. To run multiple applications in an HTML document you must manually bootstrap them using + * {@link angular.bootstrap} instead. + * - AngularJS applications cannot be nested within each other. + * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`. + * This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and + * {@link ngRoute.ngView `ngView`}. + * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, + * causing animations to stop working and making the injector inaccessible from outside the app. + * + * You can specify an **AngularJS module** to be used as the root module for the application. This + * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It + * should contain the application code needed or have dependencies on other modules that will + * contain the code. See {@link angular.module} for more information. + * + * In the example below if the `ngApp` directive were not placed on the `html` element then the + * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` + * would not be resolved to `3`. + * + * `ngApp` is the easiest, and most common way to bootstrap an application. + * + + +
+ I can add: {{a}} + {{b}} = {{ a+b }} +
+
+ + angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }); + +
+ * + * Using `ngStrictDi`, you would see something like this: + * + + +
+
+ I can add: {{a}} + {{b}} = {{ a+b }} + +

This renders because the controller does not fail to + instantiate, by using explicit annotation style (see + script.js for details) +

+
+ +
+ Name:
+ Hello, {{name}}! + +

This renders because the controller does not fail to + instantiate, by using explicit annotation style + (see script.js for details) +

+
+ +
+ I can add: {{a}} + {{b}} = {{ a+b }} + +

The controller could not be instantiated, due to relying + on automatic function annotations (which are disabled in + strict mode). As such, the content of this section is not + interpolated, and there should be an error in your web console. +

+
+
+
+ + angular.module('ngAppStrictDemo', []) + // BadController will fail to instantiate, due to relying on automatic function annotation, + // rather than an explicit annotation + .controller('BadController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }) + // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, + // due to using explicit annotations using the array style and $inject property, respectively. + .controller('GoodController1', ['$scope', function($scope) { + $scope.a = 1; + $scope.b = 2; + }]) + .controller('GoodController2', GoodController2); + function GoodController2($scope) { + $scope.name = "World"; + } + GoodController2.$inject = ['$scope']; + + + div[ng-controller] { + margin-bottom: 1em; + -webkit-border-radius: 4px; + border-radius: 4px; + border: 1px solid; + padding: .5em; + } + div[ng-controller^=Good] { + border-color: #d6e9c6; + background-color: #dff0d8; + color: #3c763d; + } + div[ng-controller^=Bad] { + border-color: #ebccd1; + background-color: #f2dede; + color: #a94442; + margin-bottom: 0; + } + +
+ */ +function angularInit(element, bootstrap) { + var appElement, + module, + config = {}; + + // The element `element` has priority over any other element. + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + + if (!appElement && element.hasAttribute && element.hasAttribute(name)) { + appElement = element; + module = element.getAttribute(name); + } + }); + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + var candidate; + + if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { + appElement = candidate; + module = candidate.getAttribute(name); + } + }); + if (appElement) { + config.strictDi = getNgAttribute(appElement, "strict-di") !== null; + bootstrap(appElement, module ? [module] : [], config); + } +} + +/** + * @ngdoc function + * @name angular.bootstrap + * @module ng + * @description + * Use this function to manually start up angular application. + * + * For more information, see the {@link guide/bootstrap Bootstrap guide}. + * + * Angular will detect if it has been loaded into the browser more than once and only allow the + * first loaded script to be bootstrapped and will report a warning to the browser console for + * each of the subsequent scripts. This prevents strange results in applications, where otherwise + * multiple instances of Angular try to work on the DOM. + * + *
+ * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually. + * They must use {@link ng.directive:ngApp ngApp}. + *
+ * + *
+ * **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion}, + * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}. + * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, + * causing animations to stop working and making the injector inaccessible from outside the app. + *
+ * + * ```html + * + * + * + *
+ * {{greeting}} + *
+ * + * + * + * + * + * ``` + * + * @param {DOMElement} element DOM element which is the root of angular application. + * @param {Array=} modules an array of modules to load into the application. + * Each item in the array should be the name of a predefined module or a (DI annotated) + * function that will be invoked by the injector as a `config` block. + * See: {@link angular.module modules} + * @param {Object=} config an object for defining configuration options for the application. The + * following keys are supported: + * + * * `strictDi` - disable automatic function annotation for the application. This is meant to + * assist in finding bugs which break minified code. Defaults to `false`. + * + * @returns {auto.$injector} Returns the newly created injector for this app. + */ +function bootstrap(element, modules, config) { + if (!isObject(config)) config = {}; + var defaultConfig = { + strictDi: false + }; + config = extend(defaultConfig, config); + var doBootstrap = function() { + element = jqLite(element); + + if (element.injector()) { + var tag = (element[0] === window.document) ? 'document' : startingTag(element); + // Encode angle brackets to prevent input from being sanitized to empty string #8683. + throw ngMinErr( + 'btstrpd', + "App already bootstrapped with this element '{0}'", + tag.replace(//,'>')); + } + + modules = modules || []; + modules.unshift(['$provide', function($provide) { + $provide.value('$rootElement', element); + }]); + + if (config.debugInfoEnabled) { + // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. + modules.push(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(true); + }]); + } + + modules.unshift('ng'); + var injector = createInjector(modules, config.strictDi); + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', + function bootstrapApply(scope, element, compile, injector) { + scope.$apply(function() { + element.data('$injector', injector); + compile(element)(scope); + }); + }] + ); + return injector; + }; + + var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; + + if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { + config.debugInfoEnabled = true; + window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); + } + + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { + return doBootstrap(); + } + + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); + angular.resumeBootstrap = function(extraModules) { + forEach(extraModules, function(module) { + modules.push(module); + }); + return doBootstrap(); + }; + + if (isFunction(angular.resumeDeferredBootstrap)) { + angular.resumeDeferredBootstrap(); + } +} + +/** + * @ngdoc function + * @name angular.reloadWithDebugInfo + * @module ng + * @description + * Use this function to reload the current application with debug information turned on. + * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. + * + * See {@link ng.$compileProvider#debugInfoEnabled} for more. + */ +function reloadWithDebugInfo() { + window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; + window.location.reload(); +} + +/** + * @name angular.getTestability + * @module ng + * @description + * Get the testability service for the instance of Angular on the given + * element. + * @param {DOMElement} element DOM element which is the root of angular application. + */ +function getTestability(rootElement) { + var injector = angular.element(rootElement).injector(); + if (!injector) { + throw ngMinErr('test', + 'no injector found for element argument to getTestability'); + } + return injector.get('$$testability'); +} + +var SNAKE_CASE_REGEXP = /[A-Z]/g; +function snake_case(name, separator) { + separator = separator || '_'; + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); +} + +var bindJQueryFired = false; +function bindJQuery() { + var originalCleanData; + + if (bindJQueryFired) { + return; + } + + // bind to jQuery if present; + var jqName = jq(); + jQuery = isUndefined(jqName) ? window.jQuery : // use jQuery (if present) + !jqName ? undefined : // use jqLite + window[jqName]; // use jQuery specified by `ngJq` + + // Use jQuery if it exists with proper functionality, otherwise default to us. + // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. + // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older + // versions. It will not work for sure with jQuery <1.7, though. + if (jQuery && jQuery.fn.on) { + jqLite = jQuery; + extend(jQuery.fn, { + scope: JQLitePrototype.scope, + isolateScope: JQLitePrototype.isolateScope, + controller: JQLitePrototype.controller, + injector: JQLitePrototype.injector, + inheritedData: JQLitePrototype.inheritedData + }); + + // All nodes removed from the DOM via various jQuery APIs like .remove() + // are passed through jQuery.cleanData. Monkey-patch this method to fire + // the $destroy event on all removed nodes. + originalCleanData = jQuery.cleanData; + jQuery.cleanData = function(elems) { + var events; + for (var i = 0, elem; (elem = elems[i]) != null; i++) { + events = jQuery._data(elem, "events"); + if (events && events.$destroy) { + jQuery(elem).triggerHandler('$destroy'); + } + } + originalCleanData(elems); + }; + } else { + jqLite = JQLite; + } + + angular.element = jqLite; + + // Prevent double-proxying. + bindJQueryFired = true; +} + +/** + * throw error if the argument is falsy. + */ +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function assertArgFn(arg, name, acceptArrayAnnotation) { + if (acceptArrayAnnotation && isArray(arg)) { + arg = arg[arg.length - 1]; + } + + assertArg(isFunction(arg), name, 'not a function, got ' + + (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); + return arg; +} + +/** + * throw error if the name given is hasOwnProperty + * @param {String} name the name to test + * @param {String} context the context in which the name is used, such as module or directive + */ +function assertNotHasOwnProperty(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); + } +} + +/** + * Return the value accessible from the object by path. Any undefined traversals are ignored + * @param {Object} obj starting object + * @param {String} path path to traverse + * @param {boolean} [bindFnToScope=true] + * @returns {Object} value as accessible by path + */ +//TODO(misko): this function needs to be removed +function getter(obj, path, bindFnToScope) { + if (!path) return obj; + var keys = path.split('.'); + var key; + var lastInstance = obj; + var len = keys.length; + + for (var i = 0; i < len; i++) { + key = keys[i]; + if (obj) { + obj = (lastInstance = obj)[key]; + } + } + if (!bindFnToScope && isFunction(obj)) { + return bind(lastInstance, obj); + } + return obj; +} + +/** + * Return the DOM siblings between the first and last node in the given array. + * @param {Array} array like object + * @returns {Array} the inputted object or a jqLite collection containing the nodes + */ +function getBlockNodes(nodes) { + // TODO(perf): update `nodes` instead of creating a new object? + var node = nodes[0]; + var endNode = nodes[nodes.length - 1]; + var blockNodes; + + for (var i = 1; node !== endNode && (node = node.nextSibling); i++) { + if (blockNodes || nodes[i] !== node) { + if (!blockNodes) { + blockNodes = jqLite(slice.call(nodes, 0, i)); + } + blockNodes.push(node); + } + } + + return blockNodes || nodes; +} + + +/** + * Creates a new object without a prototype. This object is useful for lookup without having to + * guard against prototypically inherited properties via hasOwnProperty. + * + * Related micro-benchmarks: + * - http://jsperf.com/object-create2 + * - http://jsperf.com/proto-map-lookup/2 + * - http://jsperf.com/for-in-vs-object-keys2 + * + * @returns {Object} + */ +function createMap() { + return Object.create(null); +} + +var NODE_TYPE_ELEMENT = 1; +var NODE_TYPE_ATTRIBUTE = 2; +var NODE_TYPE_TEXT = 3; +var NODE_TYPE_COMMENT = 8; +var NODE_TYPE_DOCUMENT = 9; +var NODE_TYPE_DOCUMENT_FRAGMENT = 11; + +/** + * @ngdoc type + * @name angular.Module + * @module ng + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + var $injectorMinErr = minErr('$injector'); + var ngMinErr = minErr('ng'); + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + var angular = ensure(window, 'angular', Object); + + // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap + angular.$$minErr = angular.$$minErr || minErr; + + return ensure(angular, 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @module ng + * @description + * + * The `angular.module` is a global place for creating, registering and retrieving Angular + * modules. + * All modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * Passing one argument retrieves an existing {@link angular.Module}, + * whereas passing more than one argument creates a new {@link angular.Module} + * + * + * # Module + * + * A module is a collection of services, directives, controllers, filters, and configuration information. + * `angular.module` is used to configure the {@link auto.$injector $injector}. + * + * ```js + * // Create a new module + * var myModule = angular.module('myModule', []); + * + * // register a new service + * myModule.value('appName', 'MyCoolApp'); + * + * // configure existing services inside initialization blocks. + * myModule.config(['$locationProvider', function($locationProvider) { + * // Configure existing providers + * $locationProvider.hashPrefix('!'); + * }]); + * ``` + * + * Then you can create an injector and load your modules like this: + * + * ```js + * var injector = angular.injector(['ng', 'myModule']) + * ``` + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {!Array.=} requires If specified then new module is being created. If + * unspecified then the module is being retrieved for further configuration. + * @param {Function=} configFn Optional configuration function for the module. Same as + * {@link angular.Module#config Module#config()}. + * @returns {angular.Module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + var assertNotHasOwnProperty = function(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); + } + }; + + assertNotHasOwnProperty(name, 'module'); + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + + "the module name or forgot to load it. If registering a module ensure that you " + + "specify the dependencies as the second argument.", name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var configBlocks = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke', 'push', configBlocks); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _configBlocks: configBlocks, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @module ng + * + * @description + * Holds the list of modules which the injector will load before the current module is + * loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @module ng + * + * @description + * Name of the module. + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @module ng + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the + * service. + * @description + * See {@link auto.$provide#provider $provide.provider()}. + */ + provider: invokeLaterAndSetModuleName('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @module ng + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link auto.$provide#factory $provide.factory()}. + */ + factory: invokeLaterAndSetModuleName('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @module ng + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link auto.$provide#service $provide.service()}. + */ + service: invokeLaterAndSetModuleName('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @module ng + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link auto.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @module ng + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constants are fixed, they get applied before other provide methods. + * See {@link auto.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#decorator + * @module ng + * @param {string} name The name of the service to decorate. + * @param {Function} decorFn This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. + * @description + * See {@link auto.$provide#decorator $provide.decorator()}. + */ + decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @module ng + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an + * animation. + * @description + * + * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. + * + * + * Defines an animation hook that can be later used with + * {@link $animate $animate} service and directives that use this service. + * + * ```js + * module.animation('.animation-name', function($inject1, $inject2) { + * return { + * eventName : function(element, done) { + * //code to run the animation + * //once complete, then run done() + * return function cancellationFunction(element) { + * //code to cancel the animation + * } + * } + * } + * }) + * ``` + * + * See {@link ng.$animateProvider#register $animateProvider.register()} and + * {@link ngAnimate ngAnimate module} for more information. + */ + animation: invokeLaterAndSetModuleName('$animateProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @module ng + * @param {string} name Filter name - this must be a valid angular expression identifier + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ */ + filter: invokeLaterAndSetModuleName('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @module ng + * @param {string|Object} name Controller name, or an object map of controllers where the + * keys are the names and the values are the constructors. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @module ng + * @param {string|Object} name Directive name, or an object map of directives where the + * keys are the names and the values are the factories. + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#component + * @module ng + * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp) + * @param {Object} options Component definition object (a simplified + * {@link ng.$compile#directive-definition-object directive definition object}) + * + * @description + * See {@link ng.$compileProvider#component $compileProvider.component()}. + */ + component: invokeLaterAndSetModuleName('$compileProvider', 'component'), + + /** + * @ngdoc method + * @name angular.Module#config + * @module ng + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + * For more about how to configure services, see + * {@link providers#provider-recipe Provider Recipe}. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @module ng + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod, queue) { + if (!queue) queue = invokeQueue; + return function() { + queue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + }; + } + + /** + * @param {string} provider + * @param {string} method + * @returns {angular.Module} + */ + function invokeLaterAndSetModuleName(provider, method) { + return function(recipeName, factoryFunction) { + if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; + invokeQueue.push([provider, method, arguments]); + return moduleInstance; + }; + } + }); + }; + }); + +} + +/* global shallowCopy: true */ + +/** + * Creates a shallow copy of an object, an array or a primitive. + * + * Assumes that there are no proto properties for objects. + */ +function shallowCopy(src, dst) { + if (isArray(src)) { + dst = dst || []; + + for (var i = 0, ii = src.length; i < ii; i++) { + dst[i] = src[i]; + } + } else if (isObject(src)) { + dst = dst || {}; + + for (var key in src) { + if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { + dst[key] = src[key]; + } + } + } + + return dst || src; +} + +/* global toDebugString: true */ + +function serializeObject(obj) { + var seen = []; + + return JSON.stringify(obj, function(key, val) { + val = toJsonReplacer(key, val); + if (isObject(val)) { + + if (seen.indexOf(val) >= 0) return '...'; + + seen.push(val); + } + return val; + }); +} + +function toDebugString(obj) { + if (typeof obj === 'function') { + return obj.toString().replace(/ \{[\s\S]*$/, ''); + } else if (isUndefined(obj)) { + return 'undefined'; + } else if (typeof obj !== 'string') { + return serializeObject(obj); + } + return obj; +} + +/* global angularModule: true, + version: true, + + $CompileProvider, + + htmlAnchorDirective, + inputDirective, + inputDirective, + formDirective, + scriptDirective, + selectDirective, + styleDirective, + optionDirective, + ngBindDirective, + ngBindHtmlDirective, + ngBindTemplateDirective, + ngClassDirective, + ngClassEvenDirective, + ngClassOddDirective, + ngCloakDirective, + ngControllerDirective, + ngFormDirective, + ngHideDirective, + ngIfDirective, + ngIncludeDirective, + ngIncludeFillContentDirective, + ngInitDirective, + ngNonBindableDirective, + ngPluralizeDirective, + ngRepeatDirective, + ngShowDirective, + ngStyleDirective, + ngSwitchDirective, + ngSwitchWhenDirective, + ngSwitchDefaultDirective, + ngOptionsDirective, + ngTranscludeDirective, + ngModelDirective, + ngListDirective, + ngChangeDirective, + patternDirective, + patternDirective, + requiredDirective, + requiredDirective, + minlengthDirective, + minlengthDirective, + maxlengthDirective, + maxlengthDirective, + ngValueDirective, + ngModelOptionsDirective, + ngAttributeAliasDirectives, + ngEventDirectives, + + $AnchorScrollProvider, + $AnimateProvider, + $CoreAnimateCssProvider, + $$CoreAnimateJsProvider, + $$CoreAnimateQueueProvider, + $$AnimateRunnerFactoryProvider, + $$AnimateAsyncRunFactoryProvider, + $BrowserProvider, + $CacheFactoryProvider, + $ControllerProvider, + $DateProvider, + $DocumentProvider, + $ExceptionHandlerProvider, + $FilterProvider, + $$ForceReflowProvider, + $InterpolateProvider, + $IntervalProvider, + $$HashMapProvider, + $HttpProvider, + $HttpParamSerializerProvider, + $HttpParamSerializerJQLikeProvider, + $HttpBackendProvider, + $xhrFactoryProvider, + $jsonpCallbacksProvider, + $LocationProvider, + $LogProvider, + $ParseProvider, + $RootScopeProvider, + $QProvider, + $$QProvider, + $$SanitizeUriProvider, + $SceProvider, + $SceDelegateProvider, + $SnifferProvider, + $TemplateCacheProvider, + $TemplateRequestProvider, + $$TestabilityProvider, + $TimeoutProvider, + $$RAFProvider, + $WindowProvider, + $$jqLiteProvider, + $$CookieReaderProvider +*/ + + +/** + * @ngdoc object + * @name angular.version + * @module ng + * @description + * An object that contains information about the current AngularJS version. + * + * This object has the following properties: + * + * - `full` – `{string}` – Full version string, such as "0.9.18". + * - `major` – `{number}` – Major version number, such as "0". + * - `minor` – `{number}` – Minor version number, such as "9". + * - `dot` – `{number}` – Dot version number, such as "18". + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". + */ +var version = { + full: '1.5.8', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 5, + dot: 8, + codeName: 'arbitrary-fallbacks' +}; + + +function publishExternalAPI(angular) { + extend(angular, { + 'bootstrap': bootstrap, + 'copy': copy, + 'extend': extend, + 'merge': merge, + 'equals': equals, + 'element': jqLite, + 'forEach': forEach, + 'injector': createInjector, + 'noop': noop, + 'bind': bind, + 'toJson': toJson, + 'fromJson': fromJson, + 'identity': identity, + 'isUndefined': isUndefined, + 'isDefined': isDefined, + 'isString': isString, + 'isFunction': isFunction, + 'isObject': isObject, + 'isNumber': isNumber, + 'isElement': isElement, + 'isArray': isArray, + 'version': version, + 'isDate': isDate, + 'lowercase': lowercase, + 'uppercase': uppercase, + 'callbacks': {$$counter: 0}, + 'getTestability': getTestability, + '$$minErr': minErr, + '$$csp': csp, + 'reloadWithDebugInfo': reloadWithDebugInfo + }); + + angularModule = setupModuleLoader(window); + + angularModule('ng', ['ngLocale'], ['$provide', + function ngModule($provide) { + // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. + $provide.provider({ + $$sanitizeUri: $$SanitizeUriProvider + }); + $provide.provider('$compile', $CompileProvider). + directive({ + a: htmlAnchorDirective, + input: inputDirective, + textarea: inputDirective, + form: formDirective, + script: scriptDirective, + select: selectDirective, + style: styleDirective, + option: optionDirective, + ngBind: ngBindDirective, + ngBindHtml: ngBindHtmlDirective, + ngBindTemplate: ngBindTemplateDirective, + ngClass: ngClassDirective, + ngClassEven: ngClassEvenDirective, + ngClassOdd: ngClassOddDirective, + ngCloak: ngCloakDirective, + ngController: ngControllerDirective, + ngForm: ngFormDirective, + ngHide: ngHideDirective, + ngIf: ngIfDirective, + ngInclude: ngIncludeDirective, + ngInit: ngInitDirective, + ngNonBindable: ngNonBindableDirective, + ngPluralize: ngPluralizeDirective, + ngRepeat: ngRepeatDirective, + ngShow: ngShowDirective, + ngStyle: ngStyleDirective, + ngSwitch: ngSwitchDirective, + ngSwitchWhen: ngSwitchWhenDirective, + ngSwitchDefault: ngSwitchDefaultDirective, + ngOptions: ngOptionsDirective, + ngTransclude: ngTranscludeDirective, + ngModel: ngModelDirective, + ngList: ngListDirective, + ngChange: ngChangeDirective, + pattern: patternDirective, + ngPattern: patternDirective, + required: requiredDirective, + ngRequired: requiredDirective, + minlength: minlengthDirective, + ngMinlength: minlengthDirective, + maxlength: maxlengthDirective, + ngMaxlength: maxlengthDirective, + ngValue: ngValueDirective, + ngModelOptions: ngModelOptionsDirective + }). + directive({ + ngInclude: ngIncludeFillContentDirective + }). + directive(ngAttributeAliasDirectives). + directive(ngEventDirectives); + $provide.provider({ + $anchorScroll: $AnchorScrollProvider, + $animate: $AnimateProvider, + $animateCss: $CoreAnimateCssProvider, + $$animateJs: $$CoreAnimateJsProvider, + $$animateQueue: $$CoreAnimateQueueProvider, + $$AnimateRunner: $$AnimateRunnerFactoryProvider, + $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider, + $browser: $BrowserProvider, + $cacheFactory: $CacheFactoryProvider, + $controller: $ControllerProvider, + $document: $DocumentProvider, + $exceptionHandler: $ExceptionHandlerProvider, + $filter: $FilterProvider, + $$forceReflow: $$ForceReflowProvider, + $interpolate: $InterpolateProvider, + $interval: $IntervalProvider, + $http: $HttpProvider, + $httpParamSerializer: $HttpParamSerializerProvider, + $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, + $httpBackend: $HttpBackendProvider, + $xhrFactory: $xhrFactoryProvider, + $jsonpCallbacks: $jsonpCallbacksProvider, + $location: $LocationProvider, + $log: $LogProvider, + $parse: $ParseProvider, + $rootScope: $RootScopeProvider, + $q: $QProvider, + $$q: $$QProvider, + $sce: $SceProvider, + $sceDelegate: $SceDelegateProvider, + $sniffer: $SnifferProvider, + $templateCache: $TemplateCacheProvider, + $templateRequest: $TemplateRequestProvider, + $$testability: $$TestabilityProvider, + $timeout: $TimeoutProvider, + $window: $WindowProvider, + $$rAF: $$RAFProvider, + $$jqLite: $$jqLiteProvider, + $$HashMap: $$HashMapProvider, + $$cookieReader: $$CookieReaderProvider + }); + } + ]); +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* global JQLitePrototype: true, + addEventListenerFn: true, + removeEventListenerFn: true, + BOOLEAN_ATTR: true, + ALIASED_ATTR: true, +*/ + +////////////////////////////////// +//JQLite +////////////////////////////////// + +/** + * @ngdoc function + * @name angular.element + * @module ng + * @kind function + * + * @description + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. + * + * If jQuery is available, `angular.element` is an alias for the + * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or **jqLite**. + * + * jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most + * commonly needed functionality with the goal of having a very small footprint. + * + * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the + * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a + * specific version of jQuery if multiple versions exist on the page. + * + *
**Note:** All element references in Angular are always wrapped with jQuery or + * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.
+ * + *
**Note:** Keep in mind that this function will not find elements + * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)` + * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.
+ * + * ## Angular's jqLite + * jqLite provides only the following jQuery methods: + * + * - [`addClass()`](http://api.jquery.com/addClass/) - Does not support a function as first argument + * - [`after()`](http://api.jquery.com/after/) + * - [`append()`](http://api.jquery.com/append/) + * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters + * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData + * - [`children()`](http://api.jquery.com/children/) - Does not support selectors + * - [`clone()`](http://api.jquery.com/clone/) + * - [`contents()`](http://api.jquery.com/contents/) + * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. + * As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing. + * - [`data()`](http://api.jquery.com/data/) + * - [`detach()`](http://api.jquery.com/detach/) + * - [`empty()`](http://api.jquery.com/empty/) + * - [`eq()`](http://api.jquery.com/eq/) + * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name + * - [`hasClass()`](http://api.jquery.com/hasClass/) + * - [`html()`](http://api.jquery.com/html/) + * - [`next()`](http://api.jquery.com/next/) - Does not support selectors + * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData + * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter + * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors + * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors + * - [`prepend()`](http://api.jquery.com/prepend/) + * - [`prop()`](http://api.jquery.com/prop/) + * - [`ready()`](http://api.jquery.com/ready/) + * - [`remove()`](http://api.jquery.com/remove/) + * - [`removeAttr()`](http://api.jquery.com/removeAttr/) + * - [`removeClass()`](http://api.jquery.com/removeClass/) - Does not support a function as first argument + * - [`removeData()`](http://api.jquery.com/removeData/) + * - [`replaceWith()`](http://api.jquery.com/replaceWith/) + * - [`text()`](http://api.jquery.com/text/) + * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument + * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers + * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter + * - [`val()`](http://api.jquery.com/val/) + * - [`wrap()`](http://api.jquery.com/wrap/) + * + * ## jQuery/jqLite Extras + * Angular also provides the following additional methods and events to both jQuery and jqLite: + * + * ### Events + * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event + * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM + * element before it is removed. + * + * ### Methods + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ngController` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current + * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to + * be enabled. + * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the + * current element. This getter should be used only on elements that contain a directive which starts a new isolate + * scope. Calling `scope()` on this element always returns the original non-isolate scope. + * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top + * parent element is reached. + * + * @knownIssue You cannot spy on `angular.element` if you are using Jasmine version 1.x. See + * https://github.com/angular/angular.js/issues/14251 for more information. + * + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. + * @returns {Object} jQuery object. + */ + +JQLite.expando = 'ng339'; + +var jqCache = JQLite.cache = {}, + jqId = 1, + addEventListenerFn = function(element, type, fn) { + element.addEventListener(type, fn, false); + }, + removeEventListenerFn = function(element, type, fn) { + element.removeEventListener(type, fn, false); + }; + +/* + * !!! This is an undocumented "private" function !!! + */ +JQLite._data = function(node) { + //jQuery always returns an object on cache miss + return this.cache[node[this.expando]] || {}; +}; + +function jqNextId() { return ++jqId; } + + +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; +var MOZ_HACK_REGEXP = /^moz([A-Z])/; +var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; +var jqLiteMinErr = minErr('jqLite'); + +/** + * Converts snake_case to camelCase. + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function camelCase(name) { + return name. + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { + return offset ? letter.toUpperCase() : letter; + }). + replace(MOZ_HACK_REGEXP, 'Moz$1'); +} + +var SINGLE_TAG_REGEXP = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/; +var HTML_REGEXP = /<|&#?\w+;/; +var TAG_NAME_REGEXP = /<([\w:-]+)/; +var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi; + +var wrapMap = { + 'option': [1, ''], + + 'thead': [1, '', '
'], + 'col': [2, '', '
'], + 'tr': [2, '', '
'], + 'td': [3, '', '
'], + '_default': [0, "", ""] +}; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function jqLiteIsTextNode(html) { + return !HTML_REGEXP.test(html); +} + +function jqLiteAcceptsData(node) { + // The window object can accept data but has no nodeType + // Otherwise we are only interested in elements (1) and documents (9) + var nodeType = node.nodeType; + return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; +} + +function jqLiteHasData(node) { + for (var key in jqCache[node.ng339]) { + return true; + } + return false; +} + +function jqLiteCleanData(nodes) { + for (var i = 0, ii = nodes.length; i < ii; i++) { + jqLiteRemoveData(nodes[i]); + } +} + +function jqLiteBuildFragment(html, context) { + var tmp, tag, wrap, + fragment = context.createDocumentFragment(), + nodes = [], i; + + if (jqLiteIsTextNode(html)) { + // Convert non-html into a text node + nodes.push(context.createTextNode(html)); + } else { + // Convert html into DOM nodes + tmp = fragment.appendChild(context.createElement("div")); + tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; + + // Descend through wrappers to the right content + i = wrap[0]; + while (i--) { + tmp = tmp.lastChild; + } + + nodes = concat(nodes, tmp.childNodes); + + tmp = fragment.firstChild; + tmp.textContent = ""; + } + + // Remove wrapper from fragment + fragment.textContent = ""; + fragment.innerHTML = ""; // Clear inner HTML + forEach(nodes, function(node) { + fragment.appendChild(node); + }); + + return fragment; +} + +function jqLiteParseHTML(html, context) { + context = context || window.document; + var parsed; + + if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { + return [context.createElement(parsed[1])]; + } + + if ((parsed = jqLiteBuildFragment(html, context))) { + return parsed.childNodes; + } + + return []; +} + +function jqLiteWrapNode(node, wrapper) { + var parent = node.parentNode; + + if (parent) { + parent.replaceChild(wrapper, node); + } + + wrapper.appendChild(node); +} + + +// IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259. +var jqLiteContains = window.Node.prototype.contains || function(arg) { + // jshint bitwise: false + return !!(this.compareDocumentPosition(arg) & 16); + // jshint bitwise: true +}; + +///////////////////////////////////////////// +function JQLite(element) { + if (element instanceof JQLite) { + return element; + } + + var argIsString; + + if (isString(element)) { + element = trim(element); + argIsString = true; + } + if (!(this instanceof JQLite)) { + if (argIsString && element.charAt(0) != '<') { + throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); + } + return new JQLite(element); + } + + if (argIsString) { + jqLiteAddNodes(this, jqLiteParseHTML(element)); + } else { + jqLiteAddNodes(this, element); + } +} + +function jqLiteClone(element) { + return element.cloneNode(true); +} + +function jqLiteDealoc(element, onlyDescendants) { + if (!onlyDescendants) jqLiteRemoveData(element); + + if (element.querySelectorAll) { + var descendants = element.querySelectorAll('*'); + for (var i = 0, l = descendants.length; i < l; i++) { + jqLiteRemoveData(descendants[i]); + } + } +} + +function jqLiteOff(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); + + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var handle = expandoStore && expandoStore.handle; + + if (!handle) return; //no listeners registered + + if (!type) { + for (type in events) { + if (type !== '$destroy') { + removeEventListenerFn(element, type, handle); + } + delete events[type]; + } + } else { + + var removeHandler = function(type) { + var listenerFns = events[type]; + if (isDefined(fn)) { + arrayRemove(listenerFns || [], fn); + } + if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) { + removeEventListenerFn(element, type, handle); + delete events[type]; + } + }; + + forEach(type.split(' '), function(type) { + removeHandler(type); + if (MOUSE_EVENT_MAP[type]) { + removeHandler(MOUSE_EVENT_MAP[type]); + } + }); + } +} + +function jqLiteRemoveData(element, name) { + var expandoId = element.ng339; + var expandoStore = expandoId && jqCache[expandoId]; + + if (expandoStore) { + if (name) { + delete expandoStore.data[name]; + return; + } + + if (expandoStore.handle) { + if (expandoStore.events.$destroy) { + expandoStore.handle({}, '$destroy'); + } + jqLiteOff(element); + } + delete jqCache[expandoId]; + element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it + } +} + + +function jqLiteExpandoStore(element, createIfNecessary) { + var expandoId = element.ng339, + expandoStore = expandoId && jqCache[expandoId]; + + if (createIfNecessary && !expandoStore) { + element.ng339 = expandoId = jqNextId(); + expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; + } + + return expandoStore; +} + + +function jqLiteData(element, key, value) { + if (jqLiteAcceptsData(element)) { + + var isSimpleSetter = isDefined(value); + var isSimpleGetter = !isSimpleSetter && key && !isObject(key); + var massGetter = !key; + var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); + var data = expandoStore && expandoStore.data; + + if (isSimpleSetter) { // data('key', value) + data[key] = value; + } else { + if (massGetter) { // data() + return data; + } else { + if (isSimpleGetter) { // data('key') + // don't force creation of expandoStore if it doesn't exist yet + return data && data[key]; + } else { // mass-setter: data({key1: val1, key2: val2}) + extend(data, key); + } + } + } + } +} + +function jqLiteHasClass(element, selector) { + if (!element.getAttribute) return false; + return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). + indexOf(" " + selector + " ") > -1); +} + +function jqLiteRemoveClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + forEach(cssClasses.split(' '), function(cssClass) { + element.setAttribute('class', trim( + (" " + (element.getAttribute('class') || '') + " ") + .replace(/[\n\t]/g, " ") + .replace(" " + trim(cssClass) + " ", " ")) + ); + }); + } +} + +function jqLiteAddClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + .replace(/[\n\t]/g, " "); + + forEach(cssClasses.split(' '), function(cssClass) { + cssClass = trim(cssClass); + if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { + existingClasses += cssClass + ' '; + } + }); + + element.setAttribute('class', trim(existingClasses)); + } +} + + +function jqLiteAddNodes(root, elements) { + // THIS CODE IS VERY HOT. Don't make changes without benchmarking. + + if (elements) { + + // if a Node (the most common case) + if (elements.nodeType) { + root[root.length++] = elements; + } else { + var length = elements.length; + + // if an Array or NodeList and not a Window + if (typeof length === 'number' && elements.window !== elements) { + if (length) { + for (var i = 0; i < length; i++) { + root[root.length++] = elements[i]; + } + } + } else { + root[root.length++] = elements; + } + } + } +} + + +function jqLiteController(element, name) { + return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); +} + +function jqLiteInheritedData(element, name, value) { + // if element is the document object work with the html element instead + // this makes $(document).scope() possible + if (element.nodeType == NODE_TYPE_DOCUMENT) { + element = element.documentElement; + } + var names = isArray(name) ? name : [name]; + + while (element) { + for (var i = 0, ii = names.length; i < ii; i++) { + if (isDefined(value = jqLite.data(element, names[i]))) return value; + } + + // If dealing with a document fragment node with a host element, and no parent, use the host + // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM + // to lookup parent controllers. + element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); + } +} + +function jqLiteEmpty(element) { + jqLiteDealoc(element, true); + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + +function jqLiteRemove(element, keepData) { + if (!keepData) jqLiteDealoc(element); + var parent = element.parentNode; + if (parent) parent.removeChild(element); +} + + +function jqLiteDocumentLoaded(action, win) { + win = win || window; + if (win.document.readyState === 'complete') { + // Force the action to be run async for consistent behavior + // from the action's point of view + // i.e. it will definitely not be in a $apply + win.setTimeout(action); + } else { + // No need to unbind this handler as load is only ever called once + jqLite(win).on('load', action); + } +} + +////////////////////////////////////////// +// Functions which are declared directly. +////////////////////////////////////////// +var JQLitePrototype = JQLite.prototype = { + ready: function(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document is already loaded + if (window.document.readyState === 'complete') { + window.setTimeout(trigger); + } else { + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + // jshint -W064 + JQLite(window).on('load', trigger); // fallback to window.onload for others + // jshint +W064 + } + }, + toString: function() { + var value = []; + forEach(this, function(e) { value.push('' + e);}); + return '[' + value.join(', ') + ']'; + }, + + eq: function(index) { + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); + }, + + length: 0, + push: push, + sort: [].sort, + splice: [].splice +}; + +////////////////////////////////////////// +// Functions iterating getter/setters. +// these functions return self on setter and +// value on get. +////////////////////////////////////////// +var BOOLEAN_ATTR = {}; +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { + BOOLEAN_ATTR[lowercase(value)] = value; +}); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { + BOOLEAN_ELEMENTS[value] = true; +}); +var ALIASED_ATTR = { + 'ngMinlength': 'minlength', + 'ngMaxlength': 'maxlength', + 'ngMin': 'min', + 'ngMax': 'max', + 'ngPattern': 'pattern' +}; + +function getBooleanAttrName(element, name) { + // check dom last since we will most likely fail on name + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; + + // booleanAttr is here twice to minimize DOM access + return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; +} + +function getAliasedAttrName(name) { + return ALIASED_ATTR[name]; +} + +forEach({ + data: jqLiteData, + removeData: jqLiteRemoveData, + hasData: jqLiteHasData, + cleanData: jqLiteCleanData +}, function(fn, name) { + JQLite[name] = fn; +}); + +forEach({ + data: jqLiteData, + inheritedData: jqLiteInheritedData, + + scope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); + }, + + isolateScope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); + }, + + controller: jqLiteController, + + injector: function(element) { + return jqLiteInheritedData(element, '$injector'); + }, + + removeAttr: function(element, name) { + element.removeAttribute(name); + }, + + hasClass: jqLiteHasClass, + + css: function(element, name, value) { + name = camelCase(name); + + if (isDefined(value)) { + element.style[name] = value; + } else { + return element.style[name]; + } + }, + + attr: function(element, name, value) { + var nodeType = element.nodeType; + if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) { + return; + } + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { + if (isDefined(value)) { + if (!!value) { + element[name] = true; + element.setAttribute(name, lowercasedName); + } else { + element[name] = false; + element.removeAttribute(lowercasedName); + } + } else { + return (element[name] || + (element.attributes.getNamedItem(name) || noop).specified) + ? lowercasedName + : undefined; + } + } else if (isDefined(value)) { + element.setAttribute(name, value); + } else if (element.getAttribute) { + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code + // some elements (e.g. Document) don't have get attribute, so return undefined + var ret = element.getAttribute(name, 2); + // normalize non-existing attributes to undefined (as jQuery) + return ret === null ? undefined : ret; + } + }, + + prop: function(element, name, value) { + if (isDefined(value)) { + element[name] = value; + } else { + return element[name]; + } + }, + + text: (function() { + getText.$dv = ''; + return getText; + + function getText(element, value) { + if (isUndefined(value)) { + var nodeType = element.nodeType; + return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; + } + element.textContent = value; + } + })(), + + val: function(element, value) { + if (isUndefined(value)) { + if (element.multiple && nodeName_(element) === 'select') { + var result = []; + forEach(element.options, function(option) { + if (option.selected) { + result.push(option.value || option.text); + } + }); + return result.length === 0 ? null : result; + } + return element.value; + } + element.value = value; + }, + + html: function(element, value) { + if (isUndefined(value)) { + return element.innerHTML; + } + jqLiteDealoc(element, true); + element.innerHTML = value; + }, + + empty: jqLiteEmpty +}, function(fn, name) { + /** + * Properties: writes return selection, reads return first value + */ + JQLite.prototype[name] = function(arg1, arg2) { + var i, key; + var nodeCount = this.length; + + // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it + // in a way that survives minification. + // jqLiteEmpty takes no arguments but is a setter. + if (fn !== jqLiteEmpty && + (isUndefined((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) { + if (isObject(arg1)) { + + // we are a write, but the object properties are the key/values + for (i = 0; i < nodeCount; i++) { + if (fn === jqLiteData) { + // data() takes the whole object in jQuery + fn(this[i], arg1); + } else { + for (key in arg1) { + fn(this[i], key, arg1[key]); + } + } + } + // return self for chaining + return this; + } else { + // we are a read, so read the first child. + // TODO: do we still need this? + var value = fn.$dv; + // Only if we have $dv do we iterate over all, otherwise it is just the first element. + var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount; + for (var j = 0; j < jj; j++) { + var nodeValue = fn(this[j], arg1, arg2); + value = value ? value + nodeValue : nodeValue; + } + return value; + } + } else { + // we are a write, so apply to all children + for (i = 0; i < nodeCount; i++) { + fn(this[i], arg1, arg2); + } + // return self for chaining + return this; + } + }; +}); + +function createEventHandler(element, events) { + var eventHandler = function(event, type) { + // jQuery specific api + event.isDefaultPrevented = function() { + return event.defaultPrevented; + }; + + var eventFns = events[type || event.type]; + var eventFnsLength = eventFns ? eventFns.length : 0; + + if (!eventFnsLength) return; + + if (isUndefined(event.immediatePropagationStopped)) { + var originalStopImmediatePropagation = event.stopImmediatePropagation; + event.stopImmediatePropagation = function() { + event.immediatePropagationStopped = true; + + if (event.stopPropagation) { + event.stopPropagation(); + } + + if (originalStopImmediatePropagation) { + originalStopImmediatePropagation.call(event); + } + }; + } + + event.isImmediatePropagationStopped = function() { + return event.immediatePropagationStopped === true; + }; + + // Some events have special handlers that wrap the real handler + var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper; + + // Copy event handlers in case event handlers array is modified during execution. + if ((eventFnsLength > 1)) { + eventFns = shallowCopy(eventFns); + } + + for (var i = 0; i < eventFnsLength; i++) { + if (!event.isImmediatePropagationStopped()) { + handlerWrapper(element, event, eventFns[i]); + } + } + }; + + // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all + // events on `element` + eventHandler.elem = element; + return eventHandler; +} + +function defaultHandlerWrapper(element, event, handler) { + handler.call(element, event); +} + +function specialMouseHandlerWrapper(target, event, handler) { + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + var related = event.relatedTarget; + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !jqLiteContains.call(target, related))) { + handler.call(target, event); + } +} + +////////////////////////////////////////// +// Functions iterating traversal. +// These functions chain results into a single +// selector. +////////////////////////////////////////// +forEach({ + removeData: jqLiteRemoveData, + + on: function jqLiteOn(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); + + // Do not add event handlers to non-elements because they will not be cleaned up. + if (!jqLiteAcceptsData(element)) { + return; + } + + var expandoStore = jqLiteExpandoStore(element, true); + var events = expandoStore.events; + var handle = expandoStore.handle; + + if (!handle) { + handle = expandoStore.handle = createEventHandler(element, events); + } + + // http://jsperf.com/string-indexof-vs-split + var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; + var i = types.length; + + var addHandler = function(type, specialHandlerWrapper, noEventListener) { + var eventFns = events[type]; + + if (!eventFns) { + eventFns = events[type] = []; + eventFns.specialHandlerWrapper = specialHandlerWrapper; + if (type !== '$destroy' && !noEventListener) { + addEventListenerFn(element, type, handle); + } + } + + eventFns.push(fn); + }; + + while (i--) { + type = types[i]; + if (MOUSE_EVENT_MAP[type]) { + addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper); + addHandler(type, undefined, true); + } else { + addHandler(type); + } + } + }, + + off: jqLiteOff, + + one: function(element, type, fn) { + element = jqLite(element); + + //add the listener twice so that when it is called + //you can remove the original function and still be + //able to call element.off(ev, fn) normally + element.on(type, function onFn() { + element.off(type, fn); + element.off(type, onFn); + }); + element.on(type, fn); + }, + + replaceWith: function(element, replaceNode) { + var index, parent = element.parentNode; + jqLiteDealoc(element); + forEach(new JQLite(replaceNode), function(node) { + if (index) { + parent.insertBefore(node, index.nextSibling); + } else { + parent.replaceChild(node, element); + } + index = node; + }); + }, + + children: function(element) { + var children = []; + forEach(element.childNodes, function(element) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + children.push(element); + } + }); + return children; + }, + + contents: function(element) { + return element.contentDocument || element.childNodes || []; + }, + + append: function(element, node) { + var nodeType = element.nodeType; + if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; + + node = new JQLite(node); + + for (var i = 0, ii = node.length; i < ii; i++) { + var child = node[i]; + element.appendChild(child); + } + }, + + prepend: function(element, node) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + var index = element.firstChild; + forEach(new JQLite(node), function(child) { + element.insertBefore(child, index); + }); + } + }, + + wrap: function(element, wrapNode) { + jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]); + }, + + remove: jqLiteRemove, + + detach: function(element) { + jqLiteRemove(element, true); + }, + + after: function(element, newElement) { + var index = element, parent = element.parentNode; + newElement = new JQLite(newElement); + + for (var i = 0, ii = newElement.length; i < ii; i++) { + var node = newElement[i]; + parent.insertBefore(node, index.nextSibling); + index = node; + } + }, + + addClass: jqLiteAddClass, + removeClass: jqLiteRemoveClass, + + toggleClass: function(element, selector, condition) { + if (selector) { + forEach(selector.split(' '), function(className) { + var classCondition = condition; + if (isUndefined(classCondition)) { + classCondition = !jqLiteHasClass(element, className); + } + (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); + }); + } + }, + + parent: function(element) { + var parent = element.parentNode; + return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; + }, + + next: function(element) { + return element.nextElementSibling; + }, + + find: function(element, selector) { + if (element.getElementsByTagName) { + return element.getElementsByTagName(selector); + } else { + return []; + } + }, + + clone: jqLiteClone, + + triggerHandler: function(element, event, extraParameters) { + + var dummyEvent, eventFnsCopy, handlerArgs; + var eventName = event.type || event; + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var eventFns = events && events[eventName]; + + if (eventFns) { + // Create a dummy event to pass to the handlers + dummyEvent = { + preventDefault: function() { this.defaultPrevented = true; }, + isDefaultPrevented: function() { return this.defaultPrevented === true; }, + stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, + isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, + stopPropagation: noop, + type: eventName, + target: element + }; + + // If a custom event was provided then extend our dummy event with it + if (event.type) { + dummyEvent = extend(dummyEvent, event); + } + + // Copy event handlers in case event handlers array is modified during execution. + eventFnsCopy = shallowCopy(eventFns); + handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; + + forEach(eventFnsCopy, function(fn) { + if (!dummyEvent.isImmediatePropagationStopped()) { + fn.apply(element, handlerArgs); + } + }); + } + } +}, function(fn, name) { + /** + * chaining functions + */ + JQLite.prototype[name] = function(arg1, arg2, arg3) { + var value; + + for (var i = 0, ii = this.length; i < ii; i++) { + if (isUndefined(value)) { + value = fn(this[i], arg1, arg2, arg3); + if (isDefined(value)) { + // any function which returns a value needs to be wrapped + value = jqLite(value); + } + } else { + jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); + } + } + return isDefined(value) ? value : this; + }; + + // bind legacy bind/unbind to on/off + JQLite.prototype.bind = JQLite.prototype.on; + JQLite.prototype.unbind = JQLite.prototype.off; +}); + + +// Provider for private $$jqLite service +function $$jqLiteProvider() { + this.$get = function $$jqLite() { + return extend(JQLite, { + hasClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteHasClass(node, classes); + }, + addClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteAddClass(node, classes); + }, + removeClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteRemoveClass(node, classes); + } + }); + }; +} + +/** + * Computes a hash of an 'obj'. + * Hash of a: + * string is string + * number is number as string + * object is either result of calling $$hashKey function on the object or uniquely generated id, + * that is also assigned to the $$hashKey property of the object. + * + * @param obj + * @returns {string} hash string such that the same input will have the same hash string. + * The resulting string key is in 'type:hashKey' format. + */ +function hashKey(obj, nextUidFn) { + var key = obj && obj.$$hashKey; + + if (key) { + if (typeof key === 'function') { + key = obj.$$hashKey(); + } + return key; + } + + var objType = typeof obj; + if (objType == 'function' || (objType == 'object' && obj !== null)) { + key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); + } else { + key = objType + ':' + obj; + } + + return key; +} + +/** + * HashMap which can use objects as keys + */ +function HashMap(array, isolatedUid) { + if (isolatedUid) { + var uid = 0; + this.nextUid = function() { + return ++uid; + }; + } + forEach(array, this.put, this); +} +HashMap.prototype = { + /** + * Store key value pair + * @param key key to store can be any type + * @param value value to store can be any type + */ + put: function(key, value) { + this[hashKey(key, this.nextUid)] = value; + }, + + /** + * @param key + * @returns {Object} the value for the key + */ + get: function(key) { + return this[hashKey(key, this.nextUid)]; + }, + + /** + * Remove the key/value pair + * @param key + */ + remove: function(key) { + var value = this[key = hashKey(key, this.nextUid)]; + delete this[key]; + return value; + } +}; + +var $$HashMapProvider = [function() { + this.$get = [function() { + return HashMap; + }]; +}]; + +/** + * @ngdoc function + * @module ng + * @name angular.injector + * @kind function + * + * @description + * Creates an injector object that can be used for retrieving services as well as for + * dependency injection (see {@link guide/di dependency injection}). + * + * @param {Array.} modules A list of module functions or their aliases. See + * {@link angular.module}. The `ng` module must be explicitly added. + * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which + * disallows argument name annotation inference. + * @returns {injector} Injector object. See {@link auto.$injector $injector}. + * + * @example + * Typical usage + * ```js + * // create an injector + * var $injector = angular.injector(['ng']); + * + * // use the injector to kick off your application + * // use the type inference to auto inject arguments, or use implicit injection + * $injector.invoke(function($rootScope, $compile, $document) { + * $compile($document)($rootScope); + * $rootScope.$digest(); + * }); + * ``` + * + * Sometimes you want to get access to the injector of a currently running Angular app + * from outside Angular. Perhaps, you want to inject and compile some markup after the + * application has been bootstrapped. You can do this using the extra `injector()` added + * to JQuery/jqLite elements. See {@link angular.element}. + * + * *This is fairly rare but could be the case if a third party library is injecting the + * markup.* + * + * In the following example a new block of HTML containing a `ng-controller` + * directive is added to the end of the document body by JQuery. We then compile and link + * it into the current AngularJS scope. + * + * ```js + * var $div = $('
{{content.label}}
'); + * $(document.body).append($div); + * + * angular.element(document).injector().invoke(function($compile) { + * var scope = angular.element($div).scope(); + * $compile($div)(scope); + * }); + * ``` + */ + + +/** + * @ngdoc module + * @name auto + * @installation + * @description + * + * Implicit module which gets automatically added to each {@link auto.$injector $injector}. + */ + +var ARROW_ARG = /^([^\(]+?)=>/; +var FN_ARGS = /^[^\(]*\(\s*([^\)]*)\)/m; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +var $injectorMinErr = minErr('$injector'); + +function stringifyFn(fn) { + // Support: Chrome 50-51 only + // Creating a new string by adding `' '` at the end, to hack around some bug in Chrome v50/51 + // (See https://github.com/angular/angular.js/issues/14487.) + // TODO (gkalpak): Remove workaround when Chrome v52 is released + return Function.prototype.toString.call(fn) + ' '; +} + +function extractArgs(fn) { + var fnText = stringifyFn(fn).replace(STRIP_COMMENTS, ''), + args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS); + return args; +} + +function anonFn(fn) { + // For anonymous functions, showing at the very least the function signature can help in + // debugging. + var args = extractArgs(fn); + if (args) { + return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; + } + return 'fn'; +} + +function annotate(fn, strictDi, name) { + var $inject, + argDecl, + last; + + if (typeof fn === 'function') { + if (!($inject = fn.$inject)) { + $inject = []; + if (fn.length) { + if (strictDi) { + if (!isString(name) || !name) { + name = fn.name || anonFn(fn); + } + throw $injectorMinErr('strictdi', + '{0} is not using explicit annotation and cannot be invoked in strict mode', name); + } + argDecl = extractArgs(fn); + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { + arg.replace(FN_ARG, function(all, underscore, name) { + $inject.push(name); + }); + }); + } + fn.$inject = $inject; + } + } else if (isArray(fn)) { + last = fn.length - 1; + assertArgFn(fn[last], 'fn'); + $inject = fn.slice(0, last); + } else { + assertArgFn(fn, 'fn', true); + } + return $inject; +} + +/////////////////////////////////////// + +/** + * @ngdoc service + * @name $injector + * + * @description + * + * `$injector` is used to retrieve object instances as defined by + * {@link auto.$provide provider}, instantiate types, invoke methods, + * and load modules. + * + * The following always holds true: + * + * ```js + * var $injector = angular.injector(); + * expect($injector.get('$injector')).toBe($injector); + * expect($injector.invoke(function($injector) { + * return $injector; + * })).toBe($injector); + * ``` + * + * # Injection Function Annotation + * + * JavaScript does not have annotations, and annotations are needed for dependency injection. The + * following are all valid ways of annotating function with injection arguments and are equivalent. + * + * ```js + * // inferred (only works if code not minified/obfuscated) + * $injector.invoke(function(serviceA){}); + * + * // annotated + * function explicit(serviceA) {}; + * explicit.$inject = ['serviceA']; + * $injector.invoke(explicit); + * + * // inline + * $injector.invoke(['serviceA', function(serviceA){}]); + * ``` + * + * ## Inference + * + * In JavaScript calling `toString()` on a function returns the function definition. The definition + * can then be parsed and the function arguments can be extracted. This method of discovering + * annotations is disallowed when the injector is in strict mode. + * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the + * argument names. + * + * ## `$inject` Annotation + * By adding an `$inject` property onto a function the injection parameters can be specified. + * + * ## Inline + * As an array of injection names, where the last item in the array is the function to call. + */ + +/** + * @ngdoc method + * @name $injector#get + * + * @description + * Return an instance of the service. + * + * @param {string} name The name of the instance to retrieve. + * @param {string=} caller An optional string to provide the origin of the function call for error messages. + * @return {*} The instance. + */ + +/** + * @ngdoc method + * @name $injector#invoke + * + * @description + * Invoke the method and supply the method arguments from the `$injector`. + * + * @param {Function|Array.} fn The injectable function to invoke. Function parameters are + * injected according to the {@link guide/di $inject Annotation} rules. + * @param {Object=} self The `this` for the invoked method. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {*} the value returned by the invoked `fn` function. + */ + +/** + * @ngdoc method + * @name $injector#has + * + * @description + * Allows the user to query if the particular service exists. + * + * @param {string} name Name of the service to query. + * @returns {boolean} `true` if injector has given service. + */ + +/** + * @ngdoc method + * @name $injector#instantiate + * @description + * Create a new instance of JS type. The method takes a constructor function, invokes the new + * operator, and supplies all of the arguments to the constructor function as specified by the + * constructor annotation. + * + * @param {Function} Type Annotated constructor function. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {Object} new instance of `Type`. + */ + +/** + * @ngdoc method + * @name $injector#annotate + * + * @description + * Returns an array of service names which the function is requesting for injection. This API is + * used by the injector to determine which services need to be injected into the function when the + * function is invoked. There are three ways in which the function can be annotated with the needed + * dependencies. + * + * # Argument names + * + * The simplest form is to extract the dependencies from the arguments of the function. This is done + * by converting the function into a string using `toString()` method and extracting the argument + * names. + * ```js + * // Given + * function MyController($scope, $route) { + * // ... + * } + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * You can disallow this method by using strict injection mode. + * + * This method does not work with code minification / obfuscation. For this reason the following + * annotation strategies are supported. + * + * # The `$inject` property + * + * If a function has an `$inject` property and its value is an array of strings, then the strings + * represent names of services to be injected into the function. + * ```js + * // Given + * var MyController = function(obfuscatedScope, obfuscatedRoute) { + * // ... + * } + * // Define function dependencies + * MyController['$inject'] = ['$scope', '$route']; + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * # The array notation + * + * It is often desirable to inline Injected functions and that's when setting the `$inject` property + * is very inconvenient. In these situations using the array notation to specify the dependencies in + * a way that survives minification is a better choice: + * + * ```js + * // We wish to write this (not minification / obfuscation safe) + * injector.invoke(function($compile, $rootScope) { + * // ... + * }); + * + * // We are forced to write break inlining + * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { + * // ... + * }; + * tmpFn.$inject = ['$compile', '$rootScope']; + * injector.invoke(tmpFn); + * + * // To better support inline function the inline annotation is supported + * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { + * // ... + * }]); + * + * // Therefore + * expect(injector.annotate( + * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) + * ).toEqual(['$compile', '$rootScope']); + * ``` + * + * @param {Function|Array.} fn Function for which dependent service names need to + * be retrieved as described above. + * + * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. + * + * @returns {Array.} The names of the services which the function requires. + */ + + + + +/** + * @ngdoc service + * @name $provide + * + * @description + * + * The {@link auto.$provide $provide} service has a number of methods for registering components + * with the {@link auto.$injector $injector}. Many of these functions are also exposed on + * {@link angular.Module}. + * + * An Angular **service** is a singleton object created by a **service factory**. These **service + * factories** are functions which, in turn, are created by a **service provider**. + * The **service providers** are constructor functions. When instantiated they must contain a + * property called `$get`, which holds the **service factory** function. + * + * When you request a service, the {@link auto.$injector $injector} is responsible for finding the + * correct **service provider**, instantiating it and then calling its `$get` **service factory** + * function to get the instance of the **service**. + * + * Often services have no configuration options and there is no need to add methods to the service + * provider. The provider will be no more than a constructor function with a `$get` property. For + * these cases the {@link auto.$provide $provide} service has additional helper methods to register + * services without specifying a provider. + * + * * {@link auto.$provide#provider provider(name, provider)} - registers a **service provider** with the + * {@link auto.$injector $injector} + * * {@link auto.$provide#constant constant(name, obj)} - registers a value/object that can be accessed by + * providers and services. + * * {@link auto.$provide#value value(name, obj)} - registers a value/object that can only be accessed by + * services, not providers. + * * {@link auto.$provide#factory factory(name, fn)} - registers a service **factory function** + * that will be wrapped in a **service provider** object, whose `$get` property will contain the + * given factory function. + * * {@link auto.$provide#service service(name, Fn)} - registers a **constructor function** + * that will be wrapped in a **service provider** object, whose `$get` property will instantiate + * a new object using the given constructor function. + * * {@link auto.$provide#decorator decorator(name, decorFn)} - registers a **decorator function** that + * will be able to modify or replace the implementation of another service. + * + * See the individual methods for more information and examples. + */ + +/** + * @ngdoc method + * @name $provide#provider + * @description + * + * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions + * are constructor functions, whose instances are responsible for "providing" a factory for a + * service. + * + * Service provider names start with the name of the service they provide followed by `Provider`. + * For example, the {@link ng.$log $log} service has a provider called + * {@link ng.$logProvider $logProvider}. + * + * Service provider objects can have additional methods which allow configuration of the provider + * and its service. Importantly, you can configure what kind of service is created by the `$get` + * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a + * method {@link ng.$logProvider#debugEnabled debugEnabled} + * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the + * console or not. + * + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + + 'Provider'` key. + * @param {(Object|function())} provider If the provider is: + * + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using + * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. + * - `Constructor`: a new instance of the provider will be created using + * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. + * + * @returns {Object} registered provider instance + + * @example + * + * The following example shows how to create a simple event tracking service and register it using + * {@link auto.$provide#provider $provide.provider()}. + * + * ```js + * // Define the eventTracker provider + * function EventTrackerProvider() { + * var trackingUrl = '/track'; + * + * // A provider method for configuring where the tracked events should been saved + * this.setTrackingUrl = function(url) { + * trackingUrl = url; + * }; + * + * // The service factory function + * this.$get = ['$http', function($http) { + * var trackedEvents = {}; + * return { + * // Call this to track an event + * event: function(event) { + * var count = trackedEvents[event] || 0; + * count += 1; + * trackedEvents[event] = count; + * return count; + * }, + * // Call this to save the tracked events to the trackingUrl + * save: function() { + * $http.post(trackingUrl, trackedEvents); + * } + * }; + * }]; + * } + * + * describe('eventTracker', function() { + * var postSpy; + * + * beforeEach(module(function($provide) { + * // Register the eventTracker provider + * $provide.provider('eventTracker', EventTrackerProvider); + * })); + * + * beforeEach(module(function(eventTrackerProvider) { + * // Configure eventTracker provider + * eventTrackerProvider.setTrackingUrl('/custom-track'); + * })); + * + * it('tracks events', inject(function(eventTracker) { + * expect(eventTracker.event('login')).toEqual(1); + * expect(eventTracker.event('login')).toEqual(2); + * })); + * + * it('saves to the tracking url', inject(function(eventTracker, $http) { + * postSpy = spyOn($http, 'post'); + * eventTracker.event('login'); + * eventTracker.save(); + * expect(postSpy).toHaveBeenCalled(); + * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); + * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); + * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); + * })); + * }); + * ``` + */ + +/** + * @ngdoc method + * @name $provide#factory + * @description + * + * Register a **service factory**, which will be called to return the service instance. + * This is short for registering a service where its provider consists of only a `$get` property, + * which is the given service factory function. + * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to + * configure your service in a provider. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} $getFn The injectable $getFn for the instance creation. + * Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service + * ```js + * $provide.factory('ping', ['$http', function($http) { + * return function ping() { + * return $http.send('/ping'); + * }; + * }]); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#service + * @description + * + * Register a **service constructor**, which will be invoked with `new` to create the service + * instance. + * This is short for registering a service where its provider's `$get` property is a factory + * function that returns an instance instantiated by the injector from the service constructor + * function. + * + * Internally it looks a bit like this: + * + * ``` + * { + * $get: function() { + * return $injector.instantiate(constructor); + * } + * } + * ``` + * + * + * You should use {@link auto.$provide#service $provide.service(class)} if you define your service + * as a type/class. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} constructor An injectable class (constructor function) + * that will be instantiated. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service using + * {@link auto.$provide#service $provide.service(class)}. + * ```js + * var Ping = function($http) { + * this.$http = $http; + * }; + * + * Ping.$inject = ['$http']; + * + * Ping.prototype.send = function() { + * return this.$http.get('/ping'); + * }; + * $provide.service('ping', Ping); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping.send(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#value + * @description + * + * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a + * number, an array, an object or a function. This is short for registering a service where its + * provider's `$get` property is a factory function that takes no arguments and returns the **value + * service**. That also means it is not possible to inject other services into a value service. + * + * Value services are similar to constant services, except that they cannot be injected into a + * module configuration function (see {@link angular.Module#config}) but they can be overridden by + * an Angular {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the instance. + * @param {*} value The value. + * @returns {Object} registered provider instance + * + * @example + * Here are some examples of creating value services. + * ```js + * $provide.value('ADMIN_USER', 'admin'); + * + * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); + * + * $provide.value('halfOf', function(value) { + * return value / 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#constant + * @description + * + * Register a **constant service** with the {@link auto.$injector $injector}, such as a string, + * a number, an array, an object or a function. Like the {@link auto.$provide#value value}, it is not + * possible to inject other services into a constant. + * + * But unlike {@link auto.$provide#value value}, a constant can be + * injected into a module configuration function (see {@link angular.Module#config}) and it cannot + * be overridden by an Angular {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + * + * @example + * Here a some examples of creating constants: + * ```js + * $provide.constant('SHARD_HEIGHT', 306); + * + * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); + * + * $provide.constant('double', function(value) { + * return value * 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#decorator + * @description + * + * Register a **decorator function** with the {@link auto.$injector $injector}. A decorator function + * intercepts the creation of a service, allowing it to override or modify the behavior of the + * service. The return value of the decorator function may be the original service, or a new service + * that replaces (or wraps and delegates to) the original service. + * + * You can find out more about using decorators in the {@link guide/decorators} guide. + * + * @param {string} name The name of the service to decorate. + * @param {Function|Array.} decorator This function will be invoked when the service needs to be + * provided and should return the decorated service instance. The function is called using + * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. + * Local injection arguments: + * + * * `$delegate` - The original service instance, which can be replaced, monkey patched, configured, + * decorated or delegated to. + * + * @example + * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting + * calls to {@link ng.$log#error $log.warn()}. + * ```js + * $provide.decorator('$log', ['$delegate', function($delegate) { + * $delegate.warn = $delegate.error; + * return $delegate; + * }]); + * ``` + */ + + +function createInjector(modulesToLoad, strictDi) { + strictDi = (strictDi === true); + var INSTANTIATING = {}, + providerSuffix = 'Provider', + path = [], + loadedModules = new HashMap([], true), + providerCache = { + $provide: { + provider: supportObject(provider), + factory: supportObject(factory), + service: supportObject(service), + value: supportObject(value), + constant: supportObject(constant), + decorator: decorator + } + }, + providerInjector = (providerCache.$injector = + createInternalInjector(providerCache, function(serviceName, caller) { + if (angular.isString(caller)) { + path.push(caller); + } + throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); + })), + instanceCache = {}, + protoInstanceInjector = + createInternalInjector(instanceCache, function(serviceName, caller) { + var provider = providerInjector.get(serviceName + providerSuffix, caller); + return instanceInjector.invoke( + provider.$get, provider, undefined, serviceName); + }), + instanceInjector = protoInstanceInjector; + + providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) }; + var runBlocks = loadModules(modulesToLoad); + instanceInjector = protoInstanceInjector.get('$injector'); + instanceInjector.strictDi = strictDi; + forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); }); + + return instanceInjector; + + //////////////////////////////////// + // $provider + //////////////////////////////////// + + function supportObject(delegate) { + return function(key, value) { + if (isObject(key)) { + forEach(key, reverseParams(delegate)); + } else { + return delegate(key, value); + } + }; + } + + function provider(name, provider_) { + assertNotHasOwnProperty(name, 'service'); + if (isFunction(provider_) || isArray(provider_)) { + provider_ = providerInjector.instantiate(provider_); + } + if (!provider_.$get) { + throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); + } + return providerCache[name + providerSuffix] = provider_; + } + + function enforceReturnValue(name, factory) { + return function enforcedReturnValue() { + var result = instanceInjector.invoke(factory, this); + if (isUndefined(result)) { + throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); + } + return result; + }; + } + + function factory(name, factoryFn, enforce) { + return provider(name, { + $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn + }); + } + + function service(name, constructor) { + return factory(name, ['$injector', function($injector) { + return $injector.instantiate(constructor); + }]); + } + + function value(name, val) { return factory(name, valueFn(val), false); } + + function constant(name, value) { + assertNotHasOwnProperty(name, 'constant'); + providerCache[name] = value; + instanceCache[name] = value; + } + + function decorator(serviceName, decorFn) { + var origProvider = providerInjector.get(serviceName + providerSuffix), + orig$get = origProvider.$get; + + origProvider.$get = function() { + var origInstance = instanceInjector.invoke(orig$get, origProvider); + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); + }; + } + + //////////////////////////////////// + // Module Loading + //////////////////////////////////// + function loadModules(modulesToLoad) { + assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array'); + var runBlocks = [], moduleFn; + forEach(modulesToLoad, function(module) { + if (loadedModules.get(module)) return; + loadedModules.put(module, true); + + function runInvokeQueue(queue) { + var i, ii; + for (i = 0, ii = queue.length; i < ii; i++) { + var invokeArgs = queue[i], + provider = providerInjector.get(invokeArgs[0]); + + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + } + } + + try { + if (isString(module)) { + moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + runInvokeQueue(moduleFn._invokeQueue); + runInvokeQueue(moduleFn._configBlocks); + } else if (isFunction(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else if (isArray(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else { + assertArgFn(module, 'module'); + } + } catch (e) { + if (isArray(module)) { + module = module[module.length - 1]; + } + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { + // Safari & FF's stack traces don't contain error.message content + // unlike those of Chrome and IE + // So if stack doesn't contain message, we create a new string that contains both. + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. + /* jshint -W022 */ + e = e.message + '\n' + e.stack; + } + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", + module, e.stack || e.message || e); + } + }); + return runBlocks; + } + + //////////////////////////////////// + // internal Injector + //////////////////////////////////// + + function createInternalInjector(cache, factory) { + + function getService(serviceName, caller) { + if (cache.hasOwnProperty(serviceName)) { + if (cache[serviceName] === INSTANTIATING) { + throw $injectorMinErr('cdep', 'Circular dependency found: {0}', + serviceName + ' <- ' + path.join(' <- ')); + } + return cache[serviceName]; + } else { + try { + path.unshift(serviceName); + cache[serviceName] = INSTANTIATING; + return cache[serviceName] = factory(serviceName, caller); + } catch (err) { + if (cache[serviceName] === INSTANTIATING) { + delete cache[serviceName]; + } + throw err; + } finally { + path.shift(); + } + } + } + + + function injectionArgs(fn, locals, serviceName) { + var args = [], + $inject = createInjector.$$annotate(fn, strictDi, serviceName); + + for (var i = 0, length = $inject.length; i < length; i++) { + var key = $inject[i]; + if (typeof key !== 'string') { + throw $injectorMinErr('itkn', + 'Incorrect injection token! Expected service name as string, got {0}', key); + } + args.push(locals && locals.hasOwnProperty(key) ? locals[key] : + getService(key, serviceName)); + } + return args; + } + + function isClass(func) { + // IE 9-11 do not support classes and IE9 leaks with the code below. + if (msie <= 11) { + return false; + } + // Support: Edge 12-13 only + // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/6156135/ + return typeof func === 'function' + && /^(?:class\b|constructor\()/.test(stringifyFn(func)); + } + + function invoke(fn, self, locals, serviceName) { + if (typeof locals === 'string') { + serviceName = locals; + locals = null; + } + + var args = injectionArgs(fn, locals, serviceName); + if (isArray(fn)) { + fn = fn[fn.length - 1]; + } + + if (!isClass(fn)) { + // http://jsperf.com/angularjs-invoke-apply-vs-switch + // #5388 + return fn.apply(self, args); + } else { + args.unshift(null); + return new (Function.prototype.bind.apply(fn, args))(); + } + } + + + function instantiate(Type, locals, serviceName) { + // Check if Type is annotated and use just the given function at n-1 as parameter + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); + var ctor = (isArray(Type) ? Type[Type.length - 1] : Type); + var args = injectionArgs(Type, locals, serviceName); + // Empty object at position 0 is ignored for invocation with `new`, but required. + args.unshift(null); + return new (Function.prototype.bind.apply(ctor, args))(); + } + + + return { + invoke: invoke, + instantiate: instantiate, + get: getService, + annotate: createInjector.$$annotate, + has: function(name) { + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); + } + }; + } +} + +createInjector.$$annotate = annotate; + +/** + * @ngdoc provider + * @name $anchorScrollProvider + * + * @description + * Use `$anchorScrollProvider` to disable automatic scrolling whenever + * {@link ng.$location#hash $location.hash()} changes. + */ +function $AnchorScrollProvider() { + + var autoScrollingEnabled = true; + + /** + * @ngdoc method + * @name $anchorScrollProvider#disableAutoScrolling + * + * @description + * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to + * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
+ * Use this method to disable automatic scrolling. + * + * If automatic scrolling is disabled, one must explicitly call + * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the + * current hash. + */ + this.disableAutoScrolling = function() { + autoScrollingEnabled = false; + }; + + /** + * @ngdoc service + * @name $anchorScroll + * @kind function + * @requires $window + * @requires $location + * @requires $rootScope + * + * @description + * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the + * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified + * in the + * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#an-indicated-part-of-the-document). + * + * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to + * match any anchor whenever it changes. This can be disabled by calling + * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. + * + * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a + * vertical scroll-offset (either fixed or dynamic). + * + * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of + * {@link ng.$location#hash $location.hash()} will be used. + * + * @property {(number|function|jqLite)} yOffset + * If set, specifies a vertical scroll-offset. This is often useful when there are fixed + * positioned elements at the top of the page, such as navbars, headers etc. + * + * `yOffset` can be specified in various ways: + * - **number**: A fixed number of pixels to be used as offset.

+ * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return + * a number representing the offset (in pixels).

+ * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from + * the top of the page to the element's bottom will be used as offset.
+ * **Note**: The element will be taken into account only as long as its `position` is set to + * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust + * their height and/or positioning according to the viewport's size. + * + *
+ *
+ * In order for `yOffset` to work properly, scrolling should take place on the document's root and + * not some child element. + *
+ * + * @example + + +
+ Go to bottom + You're at the bottom! +
+ + + angular.module('anchorScrollExample', []) + .controller('ScrollController', ['$scope', '$location', '$anchorScroll', + function ($scope, $location, $anchorScroll) { + $scope.gotoBottom = function() { + // set the location.hash to the id of + // the element you wish to scroll to. + $location.hash('bottom'); + + // call $anchorScroll() + $anchorScroll(); + }; + }]); + + + #scrollArea { + height: 280px; + overflow: auto; + } + + #bottom { + display: block; + margin-top: 2000px; + } + + + * + *
+ * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). + * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. + * + * @example + + + +
+ Anchor {{x}} of 5 +
+
+ + angular.module('anchorScrollOffsetExample', []) + .run(['$anchorScroll', function($anchorScroll) { + $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels + }]) + .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', + function ($anchorScroll, $location, $scope) { + $scope.gotoAnchor = function(x) { + var newHash = 'anchor' + x; + if ($location.hash() !== newHash) { + // set the $location.hash to `newHash` and + // $anchorScroll will automatically scroll to it + $location.hash('anchor' + x); + } else { + // call $anchorScroll() explicitly, + // since $location.hash hasn't changed + $anchorScroll(); + } + }; + } + ]); + + + body { + padding-top: 50px; + } + + .anchor { + border: 2px dashed DarkOrchid; + padding: 10px 10px 200px 10px; + } + + .fixed-header { + background-color: rgba(0, 0, 0, 0.2); + height: 50px; + position: fixed; + top: 0; left: 0; right: 0; + } + + .fixed-header > a { + display: inline-block; + margin: 5px 15px; + } + +
+ */ + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { + var document = $window.document; + + // Helper function to get first anchor from a NodeList + // (using `Array#some()` instead of `angular#forEach()` since it's more performant + // and working in all supported browsers.) + function getFirstAnchor(list) { + var result = null; + Array.prototype.some.call(list, function(element) { + if (nodeName_(element) === 'a') { + result = element; + return true; + } + }); + return result; + } + + function getYOffset() { + + var offset = scroll.yOffset; + + if (isFunction(offset)) { + offset = offset(); + } else if (isElement(offset)) { + var elem = offset[0]; + var style = $window.getComputedStyle(elem); + if (style.position !== 'fixed') { + offset = 0; + } else { + offset = elem.getBoundingClientRect().bottom; + } + } else if (!isNumber(offset)) { + offset = 0; + } + + return offset; + } + + function scrollTo(elem) { + if (elem) { + elem.scrollIntoView(); + + var offset = getYOffset(); + + if (offset) { + // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. + // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the + // top of the viewport. + // + // IF the number of pixels from the top of `elem` to the end of the page's content is less + // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some + // way down the page. + // + // This is often the case for elements near the bottom of the page. + // + // In such cases we do not need to scroll the whole `offset` up, just the difference between + // the top of the element and the offset, which is enough to align the top of `elem` at the + // desired position. + var elemTop = elem.getBoundingClientRect().top; + $window.scrollBy(0, elemTop - offset); + } + } else { + $window.scrollTo(0, 0); + } + } + + function scroll(hash) { + hash = isString(hash) ? hash : $location.hash(); + var elm; + + // empty hash, scroll to the top of the page + if (!hash) scrollTo(null); + + // element with given id + else if ((elm = document.getElementById(hash))) scrollTo(elm); + + // first anchor with given name :-D + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); + + // no element and hash == 'top', scroll to the top of the page + else if (hash === 'top') scrollTo(null); + } + + // does not scroll when user clicks on anchor link that is currently on + // (no url change, no $location.hash() change), browser native does scroll + if (autoScrollingEnabled) { + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, + function autoScrollWatchAction(newVal, oldVal) { + // skip the initial scroll if $location.hash is empty + if (newVal === oldVal && newVal === '') return; + + jqLiteDocumentLoaded(function() { + $rootScope.$evalAsync(scroll); + }); + }); + } + + return scroll; + }]; +} + +var $animateMinErr = minErr('$animate'); +var ELEMENT_NODE = 1; +var NG_ANIMATE_CLASSNAME = 'ng-animate'; + +function mergeClasses(a,b) { + if (!a && !b) return ''; + if (!a) return b; + if (!b) return a; + if (isArray(a)) a = a.join(' '); + if (isArray(b)) b = b.join(' '); + return a + ' ' + b; +} + +function extractElementNode(element) { + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType === ELEMENT_NODE) { + return elm; + } + } +} + +function splitClasses(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + // Use createMap() to prevent class assumptions involving property names in + // Object.prototype + var obj = createMap(); + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; +} + +// if any other type of options value besides an Object value is +// passed into the $animate.method() animation then this helper code +// will be run which will ignore it. While this patch is not the +// greatest solution to this, a lot of existing plugins depend on +// $animate to either call the callback (< 1.2) or return a promise +// that can be changed. This helper function ensures that the options +// are wiped clean incase a callback function is provided. +function prepareAnimateOptions(options) { + return isObject(options) + ? options + : {}; +} + +var $$CoreAnimateJsProvider = function() { + this.$get = noop; +}; + +// this is prefixed with Core since it conflicts with +// the animateQueueProvider defined in ngAnimate/animateQueue.js +var $$CoreAnimateQueueProvider = function() { + var postDigestQueue = new HashMap(); + var postDigestElements = []; + + this.$get = ['$$AnimateRunner', '$rootScope', + function($$AnimateRunner, $rootScope) { + return { + enabled: noop, + on: noop, + off: noop, + pin: noop, + + push: function(element, event, options, domOperation) { + domOperation && domOperation(); + + options = options || {}; + options.from && element.css(options.from); + options.to && element.css(options.to); + + if (options.addClass || options.removeClass) { + addRemoveClassesPostDigest(element, options.addClass, options.removeClass); + } + + var runner = new $$AnimateRunner(); // jshint ignore:line + + // since there are no animations to run the runner needs to be + // notified that the animation call is complete. + runner.complete(); + return runner; + } + }; + + + function updateData(data, classes, value) { + var changed = false; + if (classes) { + classes = isString(classes) ? classes.split(' ') : + isArray(classes) ? classes : []; + forEach(classes, function(className) { + if (className) { + changed = true; + data[className] = value; + } + }); + } + return changed; + } + + function handleCSSClassChanges() { + forEach(postDigestElements, function(element) { + var data = postDigestQueue.get(element); + if (data) { + var existing = splitClasses(element.attr('class')); + var toAdd = ''; + var toRemove = ''; + forEach(data, function(status, className) { + var hasClass = !!existing[className]; + if (status !== hasClass) { + if (status) { + toAdd += (toAdd.length ? ' ' : '') + className; + } else { + toRemove += (toRemove.length ? ' ' : '') + className; + } + } + }); + + forEach(element, function(elm) { + toAdd && jqLiteAddClass(elm, toAdd); + toRemove && jqLiteRemoveClass(elm, toRemove); + }); + postDigestQueue.remove(element); + } + }); + postDigestElements.length = 0; + } + + + function addRemoveClassesPostDigest(element, add, remove) { + var data = postDigestQueue.get(element) || {}; + + var classesAdded = updateData(data, add, true); + var classesRemoved = updateData(data, remove, false); + + if (classesAdded || classesRemoved) { + + postDigestQueue.put(element, data); + postDigestElements.push(element); + + if (postDigestElements.length === 1) { + $rootScope.$$postDigest(handleCSSClassChanges); + } + } + } + }]; +}; + +/** + * @ngdoc provider + * @name $animateProvider + * + * @description + * Default implementation of $animate that doesn't perform any animations, instead just + * synchronously performs DOM updates and resolves the returned runner promise. + * + * In order to enable animations the `ngAnimate` module has to be loaded. + * + * To see the functional implementation check out `src/ngAnimate/animate.js`. + */ +var $AnimateProvider = ['$provide', function($provide) { + var provider = this; + + this.$$registeredAnimations = Object.create(null); + + /** + * @ngdoc method + * @name $animateProvider#register + * + * @description + * Registers a new injectable animation factory function. The factory function produces the + * animation object which contains callback functions for each event that is expected to be + * animated. + * + * * `eventFn`: `function(element, ... , doneFunction, options)` + * The element to animate, the `doneFunction` and the options fed into the animation. Depending + * on the type of animation additional arguments will be injected into the animation function. The + * list below explains the function signatures for the different animation methods: + * + * - setClass: function(element, addedClasses, removedClasses, doneFunction, options) + * - addClass: function(element, addedClasses, doneFunction, options) + * - removeClass: function(element, removedClasses, doneFunction, options) + * - enter, leave, move: function(element, doneFunction, options) + * - animate: function(element, fromStyles, toStyles, doneFunction, options) + * + * Make sure to trigger the `doneFunction` once the animation is fully complete. + * + * ```js + * return { + * //enter, leave, move signature + * eventFn : function(element, done, options) { + * //code to run the animation + * //once complete, then run done() + * return function endFunction(wasCancelled) { + * //code to cancel the animation + * } + * } + * } + * ``` + * + * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to). + * @param {Function} factory The factory function that will be executed to return the animation + * object. + */ + this.register = function(name, factory) { + if (name && name.charAt(0) !== '.') { + throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); + } + + var key = name + '-animation'; + provider.$$registeredAnimations[name.substr(1)] = key; + $provide.factory(key, factory); + }; + + /** + * @ngdoc method + * @name $animateProvider#classNameFilter + * + * @description + * Sets and/or returns the CSS class regular expression that is checked when performing + * an animation. Upon bootstrap the classNameFilter value is not set at all and will + * therefore enable $animate to attempt to perform an animation on any element that is triggered. + * When setting the `classNameFilter` value, animations will only be performed on elements + * that successfully match the filter expression. This in turn can boost performance + * for low-powered devices as well as applications containing a lot of structural operations. + * @param {RegExp=} expression The className expression which will be checked against all animations + * @return {RegExp} The current CSS className expression value. If null then there is no expression value + */ + this.classNameFilter = function(expression) { + if (arguments.length === 1) { + this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; + if (this.$$classNameFilter) { + var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); + if (reservedRegex.test(this.$$classNameFilter.toString())) { + throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); + + } + } + } + return this.$$classNameFilter; + }; + + this.$get = ['$$animateQueue', function($$animateQueue) { + function domInsert(element, parentElement, afterElement) { + // if for some reason the previous element was removed + // from the dom sometime before this code runs then let's + // just stick to using the parent element as the anchor + if (afterElement) { + var afterNode = extractElementNode(afterElement); + if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { + afterElement = null; + } + } + afterElement ? afterElement.after(element) : parentElement.prepend(element); + } + + /** + * @ngdoc service + * @name $animate + * @description The $animate service exposes a series of DOM utility methods that provide support + * for animation hooks. The default behavior is the application of DOM operations, however, + * when an animation is detected (and animations are enabled), $animate will do the heavy lifting + * to ensure that animation runs with the triggered DOM operation. + * + * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't + * included and only when it is active then the animation hooks that `$animate` triggers will be + * functional. Once active then all structural `ng-` directives will trigger animations as they perform + * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, + * `ngShow`, `ngHide` and `ngMessages` also provide support for animations. + * + * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives. + * + * To learn more about enabling animation support, click here to visit the + * {@link ngAnimate ngAnimate module page}. + */ + return { + // we don't call it directly since non-existant arguments may + // be interpreted as null within the sub enabled function + + /** + * + * @ngdoc method + * @name $animate#on + * @kind function + * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...) + * has fired on the given element or among any of its children. Once the listener is fired, the provided callback + * is fired with the following params: + * + * ```js + * $animate.on('enter', container, + * function callback(element, phase) { + * // cool we detected an enter animation within the container + * } + * ); + * ``` + * + * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself + * as well as among its children + * @param {Function} callback the callback function that will be fired when the listener is triggered + * + * The arguments present in the callback function are: + * * `element` - The captured DOM element that the animation was fired on. + * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends). + */ + on: $$animateQueue.on, + + /** + * + * @ngdoc method + * @name $animate#off + * @kind function + * @description Deregisters an event listener based on the event which has been associated with the provided element. This method + * can be used in three different ways depending on the arguments: + * + * ```js + * // remove all the animation event listeners listening for `enter` + * $animate.off('enter'); + * + * // remove listeners for all animation events from the container element + * $animate.off(container); + * + * // remove all the animation event listeners listening for `enter` on the given element and its children + * $animate.off('enter', container); + * + * // remove the event listener function provided by `callback` that is set + * // to listen for `enter` on the given `container` as well as its children + * $animate.off('enter', container, callback); + * ``` + * + * @param {string|DOMElement} event|container the animation event (e.g. enter, leave, move, + * addClass, removeClass, etc...), or the container element. If it is the element, all other + * arguments are ignored. + * @param {DOMElement=} container the container element the event listener was placed on + * @param {Function=} callback the callback function that was registered as the listener + */ + off: $$animateQueue.off, + + /** + * @ngdoc method + * @name $animate#pin + * @kind function + * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists + * outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the + * element despite being outside the realm of the application or within another application. Say for example if the application + * was bootstrapped on an element that is somewhere inside of the `` tag, but we wanted to allow for an element to be situated + * as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind + * that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association. + * + * Note that this feature is only active when the `ngAnimate` module is used. + * + * @param {DOMElement} element the external element that will be pinned + * @param {DOMElement} parentElement the host parent element that will be associated with the external element + */ + pin: $$animateQueue.pin, + + /** + * + * @ngdoc method + * @name $animate#enabled + * @kind function + * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This + * function can be called in four ways: + * + * ```js + * // returns true or false + * $animate.enabled(); + * + * // changes the enabled state for all animations + * $animate.enabled(false); + * $animate.enabled(true); + * + * // returns true or false if animations are enabled for an element + * $animate.enabled(element); + * + * // changes the enabled state for an element and its children + * $animate.enabled(element, true); + * $animate.enabled(element, false); + * ``` + * + * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state + * @param {boolean=} enabled whether or not the animations will be enabled for the element + * + * @return {boolean} whether or not animations are enabled + */ + enabled: $$animateQueue.enabled, + + /** + * @ngdoc method + * @name $animate#cancel + * @kind function + * @description Cancels the provided animation. + * + * @param {Promise} animationPromise The animation promise that is returned when an animation is started. + */ + cancel: function(runner) { + runner.end && runner.end(); + }, + + /** + * + * @ngdoc method + * @name $animate#enter + * @kind function + * @description Inserts the element into the DOM either after the `after` element (if provided) or + * as the first child within the `parent` element and then triggers an animation. + * A promise is returned that will be resolved during the next digest once the animation + * has completed. + * + * @param {DOMElement} element the element which will be inserted into the DOM + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element. + * The object can have the following properties: + * + * - **addClass** - `{string}` - space-separated CSS classes to add to element + * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` + * - **removeClass** - `{string}` - space-separated CSS classes to remove from element + * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` + * + * @return {Promise} the animation callback promise + */ + enter: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options)); + }, + + /** + * + * @ngdoc method + * @name $animate#move + * @kind function + * @description Inserts (moves) the element into its new position in the DOM either after + * the `after` element (if provided) or as the first child within the `parent` element + * and then triggers an animation. A promise is returned that will be resolved + * during the next digest once the animation has completed. + * + * @param {DOMElement} element the element which will be moved into the new DOM position + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element. + * The object can have the following properties: + * + * - **addClass** - `{string}` - space-separated CSS classes to add to element + * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` + * - **removeClass** - `{string}` - space-separated CSS classes to remove from element + * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` + * + * @return {Promise} the animation callback promise + */ + move: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'move', prepareAnimateOptions(options)); + }, + + /** + * @ngdoc method + * @name $animate#leave + * @kind function + * @description Triggers an animation and then removes the element from the DOM. + * When the function is called a promise is returned that will be resolved during the next + * digest once the animation has completed. + * + * @param {DOMElement} element the element which will be removed from the DOM + * @param {object=} options an optional collection of options/styles that will be applied to the element. + * The object can have the following properties: + * + * - **addClass** - `{string}` - space-separated CSS classes to add to element + * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` + * - **removeClass** - `{string}` - space-separated CSS classes to remove from element + * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` + * + * @return {Promise} the animation callback promise + */ + leave: function(element, options) { + return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() { + element.remove(); + }); + }, + + /** + * @ngdoc method + * @name $animate#addClass + * @kind function + * + * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon + * execution, the addClass operation will only be handled after the next digest and it will not trigger an + * animation if element already contains the CSS class or if the class is removed at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element. + * The object can have the following properties: + * + * - **addClass** - `{string}` - space-separated CSS classes to add to element + * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` + * - **removeClass** - `{string}` - space-separated CSS classes to remove from element + * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` + * + * @return {Promise} the animation callback promise + */ + addClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addclass, className); + return $$animateQueue.push(element, 'addClass', options); + }, + + /** + * @ngdoc method + * @name $animate#removeClass + * @kind function + * + * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon + * execution, the removeClass operation will only be handled after the next digest and it will not trigger an + * animation if element does not contain the CSS class or if the class is added at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element. + * The object can have the following properties: + * + * - **addClass** - `{string}` - space-separated CSS classes to add to element + * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` + * - **removeClass** - `{string}` - space-separated CSS classes to remove from element + * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` + * + * @return {Promise} the animation callback promise + */ + removeClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.removeClass = mergeClasses(options.removeClass, className); + return $$animateQueue.push(element, 'removeClass', options); + }, + + /** + * @ngdoc method + * @name $animate#setClass + * @kind function + * + * @description Performs both the addition and removal of a CSS classes on an element and (during the process) + * triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and + * `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has + * passed. Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element. + * The object can have the following properties: + * + * - **addClass** - `{string}` - space-separated CSS classes to add to element + * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` + * - **removeClass** - `{string}` - space-separated CSS classes to remove from element + * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` + * + * @return {Promise} the animation callback promise + */ + setClass: function(element, add, remove, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addClass, add); + options.removeClass = mergeClasses(options.removeClass, remove); + return $$animateQueue.push(element, 'setClass', options); + }, + + /** + * @ngdoc method + * @name $animate#animate + * @kind function + * + * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element. + * If any detected CSS transition, keyframe or JavaScript matches the provided className value, then the animation will take + * on the provided styles. For example, if a transition animation is set for the given classNamem, then the provided `from` and + * `to` styles will be applied alongside the given transition. If the CSS style provided in `from` does not have a corresponding + * style in `to`, the style in `from` is applied immediately, and no animation is run. + * If a JavaScript animation is detected then the provided styles will be given in as function parameters into the `animate` + * method (or as part of the `options` parameter): + * + * ```js + * ngModule.animation('.my-inline-animation', function() { + * return { + * animate : function(element, from, to, done, options) { + * //animation + * done(); + * } + * } + * }); + * ``` + * + * @param {DOMElement} element the element which the CSS styles will be applied to + * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation. + * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation. + * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If + * this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element. + * (Note that if no animation is detected then this value will not be applied to the element.) + * @param {object=} options an optional collection of options/styles that will be applied to the element. + * The object can have the following properties: + * + * - **addClass** - `{string}` - space-separated CSS classes to add to element + * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` + * - **removeClass** - `{string}` - space-separated CSS classes to remove from element + * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` + * + * @return {Promise} the animation callback promise + */ + animate: function(element, from, to, className, options) { + options = prepareAnimateOptions(options); + options.from = options.from ? extend(options.from, from) : from; + options.to = options.to ? extend(options.to, to) : to; + + className = className || 'ng-inline-animate'; + options.tempClasses = mergeClasses(options.tempClasses, className); + return $$animateQueue.push(element, 'animate', options); + } + }; + }]; +}]; + +var $$AnimateAsyncRunFactoryProvider = function() { + this.$get = ['$$rAF', function($$rAF) { + var waitQueue = []; + + function waitForTick(fn) { + waitQueue.push(fn); + if (waitQueue.length > 1) return; + $$rAF(function() { + for (var i = 0; i < waitQueue.length; i++) { + waitQueue[i](); + } + waitQueue = []; + }); + } + + return function() { + var passed = false; + waitForTick(function() { + passed = true; + }); + return function(callback) { + passed ? callback() : waitForTick(callback); + }; + }; + }]; +}; + +var $$AnimateRunnerFactoryProvider = function() { + this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$document', '$timeout', + function($q, $sniffer, $$animateAsyncRun, $document, $timeout) { + + var INITIAL_STATE = 0; + var DONE_PENDING_STATE = 1; + var DONE_COMPLETE_STATE = 2; + + AnimateRunner.chain = function(chain, callback) { + var index = 0; + + next(); + function next() { + if (index === chain.length) { + callback(true); + return; + } + + chain[index](function(response) { + if (response === false) { + callback(false); + return; + } + index++; + next(); + }); + } + }; + + AnimateRunner.all = function(runners, callback) { + var count = 0; + var status = true; + forEach(runners, function(runner) { + runner.done(onProgress); + }); + + function onProgress(response) { + status = status && response; + if (++count === runners.length) { + callback(status); + } + } + }; + + function AnimateRunner(host) { + this.setHost(host); + + var rafTick = $$animateAsyncRun(); + var timeoutTick = function(fn) { + $timeout(fn, 0, false); + }; + + this._doneCallbacks = []; + this._tick = function(fn) { + var doc = $document[0]; + + // the document may not be ready or attached + // to the module for some internal tests + if (doc && doc.hidden) { + timeoutTick(fn); + } else { + rafTick(fn); + } + }; + this._state = 0; + } + + AnimateRunner.prototype = { + setHost: function(host) { + this.host = host || {}; + }, + + done: function(fn) { + if (this._state === DONE_COMPLETE_STATE) { + fn(); + } else { + this._doneCallbacks.push(fn); + } + }, + + progress: noop, + + getPromise: function() { + if (!this.promise) { + var self = this; + this.promise = $q(function(resolve, reject) { + self.done(function(status) { + status === false ? reject() : resolve(); + }); + }); + } + return this.promise; + }, + + then: function(resolveHandler, rejectHandler) { + return this.getPromise().then(resolveHandler, rejectHandler); + }, + + 'catch': function(handler) { + return this.getPromise()['catch'](handler); + }, + + 'finally': function(handler) { + return this.getPromise()['finally'](handler); + }, + + pause: function() { + if (this.host.pause) { + this.host.pause(); + } + }, + + resume: function() { + if (this.host.resume) { + this.host.resume(); + } + }, + + end: function() { + if (this.host.end) { + this.host.end(); + } + this._resolve(true); + }, + + cancel: function() { + if (this.host.cancel) { + this.host.cancel(); + } + this._resolve(false); + }, + + complete: function(response) { + var self = this; + if (self._state === INITIAL_STATE) { + self._state = DONE_PENDING_STATE; + self._tick(function() { + self._resolve(response); + }); + } + }, + + _resolve: function(response) { + if (this._state !== DONE_COMPLETE_STATE) { + forEach(this._doneCallbacks, function(fn) { + fn(response); + }); + this._doneCallbacks.length = 0; + this._state = DONE_COMPLETE_STATE; + } + } + }; + + return AnimateRunner; + }]; +}; + +/** + * @ngdoc service + * @name $animateCss + * @kind object + * + * @description + * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included, + * then the `$animateCss` service will actually perform animations. + * + * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}. + */ +var $CoreAnimateCssProvider = function() { + this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) { + + return function(element, initialOptions) { + // all of the animation functions should create + // a copy of the options data, however, if a + // parent service has already created a copy then + // we should stick to using that + var options = initialOptions || {}; + if (!options.$$prepared) { + options = copy(options); + } + + // there is no point in applying the styles since + // there is no animation that goes on at all in + // this version of $animateCss. + if (options.cleanupStyles) { + options.from = options.to = null; + } + + if (options.from) { + element.css(options.from); + options.from = null; + } + + /* jshint newcap: false */ + var closed, runner = new $$AnimateRunner(); + return { + start: run, + end: run + }; + + function run() { + $$rAF(function() { + applyAnimationContents(); + if (!closed) { + runner.complete(); + } + closed = true; + }); + return runner; + } + + function applyAnimationContents() { + if (options.addClass) { + element.addClass(options.addClass); + options.addClass = null; + } + if (options.removeClass) { + element.removeClass(options.removeClass); + options.removeClass = null; + } + if (options.to) { + element.css(options.to); + options.to = null; + } + } + }; + }]; +}; + +/* global stripHash: true */ + +/** + * ! This is a private undocumented service ! + * + * @name $browser + * @requires $log + * @description + * This object has two goals: + * + * - hide all the global state in the browser caused by the window object + * - abstract away all the browser specific features and inconsistencies + * + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` + * service, which can be used for convenient testing of the application without the interaction with + * the real browser apis. + */ +/** + * @param {object} window The global window object. + * @param {object} document jQuery wrapped document. + * @param {object} $log window.console or an object with the same interface. + * @param {object} $sniffer $sniffer service + */ +function Browser(window, document, $log, $sniffer) { + var self = this, + location = window.location, + history = window.history, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + pendingDeferIds = {}; + + self.isMock = false; + + var outstandingRequestCount = 0; + var outstandingRequestCallbacks = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = completeOutstandingRequest; + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; + + /** + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. + */ + function completeOutstandingRequest(fn) { + try { + fn.apply(null, sliceArgs(arguments, 1)); + } finally { + outstandingRequestCount--; + if (outstandingRequestCount === 0) { + while (outstandingRequestCallbacks.length) { + try { + outstandingRequestCallbacks.pop()(); + } catch (e) { + $log.error(e); + } + } + } + } + } + + function getHash(url) { + var index = url.indexOf('#'); + return index === -1 ? '' : url.substr(index); + } + + /** + * @private + * Note: this method is used only by scenario runner + * TODO(vojta): prefix this method with $$ ? + * @param {function()} callback Function that will be called when no outstanding request + */ + self.notifyWhenNoOutstandingRequests = function(callback) { + if (outstandingRequestCount === 0) { + callback(); + } else { + outstandingRequestCallbacks.push(callback); + } + }; + + ////////////////////////////////////////////////////////////// + // URL API + ////////////////////////////////////////////////////////////// + + var cachedState, lastHistoryState, + lastBrowserUrl = location.href, + baseElement = document.find('base'), + pendingLocation = null, + getCurrentState = !$sniffer.history ? noop : function getCurrentState() { + try { + return history.state; + } catch (e) { + // MSIE can reportedly throw when there is no state (UNCONFIRMED). + } + }; + + cacheState(); + lastHistoryState = cachedState; + + /** + * @name $browser#url + * + * @description + * GETTER: + * Without any argument, this method just returns current value of location.href. + * + * SETTER: + * With at least one argument, this method sets url to new value. + * If html5 history api supported, pushState/replaceState is used, otherwise + * location.href/location.replace is used. + * Returns its own instance to allow chaining + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to change url. + * + * @param {string} url New url (when used as setter) + * @param {boolean=} replace Should new url replace current history record? + * @param {object=} state object to use with pushState/replaceState + */ + self.url = function(url, replace, state) { + // In modern browsers `history.state` is `null` by default; treating it separately + // from `undefined` would cause `$browser.url('/foo')` to change `history.state` + // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. + if (isUndefined(state)) { + state = null; + } + + // Android Browser BFCache causes location, history reference to become stale. + if (location !== window.location) location = window.location; + if (history !== window.history) history = window.history; + + // setter + if (url) { + var sameState = lastHistoryState === state; + + // Don't change anything if previous and current URLs and states match. This also prevents + // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. + // See https://github.com/angular/angular.js/commit/ffb2701 + if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { + return self; + } + var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); + lastBrowserUrl = url; + lastHistoryState = state; + // Don't use history API if only the hash changed + // due to a bug in IE10/IE11 which leads + // to not firing a `hashchange` nor `popstate` event + // in some cases (see #9143). + if ($sniffer.history && (!sameBase || !sameState)) { + history[replace ? 'replaceState' : 'pushState'](state, '', url); + cacheState(); + // Do the assignment again so that those two variables are referentially identical. + lastHistoryState = cachedState; + } else { + if (!sameBase) { + pendingLocation = url; + } + if (replace) { + location.replace(url); + } else if (!sameBase) { + location.href = url; + } else { + location.hash = getHash(url); + } + if (location.href !== url) { + pendingLocation = url; + } + } + if (pendingLocation) { + pendingLocation = url; + } + return self; + // getter + } else { + // - pendingLocation is needed as browsers don't allow to read out + // the new location.href if a reload happened or if there is a bug like in iOS 9 (see + // https://openradar.appspot.com/22186109). + // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 + return pendingLocation || location.href.replace(/%27/g,"'"); + } + }; + + /** + * @name $browser#state + * + * @description + * This method is a getter. + * + * Return history.state or null if history.state is undefined. + * + * @returns {object} state + */ + self.state = function() { + return cachedState; + }; + + var urlChangeListeners = [], + urlChangeInit = false; + + function cacheStateAndFireUrlChange() { + pendingLocation = null; + cacheState(); + fireUrlChange(); + } + + // This variable should be used *only* inside the cacheState function. + var lastCachedState = null; + function cacheState() { + // This should be the only place in $browser where `history.state` is read. + cachedState = getCurrentState(); + cachedState = isUndefined(cachedState) ? null : cachedState; + + // Prevent callbacks fo fire twice if both hashchange & popstate were fired. + if (equals(cachedState, lastCachedState)) { + cachedState = lastCachedState; + } + lastCachedState = cachedState; + } + + function fireUrlChange() { + if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { + return; + } + + lastBrowserUrl = self.url(); + lastHistoryState = cachedState; + forEach(urlChangeListeners, function(listener) { + listener(self.url(), cachedState); + }); + } + + /** + * @name $browser#onUrlChange + * + * @description + * Register callback function that will be called, when url changes. + * + * It's only called when the url is changed from outside of angular: + * - user types different url into address bar + * - user clicks on history (forward/back) button + * - user clicks on a link + * + * It's not called when url is changed by $browser.url() method + * + * The listener gets called with new url as parameter. + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to monitor url changes in angular apps. + * + * @param {function(string)} listener Listener function to be called when url changes. + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. + */ + self.onUrlChange = function(callback) { + // TODO(vojta): refactor to use node's syntax for events + if (!urlChangeInit) { + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) + // don't fire popstate when user change the address bar and don't fire hashchange when url + // changed by push/replaceState + + // html5 history api - popstate event + if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); + // hashchange event + jqLite(window).on('hashchange', cacheStateAndFireUrlChange); + + urlChangeInit = true; + } + + urlChangeListeners.push(callback); + return callback; + }; + + /** + * @private + * Remove popstate and hashchange handler from window. + * + * NOTE: this api is intended for use only by $rootScope. + */ + self.$$applicationDestroyed = function() { + jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange); + }; + + /** + * Checks whether the url has changed outside of Angular. + * Needs to be exported to be able to check for changes that have been done in sync, + * as hashchange/popstate events fire in async. + */ + self.$$checkUrlChange = fireUrlChange; + + ////////////////////////////////////////////////////////////// + // Misc API + ////////////////////////////////////////////////////////////// + + /** + * @name $browser#baseHref + * + * @description + * Returns current + * (always relative - without domain) + * + * @returns {string} The current base href + */ + self.baseHref = function() { + var href = baseElement.attr('href'); + return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; + }; + + /** + * @name $browser#defer + * @param {function()} fn A function, who's execution should be deferred. + * @param {number=} [delay=0] of milliseconds to defer the function execution. + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. + * + * @description + * Executes a fn asynchronously via `setTimeout(fn, delay)`. + * + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed + * via `$browser.defer.flush()`. + * + */ + self.defer = function(fn, delay) { + var timeoutId; + outstandingRequestCount++; + timeoutId = setTimeout(function() { + delete pendingDeferIds[timeoutId]; + completeOutstandingRequest(fn); + }, delay || 0); + pendingDeferIds[timeoutId] = true; + return timeoutId; + }; + + + /** + * @name $browser#defer.cancel + * + * @description + * Cancels a deferred task identified with `deferId`. + * + * @param {*} deferId Token returned by the `$browser.defer` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + self.defer.cancel = function(deferId) { + if (pendingDeferIds[deferId]) { + delete pendingDeferIds[deferId]; + clearTimeout(deferId); + completeOutstandingRequest(noop); + return true; + } + return false; + }; + +} + +function $BrowserProvider() { + this.$get = ['$window', '$log', '$sniffer', '$document', + function($window, $log, $sniffer, $document) { + return new Browser($window, $document, $log, $sniffer); + }]; +} + +/** + * @ngdoc service + * @name $cacheFactory + * + * @description + * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to + * them. + * + * ```js + * + * var cache = $cacheFactory('cacheId'); + * expect($cacheFactory.get('cacheId')).toBe(cache); + * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); + * + * cache.put("key", "value"); + * cache.put("another key", "another value"); + * + * // We've specified no options on creation + * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); + * + * ``` + * + * + * @param {string} cacheId Name or id of the newly created cache. + * @param {object=} options Options object that specifies the cache behavior. Properties: + * + * - `{number=}` `capacity` — turns the cache into LRU cache. + * + * @returns {object} Newly created cache object with the following set of methods: + * + * - `{object}` `info()` — Returns id, size, and options of cache. + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns + * it. + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. + * - `{void}` `removeAll()` — Removes all cached values. + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. + * + * @example + + +
+ + + + +

Cached Values

+
+ + : + +
+ +

Cache Info

+
+ + : + +
+
+
+ + angular.module('cacheExampleApp', []). + controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { + $scope.keys = []; + $scope.cache = $cacheFactory('cacheId'); + $scope.put = function(key, value) { + if (angular.isUndefined($scope.cache.get(key))) { + $scope.keys.push(key); + } + $scope.cache.put(key, angular.isUndefined(value) ? null : value); + }; + }]); + + + p { + margin: 10px 0 3px; + } + +
+ */ +function $CacheFactoryProvider() { + + this.$get = function() { + var caches = {}; + + function cacheFactory(cacheId, options) { + if (cacheId in caches) { + throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); + } + + var size = 0, + stats = extend({}, options, {id: cacheId}), + data = createMap(), + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = createMap(), + freshEnd = null, + staleEnd = null; + + /** + * @ngdoc type + * @name $cacheFactory.Cache + * + * @description + * A cache object used to store and retrieve data, primarily used by + * {@link $http $http} and the {@link ng.directive:script script} directive to cache + * templates and other data. + * + * ```js + * angular.module('superCache') + * .factory('superCache', ['$cacheFactory', function($cacheFactory) { + * return $cacheFactory('super-cache'); + * }]); + * ``` + * + * Example test: + * + * ```js + * it('should behave like a cache', inject(function(superCache) { + * superCache.put('key', 'value'); + * superCache.put('another key', 'another value'); + * + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 2 + * }); + * + * superCache.remove('another key'); + * expect(superCache.get('another key')).toBeUndefined(); + * + * superCache.removeAll(); + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 0 + * }); + * })); + * ``` + */ + return caches[cacheId] = { + + /** + * @ngdoc method + * @name $cacheFactory.Cache#put + * @kind function + * + * @description + * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be + * retrieved later, and incrementing the size of the cache if the key was not already + * present in the cache. If behaving like an LRU cache, it will also remove stale + * entries from the set. + * + * It will not insert undefined values into the cache. + * + * @param {string} key the key under which the cached data is stored. + * @param {*} value the value to store alongside the key. If it is undefined, the key + * will not be stored. + * @returns {*} the value stored. + */ + put: function(key, value) { + if (isUndefined(value)) return; + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); + + refresh(lruEntry); + } + + if (!(key in data)) size++; + data[key] = value; + + if (size > capacity) { + this.remove(staleEnd.key); + } + + return value; + }, + + /** + * @ngdoc method + * @name $cacheFactory.Cache#get + * @kind function + * + * @description + * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the data to be retrieved + * @returns {*} the value stored. + */ + get: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + refresh(lruEntry); + } + + return data[key]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#remove + * @kind function + * + * @description + * Removes an entry from the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the entry to be removed + */ + remove: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + if (lruEntry == freshEnd) freshEnd = lruEntry.p; + if (lruEntry == staleEnd) staleEnd = lruEntry.n; + link(lruEntry.n,lruEntry.p); + + delete lruHash[key]; + } + + if (!(key in data)) return; + + delete data[key]; + size--; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#removeAll + * @kind function + * + * @description + * Clears the cache object of any entries. + */ + removeAll: function() { + data = createMap(); + size = 0; + lruHash = createMap(); + freshEnd = staleEnd = null; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#destroy + * @kind function + * + * @description + * Destroys the {@link $cacheFactory.Cache Cache} object entirely, + * removing it from the {@link $cacheFactory $cacheFactory} set. + */ + destroy: function() { + data = null; + stats = null; + lruHash = null; + delete caches[cacheId]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#info + * @kind function + * + * @description + * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. + * + * @returns {object} an object with the following properties: + *
    + *
  • **id**: the id of the cache instance
  • + *
  • **size**: the number of entries kept in the cache instance
  • + *
  • **...**: any additional properties from the options object when creating the + * cache.
  • + *
+ */ + info: function() { + return extend({}, stats, {size: size}); + } + }; + + + /** + * makes the `entry` the freshEnd of the LRU linked list + */ + function refresh(entry) { + if (entry != freshEnd) { + if (!staleEnd) { + staleEnd = entry; + } else if (staleEnd == entry) { + staleEnd = entry.n; + } + + link(entry.n, entry.p); + link(entry, freshEnd); + freshEnd = entry; + freshEnd.n = null; + } + } + + + /** + * bidirectionally links two entries of the LRU linked list + */ + function link(nextEntry, prevEntry) { + if (nextEntry != prevEntry) { + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify + } + } + } + + + /** + * @ngdoc method + * @name $cacheFactory#info + * + * @description + * Get information about all the caches that have been created + * + * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` + */ + cacheFactory.info = function() { + var info = {}; + forEach(caches, function(cache, cacheId) { + info[cacheId] = cache.info(); + }); + return info; + }; + + + /** + * @ngdoc method + * @name $cacheFactory#get + * + * @description + * Get access to a cache object by the `cacheId` used when it was created. + * + * @param {string} cacheId Name or id of a cache to access. + * @returns {object} Cache object identified by the cacheId or undefined if no such cache. + */ + cacheFactory.get = function(cacheId) { + return caches[cacheId]; + }; + + + return cacheFactory; + }; +} + +/** + * @ngdoc service + * @name $templateCache + * + * @description + * The first time a template is used, it is loaded in the template cache for quick retrieval. You + * can load templates directly into the cache in a `script` tag, or by consuming the + * `$templateCache` service directly. + * + * Adding via the `script` tag: + * + * ```html + * + * ``` + * + * **Note:** the `script` tag containing the template does not need to be included in the `head` of + * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, + * element with ng-app attribute), otherwise the template will be ignored. + * + * Adding via the `$templateCache` service: + * + * ```js + * var myApp = angular.module('myApp', []); + * myApp.run(function($templateCache) { + * $templateCache.put('templateId.html', 'This is the content of the template'); + * }); + * ``` + * + * To retrieve the template later, simply use it in your HTML: + * ```html + *
+ * ``` + * + * or get it via Javascript: + * ```js + * $templateCache.get('templateId.html') + * ``` + * + * See {@link ng.$cacheFactory $cacheFactory}. + * + */ +function $TemplateCacheProvider() { + this.$get = ['$cacheFactory', function($cacheFactory) { + return $cacheFactory('templates'); + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! + * + * DOM-related variables: + * + * - "node" - DOM Node + * - "element" - DOM Element or Node + * - "$node" or "$element" - jqLite-wrapped node or element + * + * + * Compiler related stuff: + * + * - "linkFn" - linking fn of a single directive + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) + */ + + +/** + * @ngdoc service + * @name $compile + * @kind function + * + * @description + * Compiles an HTML string or DOM into a template and produces a template function, which + * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. + * + * The compilation is a process of walking the DOM tree and matching DOM elements to + * {@link ng.$compileProvider#directive directives}. + * + *
+ * **Note:** This document is an in-depth reference of all directive options. + * For a gentle introduction to directives with examples of common use cases, + * see the {@link guide/directive directive guide}. + *
+ * + * ## Comprehensive Directive API + * + * There are many different options for a directive. + * + * The difference resides in the return value of the factory function. + * You can either return a {@link $compile#directive-definition-object Directive Definition Object (see below)} + * that defines the directive properties, or just the `postLink` function (all other properties will have + * the default values). + * + *
+ * **Best Practice:** It's recommended to use the "directive definition object" form. + *
+ * + * Here's an example directive declared with a Directive Definition Object: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * priority: 0, + * template: '
', // or // function(tElement, tAttrs) { ... }, + * // or + * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, + * transclude: false, + * restrict: 'A', + * templateNamespace: 'html', + * scope: false, + * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * controllerAs: 'stringIdentifier', + * bindToController: false, + * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], + * compile: function compile(tElement, tAttrs, transclude) { + * return { + * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * post: function postLink(scope, iElement, iAttrs, controller) { ... } + * } + * // or + * // return function postLink( ... ) { ... } + * }, + * // or + * // link: { + * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * // post: function postLink(scope, iElement, iAttrs, controller) { ... } + * // } + * // or + * // link: function postLink( ... ) { ... } + * }; + * return directiveDefinitionObject; + * }); + * ``` + * + *
+ * **Note:** Any unspecified options will use the default value. You can see the default values below. + *
+ * + * Therefore the above can be simplified as: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * link: function postLink(scope, iElement, iAttrs) { ... } + * }; + * return directiveDefinitionObject; + * // or + * // return function postLink(scope, iElement, iAttrs) { ... } + * }); + * ``` + * + * ### Life-cycle hooks + * Directive controllers can provide the following methods that are called by Angular at points in the life-cycle of the + * directive: + * * `$onInit()` - Called on each controller after all the controllers on an element have been constructed and + * had their bindings initialized (and before the pre & post linking functions for the directives on + * this element). This is a good place to put initialization code for your controller. + * * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The + * `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an + * object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a + * component such as cloning the bound value to prevent accidental mutation of the outer value. + * * `$doCheck()` - Called on each turn of the digest cycle. Provides an opportunity to detect and act on + * changes. Any actions that you wish to take in response to the changes that you detect must be + * invoked from this hook; implementing this has no effect on when `$onChanges` is called. For example, this hook + * could be useful if you wish to perform a deep equality check, or to check a Date object, changes to which would not + * be detected by Angular's change detector and thus not trigger `$onChanges`. This hook is invoked with no arguments; + * if detecting changes, you must store the previous value(s) for comparison to the current values. + * * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing + * external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in + * the same order as the `$scope.$broadcast` events are triggered, which is top down. This means that parent + * components will have their `$onDestroy()` hook called before child components. + * * `$postLink()` - Called after this controller's element and its children have been linked. Similar to the post-link + * function this hook can be used to set up DOM event handlers and do direct DOM manipulation. + * Note that child elements that contain `templateUrl` directives will not have been compiled and linked since + * they are waiting for their template to load asynchronously and their own compilation and linking has been + * suspended until that occurs. + * + * #### Comparison with Angular 2 life-cycle hooks + * Angular 2 also uses life-cycle hooks for its components. While the Angular 1 life-cycle hooks are similar there are + * some differences that you should be aware of, especially when it comes to moving your code from Angular 1 to Angular 2: + * + * * Angular 1 hooks are prefixed with `$`, such as `$onInit`. Angular 2 hooks are prefixed with `ng`, such as `ngOnInit`. + * * Angular 1 hooks can be defined on the controller prototype or added to the controller inside its constructor. + * In Angular 2 you can only define hooks on the prototype of the Component class. + * * Due to the differences in change-detection, you may get many more calls to `$doCheck` in Angular 1 than you would to + * `ngDoCheck` in Angular 2 + * * Changes to the model inside `$doCheck` will trigger new turns of the digest loop, which will cause the changes to be + * propagated throughout the application. + * Angular 2 does not allow the `ngDoCheck` hook to trigger a change outside of the component. It will either throw an + * error or do nothing depending upon the state of `enableProdMode()`. + * + * #### Life-cycle hook examples + * + * This example shows how you can check for mutations to a Date object even though the identity of the object + * has not changed. + * + * + * + * angular.module('do-check-module', []) + * .component('app', { + * template: + * 'Month: ' + + * 'Date: {{ $ctrl.date }}' + + * '', + * controller: function() { + * this.date = new Date(); + * this.month = this.date.getMonth(); + * this.updateDate = function() { + * this.date.setMonth(this.month); + * }; + * } + * }) + * .component('test', { + * bindings: { date: '<' }, + * template: + * '
{{ $ctrl.log | json }}
', + * controller: function() { + * var previousValue; + * this.log = []; + * this.$doCheck = function() { + * var currentValue = this.date && this.date.valueOf(); + * if (previousValue !== currentValue) { + * this.log.push('doCheck: date mutated: ' + this.date); + * previousValue = currentValue; + * } + * }; + * } + * }); + *
+ * + * + * + *
+ * + * This example show how you might use `$doCheck` to trigger changes in your component's inputs even if the + * actual identity of the component doesn't change. (Be aware that cloning and deep equality checks on large + * arrays or objects can have a negative impact on your application performance) + * + * + * + *
+ * + * + *
{{ items }}
+ * + *
+ *
+ * + * angular.module('do-check-module', []) + * .component('test', { + * bindings: { items: '<' }, + * template: + * '
{{ $ctrl.log | json }}
', + * controller: function() { + * this.log = []; + * + * this.$doCheck = function() { + * if (this.items_ref !== this.items) { + * this.log.push('doCheck: items changed'); + * this.items_ref = this.items; + * } + * if (!angular.equals(this.items_clone, this.items)) { + * this.log.push('doCheck: items mutated'); + * this.items_clone = angular.copy(this.items); + * } + * }; + * } + * }); + *
+ *
+ * + * + * ### Directive Definition Object + * + * The directive definition object provides instructions to the {@link ng.$compile + * compiler}. The attributes are: + * + * #### `multiElement` + * When this property is set to true, the HTML compiler will collect DOM nodes between + * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them + * together as the directive elements. It is recommended that this feature be used on directives + * which are not strictly behavioral (such as {@link ngClick}), and which + * do not manipulate or replace child nodes (such as {@link ngInclude}). + * + * #### `priority` + * When there are multiple directives defined on a single DOM element, sometimes it + * is necessary to specify the order in which the directives are applied. The `priority` is used + * to sort the directives before their `compile` functions get called. Priority is defined as a + * number. Directives with greater numerical `priority` are compiled first. Pre-link functions + * are also run in priority order, but post-link functions are run in reverse order. The order + * of directives with the same priority is undefined. The default priority is `0`. + * + * #### `terminal` + * If set to true then the current `priority` will be the last set of directives + * which will execute (any directives at the current priority will still execute + * as the order of execution on same `priority` is undefined). Note that expressions + * and other directives used in the directive's template will also be excluded from execution. + * + * #### `scope` + * The scope property can be `true`, an object or a falsy value: + * + * * **falsy:** No scope will be created for the directive. The directive will use its parent's scope. + * + * * **`true`:** A new child scope that prototypically inherits from its parent will be created for + * the directive's element. If multiple directives on the same element request a new scope, + * only one new scope is created. The new scope rule does not apply for the root of the template + * since the root of the template always gets a new scope. + * + * * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's element. The + * 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent + * scope. This is useful when creating reusable components, which should not accidentally read or modify + * data in the parent scope. + * + * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the + * directive's element. These local properties are useful for aliasing values for templates. The keys in + * the object hash map to the name of the property on the isolate scope; the values define how the property + * is bound to the parent scope, via matching attributes on the directive's element: + * + * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is + * always a string since DOM attributes are strings. If no `attr` name is specified then the + * attribute name is assumed to be the same as the local name. Given `` and the isolate scope definition `scope: { localName:'@myAttr' }`, + * the directive's scope property `localName` will reflect the interpolated value of `hello + * {{name}}`. As the `name` attribute changes so will the `localName` property on the directive's + * scope. The `name` is read from the parent scope (not the directive's scope). + * + * * `=` or `=attr` - set up a bidirectional binding between a local scope property and an expression + * passed via the attribute `attr`. The expression is evaluated in the context of the parent scope. + * If no `attr` name is specified then the attribute name is assumed to be the same as the local + * name. Given `` and the isolate scope definition `scope: { + * localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the + * value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in + * `localModel` and vice versa. Optional attributes should be marked as such with a question mark: + * `=?` or `=?attr`. If the binding expression is non-assignable, or if the attribute isn't + * optional and doesn't exist, an exception ({@link error/$compile/nonassign `$compile:nonassign`}) + * will be thrown upon discovering changes to the local value, since it will be impossible to sync + * them back to the parent scope. By default, the {@link ng.$rootScope.Scope#$watch `$watch`} + * method is used for tracking changes, and the equality check is based on object identity. + * However, if an object literal or an array literal is passed as the binding expression, the + * equality check is done by value (using the {@link angular.equals} function). It's also possible + * to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection + * `$watchCollection`}: use `=*` or `=*attr` (`=*?` or `=*?attr` if the attribute is optional). + * + * * `<` or `` and directive definition of + * `scope: { localModel:'` and the isolate scope definition `scope: { + * localFn:'&myAttr' }`, the isolate scope property `localFn` will point to a function wrapper for + * the `count = count + value` expression. Often it's desirable to pass data from the isolated scope + * via an expression to the parent scope. This can be done by passing a map of local variable names + * and values into the expression wrapper fn. For example, if the expression is `increment(amount)` + * then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`. + * + * In general it's possible to apply more than one directive to one element, but there might be limitations + * depending on the type of scope required by the directives. The following points will help explain these limitations. + * For simplicity only two directives are taken into account, but it is also applicable for several directives: + * + * * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope + * * **child scope** + **no scope** => Both directives will share one single child scope + * * **child scope** + **child scope** => Both directives will share one single child scope + * * **isolated scope** + **no scope** => The isolated directive will use it's own created isolated scope. The other directive will use + * its parent's scope + * * **isolated scope** + **child scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives cannot + * be applied to the same element. + * * **isolated scope** + **isolated scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives + * cannot be applied to the same element. + * + * + * #### `bindToController` + * This property is used to bind scope properties directly to the controller. It can be either + * `true` or an object hash with the same format as the `scope` property. Additionally, a controller + * alias must be set, either by using `controllerAs: 'myAlias'` or by specifying the alias in the controller + * definition: `controller: 'myCtrl as myAlias'`. + * + * When an isolate scope is used for a directive (see above), `bindToController: true` will + * allow a component to have its properties bound to the controller, rather than to scope. + * + * After the controller is instantiated, the initial values of the isolate scope bindings will be bound to the controller + * properties. You can access these bindings once they have been initialized by providing a controller method called + * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings + * initialized. + * + *
+ * **Deprecation warning:** although bindings for non-ES6 class controllers are currently + * bound to `this` before the controller constructor is called, this use is now deprecated. Please place initialization + * code that relies upon bindings inside a `$onInit` method on the controller, instead. + *
+ * + * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property. + * This will set up the scope bindings to the controller directly. Note that `scope` can still be used + * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate + * scope (useful for component directives). + * + * If both `bindToController` and `scope` are defined and have object hashes, `bindToController` overrides `scope`. + * + * + * #### `controller` + * Controller constructor function. The controller is instantiated before the + * pre-linking phase and can be accessed by other directives (see + * `require` attribute). This allows the directives to communicate with each other and augment + * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: + * + * * `$scope` - Current scope associated with the element + * * `$element` - Current element + * * `$attrs` - Current attributes object for the element + * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: + * `function([scope], cloneLinkingFn, futureParentElement, slotName)`: + * * `scope`: (optional) override the scope. + * * `cloneLinkingFn`: (optional) argument to create clones of the original transcluded content. + * * `futureParentElement` (optional): + * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. + * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. + * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) + * and when the `cloneLinkinFn` is passed, + * as those elements need to created and cloned in a special way when they are defined outside their + * usual containers (e.g. like ``). + * * See also the `directive.templateNamespace` property. + * * `slotName`: (optional) the name of the slot to transclude. If falsy (e.g. `null`, `undefined` or `''`) + * then the default translusion is provided. + * The `$transclude` function also has a method on it, `$transclude.isSlotFilled(slotName)`, which returns + * `true` if the specified slot contains content (i.e. one or more DOM nodes). + * + * #### `require` + * Require another directive and inject its controller as the fourth argument to the linking function. The + * `require` property can be a string, an array or an object: + * * a **string** containing the name of the directive to pass to the linking function + * * an **array** containing the names of directives to pass to the linking function. The argument passed to the + * linking function will be an array of controllers in the same order as the names in the `require` property + * * an **object** whose property values are the names of the directives to pass to the linking function. The argument + * passed to the linking function will also be an object with matching keys, whose values will hold the corresponding + * controllers. + * + * If the `require` property is an object and `bindToController` is truthy, then the required controllers are + * bound to the controller using the keys of the `require` property. This binding occurs after all the controllers + * have been constructed but before `$onInit` is called. + * If the name of the required controller is the same as the local name (the key), the name can be + * omitted. For example, `{parentDir: '^^'}` is equivalent to `{parentDir: '^^parentDir'}`. + * See the {@link $compileProvider#component} helper for an example of how this can be used. + * If no such required directive(s) can be found, or if the directive does not have a controller, then an error is + * raised (unless no link function is specified and the required controllers are not being bound to the directive + * controller, in which case error checking is skipped). The name can be prefixed with: + * + * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. + * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. + * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. + * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. + * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass + * `null` to the `link` fn if not found. + * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass + * `null` to the `link` fn if not found. + * + * + * #### `controllerAs` + * Identifier name for a reference to the controller in the directive's scope. + * This allows the controller to be referenced from the directive template. This is especially + * useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible + * to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the + * `controllerAs` reference might overwrite a property that already exists on the parent scope. + * + * + * #### `restrict` + * String of subset of `EACM` which restricts the directive to a specific directive + * declaration style. If omitted, the defaults (elements and attributes) are used. + * + * * `E` - Element name (default): `` + * * `A` - Attribute (default): `
` + * * `C` - Class: `
` + * * `M` - Comment: `` + * + * + * #### `templateNamespace` + * String representing the document type used by the markup in the template. + * AngularJS needs this information as those elements need to be created and cloned + * in a special way when they are defined outside their usual containers like `` and ``. + * + * * `html` - All root nodes in the template are HTML. Root nodes may also be + * top-level elements such as `` or ``. + * * `svg` - The root nodes in the template are SVG elements (excluding ``). + * * `math` - The root nodes in the template are MathML elements (excluding ``). + * + * If no `templateNamespace` is specified, then the namespace is considered to be `html`. + * + * #### `template` + * HTML markup that may: + * * Replace the contents of the directive's element (default). + * * Replace the directive's element itself (if `replace` is true - DEPRECATED). + * * Wrap the contents of the directive's element (if `transclude` is true). + * + * Value may be: + * + * * A string. For example `
{{delete_str}}
`. + * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` + * function api below) and returns a string value. + * + * + * #### `templateUrl` + * This is similar to `template` but the template is loaded from the specified URL, asynchronously. + * + * Because template loading is asynchronous the compiler will suspend compilation of directives on that element + * for later when the template has been resolved. In the meantime it will continue to compile and link + * sibling and parent elements as though this element had not contained any directives. + * + * The compiler does not suspend the entire compilation to wait for templates to be loaded because this + * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the + * case when only one deeply nested directive has `templateUrl`. + * + * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} + * + * You can specify `templateUrl` as a string representing the URL or as a function which takes two + * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns + * a string value representing the url. In either case, the template URL is passed through {@link + * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. + * + * + * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) + * specify what the template should replace. Defaults to `false`. + * + * * `true` - the template will replace the directive's element. + * * `false` - the template will replace the contents of the directive's element. + * + * The replacement process migrates all of the attributes / classes from the old element to the new + * one. See the {@link guide/directive#template-expanding-directive + * Directives Guide} for an example. + * + * There are very few scenarios where element replacement is required for the application function, + * the main one being reusable custom components that are used within SVG contexts + * (because SVG doesn't work with custom elements in the DOM tree). + * + * #### `transclude` + * Extract the contents of the element where the directive appears and make it available to the directive. + * The contents are compiled and provided to the directive as a **transclusion function**. See the + * {@link $compile#transclusion Transclusion} section below. + * + * + * #### `compile` + * + * ```js + * function compile(tElement, tAttrs, transclude) { ... } + * ``` + * + * The compile function deals with transforming the template DOM. Since most directives do not do + * template transformation, it is not used often. The compile function takes the following arguments: + * + * * `tElement` - template element - The element where the directive has been declared. It is + * safe to do template transformation on the element and child elements only. + * + * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared + * between all directive compile functions. + * + * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` + * + *
+ * **Note:** The template instance and the link instance may be different objects if the template has + * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that + * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration + * should be done in a linking function rather than in a compile function. + *
+ + *
+ * **Note:** The compile function cannot handle directives that recursively use themselves in their + * own templates or compile functions. Compiling these directives results in an infinite loop and + * stack overflow errors. + * + * This can be avoided by manually using $compile in the postLink function to imperatively compile + * a directive's template instead of relying on automatic template compilation via `template` or + * `templateUrl` declaration or manual compilation inside the compile function. + *
+ * + *
+ * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it + * e.g. does not know about the right outer scope. Please use the transclude function that is passed + * to the link function instead. + *
+ + * A compile function can have a return value which can be either a function or an object. + * + * * returning a (post-link) function - is equivalent to registering the linking function via the + * `link` property of the config object when the compile function is empty. + * + * * returning an object with function(s) registered via `pre` and `post` properties - allows you to + * control when a linking function should be called during the linking phase. See info about + * pre-linking and post-linking functions below. + * + * + * #### `link` + * This property is used only if the `compile` property is not defined. + * + * ```js + * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } + * ``` + * + * The link function is responsible for registering DOM listeners as well as updating the DOM. It is + * executed after the template has been cloned. This is where most of the directive logic will be + * put. + * + * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the + * directive for registering {@link ng.$rootScope.Scope#$watch watches}. + * + * * `iElement` - instance element - The element where the directive is to be used. It is safe to + * manipulate the children of the element only in `postLink` function since the children have + * already been linked. + * + * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared + * between all directive linking functions. + * + * * `controller` - the directive's required controller instance(s) - Instances are shared + * among all directives, which allows the directives to use the controllers as a communication + * channel. The exact value depends on the directive's `require` property: + * * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one + * * `string`: the controller instance + * * `array`: array of controller instances + * + * If a required controller cannot be found, and it is optional, the instance is `null`, + * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown. + * + * Note that you can also require the directive's own controller - it will be made available like + * any other controller. + * + * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. + * This is the same as the `$transclude` parameter of directive controllers, + * see {@link ng.$compile#-controller- the controller section for details}. + * `function([scope], cloneLinkingFn, futureParentElement)`. + * + * #### Pre-linking function + * + * Executed before the child elements are linked. Not safe to do DOM transformation since the + * compiler linking function will fail to locate the correct elements for linking. + * + * #### Post-linking function + * + * Executed after the child elements are linked. + * + * Note that child elements that contain `templateUrl` directives will not have been compiled + * and linked since they are waiting for their template to load asynchronously and their own + * compilation and linking has been suspended until that occurs. + * + * It is safe to do DOM transformation in the post-linking function on elements that are not waiting + * for their async templates to be resolved. + * + * + * ### Transclusion + * + * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and + * copying them to another part of the DOM, while maintaining their connection to the original AngularJS + * scope from where they were taken. + * + * Transclusion is used (often with {@link ngTransclude}) to insert the + * original contents of a directive's element into a specified place in the template of the directive. + * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded + * content has access to the properties on the scope from which it was taken, even if the directive + * has isolated scope. + * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. + * + * This makes it possible for the widget to have private state for its template, while the transcluded + * content has access to its originating scope. + * + *
+ * **Note:** When testing an element transclude directive you must not place the directive at the root of the + * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives + * Testing Transclusion Directives}. + *
+ * + * There are three kinds of transclusion depending upon whether you want to transclude just the contents of the + * directive's element, the entire element or multiple parts of the element contents: + * + * * `true` - transclude the content (i.e. the child nodes) of the directive's element. + * * `'element'` - transclude the whole of the directive's element including any directives on this + * element that defined at a lower priority than this directive. When used, the `template` + * property is ignored. + * * **`{...}` (an object hash):** - map elements of the content onto transclusion "slots" in the template. + * + * **Mult-slot transclusion** is declared by providing an object for the `transclude` property. + * + * This object is a map where the keys are the name of the slot to fill and the value is an element selector + * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`) + * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc). + * + * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} + * + * If the element selector is prefixed with a `?` then that slot is optional. + * + * For example, the transclude object `{ slotA: '?myCustomElement' }` maps `` elements to + * the `slotA` slot, which can be accessed via the `$transclude` function or via the {@link ngTransclude} directive. + * + * Slots that are not marked as optional (`?`) will trigger a compile time error if there are no matching elements + * in the transclude content. If you wish to know if an optional slot was filled with content, then you can call + * `$transclude.isSlotFilled(slotName)` on the transclude function passed to the directive's link function and + * injectable into the directive's controller. + * + * + * #### Transclusion Functions + * + * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion + * function** to the directive's `link` function and `controller`. This transclusion function is a special + * **linking function** that will return the compiled contents linked to a new transclusion scope. + * + *
+ * If you are just using {@link ngTransclude} then you don't need to worry about this function, since + * ngTransclude will deal with it for us. + *
+ * + * If you want to manually control the insertion and removal of the transcluded content in your directive + * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery + * object that contains the compiled DOM, which is linked to the correct transclusion scope. + * + * When you call a transclusion function you can pass in a **clone attach function**. This function accepts + * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded + * content and the `scope` is the newly created transclusion scope, to which the clone is bound. + * + *
+ * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function + * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. + *
+ * + * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone + * attach function**: + * + * ```js + * var transcludedContent, transclusionScope; + * + * $transclude(function(clone, scope) { + * element.append(clone); + * transcludedContent = clone; + * transclusionScope = scope; + * }); + * ``` + * + * Later, if you want to remove the transcluded content from your DOM then you should also destroy the + * associated transclusion scope: + * + * ```js + * transcludedContent.remove(); + * transclusionScope.$destroy(); + * ``` + * + *
+ * **Best Practice**: if you intend to add and remove transcluded content manually in your directive + * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it), + * then you are also responsible for calling `$destroy` on the transclusion scope. + *
+ * + * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} + * automatically destroy their transcluded clones as necessary so you do not need to worry about this if + * you are simply using {@link ngTransclude} to inject the transclusion into your directive. + * + * + * #### Transclusion Scopes + * + * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion + * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed + * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it + * was taken. + * + * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look + * like this: + * + * ```html + *
+ *
+ *
+ *
+ *
+ *
+ * ``` + * + * The `$parent` scope hierarchy will look like this: + * + ``` + - $rootScope + - isolate + - transclusion + ``` + * + * but the scopes will inherit prototypically from different scopes to their `$parent`. + * + ``` + - $rootScope + - transclusion + - isolate + ``` + * + * + * ### Attributes + * + * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the + * `link()` or `compile()` functions. It has a variety of uses. + * + * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways: + * 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access + * to the attributes. + * + * * *Directive inter-communication:* All directives share the same instance of the attributes + * object which allows the directives to use the attributes object as inter directive + * communication. + * + * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object + * allowing other directives to read the interpolated value. + * + * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes + * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also + * the only way to easily get the actual value because during the linking phase the interpolation + * hasn't been evaluated yet and so the value is at this time set to `undefined`. + * + * ```js + * function linkingFn(scope, elm, attrs, ctrl) { + * // get the attribute value + * console.log(attrs.ngModel); + * + * // change the attribute + * attrs.$set('ngModel', 'new value'); + * + * // observe changes to interpolated attribute + * attrs.$observe('ngModel', function(value) { + * console.log('ngModel has changed value to ' + value); + * }); + * } + * ``` + * + * ## Example + * + *
+ * **Note**: Typically directives are registered with `module.directive`. The example below is + * to illustrate how `$compile` works. + *
+ * + + + +
+
+
+
+
+
+ + it('should auto compile', function() { + var textarea = $('textarea'); + var output = $('div[compile]'); + // The initial state reads 'Hello Angular'. + expect(output.getText()).toBe('Hello Angular'); + textarea.clear(); + textarea.sendKeys('{{name}}!'); + expect(output.getText()).toBe('Angular!'); + }); + +
+ + * + * + * @param {string|DOMElement} element Element or HTML string to compile into a template function. + * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. + * + *
+ * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it + * e.g. will not use the right outer scope. Please pass the transclude function as a + * `parentBoundTranscludeFn` to the link function instead. + *
+ * + * @param {number} maxPriority only apply directives lower than given priority (Only effects the + * root element(s), not their children) + * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template + * (a DOM element/tree) to a scope. Where: + * + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the + * `template` and call the `cloneAttachFn` function allowing the caller to attach the + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is + * called as:
`cloneAttachFn(clonedElement, scope)` where: + * + * * `clonedElement` - is a clone of the original `element` passed into the compiler. + * * `scope` - is the current scope with which the linking function is working with. + * + * * `options` - An optional object hash with linking options. If `options` is provided, then the following + * keys may be used to control linking behavior: + * + * * `parentBoundTranscludeFn` - the transclude function made available to + * directives; if given, it will be passed through to the link functions of + * directives found in `element` during compilation. + * * `transcludeControllers` - an object hash with keys that map controller names + * to a hash with the key `instance`, which maps to the controller instance; + * if given, it will make the controllers available to directives on the compileNode: + * ``` + * { + * parent: { + * instance: parentControllerInstance + * } + * } + * ``` + * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add + * the cloned elements; only needed for transcludes that are allowed to contain non html + * elements (e.g. SVG elements). See also the directive.controller property. + * + * Calling the linking function returns the element of the template. It is either the original + * element passed in, or the clone of the element if the `cloneAttachFn` is provided. + * + * After linking the view is not updated until after a call to $digest which typically is done by + * Angular automatically. + * + * If you need access to the bound view, there are two ways to do it: + * + * - If you are not asking the linking function to clone the template, create the DOM element(s) + * before you send them to the compiler and keep this reference around. + * ```js + * var element = $compile('

{{total}}

')(scope); + * ``` + * + * - if on the other hand, you need the element to be cloned, the view reference from the original + * example would not point to the clone, but rather to the original template that was cloned. In + * this case, you can access the clone via the cloneAttachFn: + * ```js + * var templateElement = angular.element('

{{total}}

'), + * scope = ....; + * + * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { + * //attach the clone to DOM document at the right place + * }); + * + * //now we have reference to the cloned DOM via `clonedElement` + * ``` + * + * + * For information on how the compiler works, see the + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. + */ + +var $compileMinErr = minErr('$compile'); + +function UNINITIALIZED_VALUE() {} +var _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE(); + +/** + * @ngdoc provider + * @name $compileProvider + * + * @description + */ +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; +function $CompileProvider($provide, $$sanitizeUriProvider) { + var hasDirectives = {}, + Suffix = 'Directive', + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, + ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), + REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; + + // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes + // The assumption is that future DOM event attribute names will begin with + // 'on' and be composed of only English letters. + var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; + var bindingCache = createMap(); + + function parseIsolateBindings(scope, directiveName, isController) { + var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/; + + var bindings = createMap(); + + forEach(scope, function(definition, scopeName) { + if (definition in bindingCache) { + bindings[scopeName] = bindingCache[definition]; + return; + } + var match = definition.match(LOCAL_REGEXP); + + if (!match) { + throw $compileMinErr('iscp', + "Invalid {3} for directive '{0}'." + + " Definition: {... {1}: '{2}' ...}", + directiveName, scopeName, definition, + (isController ? "controller bindings definition" : + "isolate scope definition")); + } + + bindings[scopeName] = { + mode: match[1][0], + collection: match[2] === '*', + optional: match[3] === '?', + attrName: match[4] || scopeName + }; + if (match[4]) { + bindingCache[definition] = bindings[scopeName]; + } + }); + + return bindings; + } + + function parseDirectiveBindings(directive, directiveName) { + var bindings = { + isolateScope: null, + bindToController: null + }; + if (isObject(directive.scope)) { + if (directive.bindToController === true) { + bindings.bindToController = parseIsolateBindings(directive.scope, + directiveName, true); + bindings.isolateScope = {}; + } else { + bindings.isolateScope = parseIsolateBindings(directive.scope, + directiveName, false); + } + } + if (isObject(directive.bindToController)) { + bindings.bindToController = + parseIsolateBindings(directive.bindToController, directiveName, true); + } + if (isObject(bindings.bindToController)) { + var controller = directive.controller; + var controllerAs = directive.controllerAs; + if (!controller) { + // There is no controller, there may or may not be a controllerAs property + throw $compileMinErr('noctrl', + "Cannot bind to controller without directive '{0}'s controller.", + directiveName); + } else if (!identifierForController(controller, controllerAs)) { + // There is a controller, but no identifier or controllerAs property + throw $compileMinErr('noident', + "Cannot bind to controller without identifier for directive '{0}'.", + directiveName); + } + } + return bindings; + } + + function assertValidDirectiveName(name) { + var letter = name.charAt(0); + if (!letter || letter !== lowercase(letter)) { + throw $compileMinErr('baddir', "Directive/Component name '{0}' is invalid. The first character must be a lowercase letter", name); + } + if (name !== name.trim()) { + throw $compileMinErr('baddir', + "Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces", + name); + } + } + + function getDirectiveRequire(directive) { + var require = directive.require || (directive.controller && directive.name); + + if (!isArray(require) && isObject(require)) { + forEach(require, function(value, key) { + var match = value.match(REQUIRE_PREFIX_REGEXP); + var name = value.substring(match[0].length); + if (!name) require[key] = match[0] + key; + }); + } + + return require; + } + + /** + * @ngdoc method + * @name $compileProvider#directive + * @kind function + * + * @description + * Register a new directive with the compiler. + * + * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which + * will match as ng-bind), or an object map of directives where the keys are the + * names and the values are the factories. + * @param {Function|Array} directiveFactory An injectable directive factory function. See the + * {@link guide/directive directive guide} and the {@link $compile compile API} for more info. + * @returns {ng.$compileProvider} Self for chaining. + */ + this.directive = function registerDirective(name, directiveFactory) { + assertNotHasOwnProperty(name, 'directive'); + if (isString(name)) { + assertValidDirectiveName(name); + assertArg(directiveFactory, 'directiveFactory'); + if (!hasDirectives.hasOwnProperty(name)) { + hasDirectives[name] = []; + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', + function($injector, $exceptionHandler) { + var directives = []; + forEach(hasDirectives[name], function(directiveFactory, index) { + try { + var directive = $injector.invoke(directiveFactory); + if (isFunction(directive)) { + directive = { compile: valueFn(directive) }; + } else if (!directive.compile && directive.link) { + directive.compile = valueFn(directive.link); + } + directive.priority = directive.priority || 0; + directive.index = index; + directive.name = directive.name || name; + directive.require = getDirectiveRequire(directive); + directive.restrict = directive.restrict || 'EA'; + directive.$$moduleName = directiveFactory.$$moduleName; + directives.push(directive); + } catch (e) { + $exceptionHandler(e); + } + }); + return directives; + }]); + } + hasDirectives[name].push(directiveFactory); + } else { + forEach(name, reverseParams(registerDirective)); + } + return this; + }; + + /** + * @ngdoc method + * @name $compileProvider#component + * @module ng + * @param {string} name Name of the component in camelCase (i.e. `myComp` which will match ``) + * @param {Object} options Component definition object (a simplified + * {@link ng.$compile#directive-definition-object directive definition object}), + * with the following properties (all optional): + * + * - `controller` – `{(string|function()=}` – controller constructor function that should be + * associated with newly created scope or the name of a {@link ng.$compile#-controller- + * registered controller} if passed as a string. An empty `noop` function by default. + * - `controllerAs` – `{string=}` – identifier name for to reference the controller in the component's scope. + * If present, the controller will be published to scope under the `controllerAs` name. + * If not present, this will default to be `$ctrl`. + * - `template` – `{string=|function()=}` – html template as a string or a function that + * returns an html template as a string which should be used as the contents of this component. + * Empty string by default. + * + * If `template` is a function, then it is {@link auto.$injector#invoke injected} with + * the following locals: + * + * - `$element` - Current element + * - `$attrs` - Current attributes object for the element + * + * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html + * template that should be used as the contents of this component. + * + * If `templateUrl` is a function, then it is {@link auto.$injector#invoke injected} with + * the following locals: + * + * - `$element` - Current element + * - `$attrs` - Current attributes object for the element + * + * - `bindings` – `{object=}` – defines bindings between DOM attributes and component properties. + * Component properties are always bound to the component controller and not to the scope. + * See {@link ng.$compile#-bindtocontroller- `bindToController`}. + * - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled. + * Disabled by default. + * - `require` - `{Object=}` - requires the controllers of other directives and binds them to + * this component's controller. The object keys specify the property names under which the required + * controllers (object values) will be bound. See {@link ng.$compile#-require- `require`}. + * - `$...` – additional properties to attach to the directive factory function and the controller + * constructor function. (This is used by the component router to annotate) + * + * @returns {ng.$compileProvider} the compile provider itself, for chaining of function calls. + * @description + * Register a **component definition** with the compiler. This is a shorthand for registering a special + * type of directive, which represents a self-contained UI component in your application. Such components + * are always isolated (i.e. `scope: {}`) and are always restricted to elements (i.e. `restrict: 'E'`). + * + * Component definitions are very simple and do not require as much configuration as defining general + * directives. Component definitions usually consist only of a template and a controller backing it. + * + * In order to make the definition easier, components enforce best practices like use of `controllerAs`, + * `bindToController`. They always have **isolate scope** and are restricted to elements. + * + * Here are a few examples of how you would usually define components: + * + * ```js + * var myMod = angular.module(...); + * myMod.component('myComp', { + * template: '
My name is {{$ctrl.name}}
', + * controller: function() { + * this.name = 'shahar'; + * } + * }); + * + * myMod.component('myComp', { + * template: '
My name is {{$ctrl.name}}
', + * bindings: {name: '@'} + * }); + * + * myMod.component('myComp', { + * templateUrl: 'views/my-comp.html', + * controller: 'MyCtrl', + * controllerAs: 'ctrl', + * bindings: {name: '@'} + * }); + * + * ``` + * For more examples, and an in-depth guide, see the {@link guide/component component guide}. + * + *
+ * See also {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + this.component = function registerComponent(name, options) { + var controller = options.controller || function() {}; + + function factory($injector) { + function makeInjectable(fn) { + if (isFunction(fn) || isArray(fn)) { + return function(tElement, tAttrs) { + return $injector.invoke(fn, this, {$element: tElement, $attrs: tAttrs}); + }; + } else { + return fn; + } + } + + var template = (!options.template && !options.templateUrl ? '' : options.template); + var ddo = { + controller: controller, + controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl', + template: makeInjectable(template), + templateUrl: makeInjectable(options.templateUrl), + transclude: options.transclude, + scope: {}, + bindToController: options.bindings || {}, + restrict: 'E', + require: options.require + }; + + // Copy annotations (starting with $) over to the DDO + forEach(options, function(val, key) { + if (key.charAt(0) === '$') ddo[key] = val; + }); + + return ddo; + } + + // TODO(pete) remove the following `forEach` before we release 1.6.0 + // The component-router@0.2.0 looks for the annotations on the controller constructor + // Nothing in Angular looks for annotations on the factory function but we can't remove + // it from 1.5.x yet. + + // Copy any annotation properties (starting with $) over to the factory and controller constructor functions + // These could be used by libraries such as the new component router + forEach(options, function(val, key) { + if (key.charAt(0) === '$') { + factory[key] = val; + // Don't try to copy over annotations to named controller + if (isFunction(controller)) controller[key] = val; + } + }); + + factory.$inject = ['$injector']; + + return this.directive(name, factory); + }; + + + /** + * @ngdoc method + * @name $compileProvider#aHrefSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at preventing XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); + } + }; + + + /** + * @ngdoc method + * @name $compileProvider#imgSrcSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); + } + }; + + /** + * @ngdoc method + * @name $compileProvider#debugInfoEnabled + * + * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the + * current debugInfoEnabled state + * @returns {*} current value if used as getter or itself (chaining) if used as setter + * + * @kind function + * + * @description + * Call this method to enable/disable various debug runtime information in the compiler such as adding + * binding information and a reference to the current scope on to DOM elements. + * If enabled, the compiler will add the following to DOM elements that have been bound to the scope + * * `ng-binding` CSS class + * * `$binding` data property containing an array of the binding expressions + * + * You may want to disable this in production for a significant performance boost. See + * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. + * + * The default value is true. + */ + var debugInfoEnabled = true; + this.debugInfoEnabled = function(enabled) { + if (isDefined(enabled)) { + debugInfoEnabled = enabled; + return this; + } + return debugInfoEnabled; + }; + + + var TTL = 10; + /** + * @ngdoc method + * @name $compileProvider#onChangesTtl + * @description + * + * Sets the number of times `$onChanges` hooks can trigger new changes before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that dependencies between `$onChanges` hooks and bindings will result + * in several iterations of calls to these hooks. However if an application needs more than the default 10 + * iterations to stabilize then you should investigate what is causing the model to continuously change during + * the `$onChanges` hook execution. + * + * Increasing the TTL could have performance implications, so you should not change it without proper justification. + * + * @param {number} limit The number of `$onChanges` hook iterations. + * @returns {number|object} the current limit (or `this` if called as a setter for chaining) + */ + this.onChangesTtl = function(value) { + if (arguments.length) { + TTL = value; + return this; + } + return TTL; + }; + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', + '$controller', '$rootScope', '$sce', '$animate', '$$sanitizeUri', + function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, + $controller, $rootScope, $sce, $animate, $$sanitizeUri) { + + var SIMPLE_ATTR_NAME = /^\w/; + var specialAttrHolder = window.document.createElement('div'); + + + + var onChangesTtl = TTL; + // The onChanges hooks should all be run together in a single digest + // When changes occur, the call to trigger their hooks will be added to this queue + var onChangesQueue; + + // This function is called in a $$postDigest to trigger all the onChanges hooks in a single digest + function flushOnChangesQueue() { + try { + if (!(--onChangesTtl)) { + // We have hit the TTL limit so reset everything + onChangesQueue = undefined; + throw $compileMinErr('infchng', '{0} $onChanges() iterations reached. Aborting!\n', TTL); + } + // We must run this hook in an apply since the $$postDigest runs outside apply + $rootScope.$apply(function() { + var errors = []; + for (var i = 0, ii = onChangesQueue.length; i < ii; ++i) { + try { + onChangesQueue[i](); + } catch (e) { + errors.push(e); + } + } + // Reset the queue to trigger a new schedule next time there is a change + onChangesQueue = undefined; + if (errors.length) { + throw errors; + } + }); + } finally { + onChangesTtl++; + } + } + + + function Attributes(element, attributesToCopy) { + if (attributesToCopy) { + var keys = Object.keys(attributesToCopy); + var i, l, key; + + for (i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + this[key] = attributesToCopy[key]; + } + } else { + this.$attr = {}; + } + + this.$$element = element; + } + + Attributes.prototype = { + /** + * @ngdoc method + * @name $compile.directive.Attributes#$normalize + * @kind function + * + * @description + * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or + * `data-`) to its normalized, camelCase form. + * + * Also there is special case for Moz prefix starting with upper case letter. + * + * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} + * + * @param {string} name Name to normalize + */ + $normalize: directiveNormalize, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$addClass + * @kind function + * + * @description + * Adds the CSS class value specified by the classVal parameter to the element. If animations + * are enabled then an animation will be triggered for the class addition. + * + * @param {string} classVal The className value that will be added to the element + */ + $addClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.addClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$removeClass + * @kind function + * + * @description + * Removes the CSS class value specified by the classVal parameter from the element. If + * animations are enabled then an animation will be triggered for the class removal. + * + * @param {string} classVal The className value that will be removed from the element + */ + $removeClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.removeClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$updateClass + * @kind function + * + * @description + * Adds and removes the appropriate CSS class values to the element based on the difference + * between the new and old CSS class values (specified as newClasses and oldClasses). + * + * @param {string} newClasses The current CSS className value + * @param {string} oldClasses The former CSS className value + */ + $updateClass: function(newClasses, oldClasses) { + var toAdd = tokenDifference(newClasses, oldClasses); + if (toAdd && toAdd.length) { + $animate.addClass(this.$$element, toAdd); + } + + var toRemove = tokenDifference(oldClasses, newClasses); + if (toRemove && toRemove.length) { + $animate.removeClass(this.$$element, toRemove); + } + }, + + /** + * Set a normalized attribute on the element in a way such that all directives + * can share the attribute. This function properly handles boolean attributes. + * @param {string} key Normalized key. (ie ngAttribute) + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. + * Defaults to true. + * @param {string=} attrName Optional none normalized name. Defaults to key. + */ + $set: function(key, value, writeAttr, attrName) { + // TODO: decide whether or not to throw an error if "class" + //is set through this function since it may cause $updateClass to + //become unstable. + + var node = this.$$element[0], + booleanKey = getBooleanAttrName(node, key), + aliasedKey = getAliasedAttrName(key), + observer = key, + nodeName; + + if (booleanKey) { + this.$$element.prop(key, value); + attrName = booleanKey; + } else if (aliasedKey) { + this[aliasedKey] = value; + observer = aliasedKey; + } + + this[key] = value; + + // translate normalized key to actual key + if (attrName) { + this.$attr[key] = attrName; + } else { + attrName = this.$attr[key]; + if (!attrName) { + this.$attr[key] = attrName = snake_case(key, '-'); + } + } + + nodeName = nodeName_(this.$$element); + + if ((nodeName === 'a' && (key === 'href' || key === 'xlinkHref')) || + (nodeName === 'img' && key === 'src')) { + // sanitize a[href] and img[src] values + this[key] = value = $$sanitizeUri(value, key === 'src'); + } else if (nodeName === 'img' && key === 'srcset' && isDefined(value)) { + // sanitize img[srcset] values + var result = ""; + + // first check if there are spaces because it's not the same pattern + var trimmedSrcset = trim(value); + // ( 999x ,| 999w ,| ,|, ) + var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; + var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; + + // split srcset into tuple of uri and descriptor except for the last item + var rawUris = trimmedSrcset.split(pattern); + + // for each tuples + var nbrUrisWith2parts = Math.floor(rawUris.length / 2); + for (var i = 0; i < nbrUrisWith2parts; i++) { + var innerIdx = i * 2; + // sanitize the uri + result += $$sanitizeUri(trim(rawUris[innerIdx]), true); + // add the descriptor + result += (" " + trim(rawUris[innerIdx + 1])); + } + + // split the last item into uri and descriptor + var lastTuple = trim(rawUris[i * 2]).split(/\s/); + + // sanitize the last uri + result += $$sanitizeUri(trim(lastTuple[0]), true); + + // and add the last descriptor if any + if (lastTuple.length === 2) { + result += (" " + trim(lastTuple[1])); + } + this[key] = value = result; + } + + if (writeAttr !== false) { + if (value === null || isUndefined(value)) { + this.$$element.removeAttr(attrName); + } else { + if (SIMPLE_ATTR_NAME.test(attrName)) { + this.$$element.attr(attrName, value); + } else { + setSpecialAttr(this.$$element[0], attrName, value); + } + } + } + + // fire observers + var $$observers = this.$$observers; + $$observers && forEach($$observers[observer], function(fn) { + try { + fn(value); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$observe + * @kind function + * + * @description + * Observes an interpolated attribute. + * + * The observer function will be invoked once during the next `$digest` following + * compilation. The observer is then invoked whenever the interpolated value + * changes. + * + * @param {string} key Normalized key. (ie ngAttribute) . + * @param {function(interpolatedValue)} fn Function that will be called whenever + the interpolated value of the attribute changes. + * See the {@link guide/interpolation#how-text-and-attribute-bindings-work Interpolation + * guide} for more info. + * @returns {function()} Returns a deregistration function for this observer. + */ + $observe: function(key, fn) { + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); + + return function() { + arrayRemove(listeners, fn); + }; + } + }; + + function setSpecialAttr(element, attrName, value) { + // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute` + // so we have to jump through some hoops to get such an attribute + // https://github.com/angular/angular.js/pull/13318 + specialAttrHolder.innerHTML = ""; + var attributes = specialAttrHolder.firstChild.attributes; + var attribute = attributes[0]; + // We have to remove the attribute from its container element before we can add it to the destination element + attributes.removeNamedItem(attribute.name); + attribute.value = value; + element.attributes.setNamedItem(attribute); + } + + function safeAddClass($element, className) { + try { + $element.addClass(className); + } catch (e) { + // ignore, since it means that we are trying to set class on + // SVG element, where class name is read-only. + } + } + + + var startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + denormalizeTemplate = (startSymbol == '{{' && endSymbol == '}}') + ? identity + : function denormalizeTemplate(template) { + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); + }, + NG_ATTR_BINDING = /^ngAttr[A-Z]/; + var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/; + + compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { + var bindings = $element.data('$binding') || []; + + if (isArray(binding)) { + bindings = bindings.concat(binding); + } else { + bindings.push(binding); + } + + $element.data('$binding', bindings); + } : noop; + + compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { + safeAddClass($element, 'ng-binding'); + } : noop; + + compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { + var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; + $element.data(dataName, scope); + } : noop; + + compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { + safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); + } : noop; + + compile.$$createComment = function(directiveName, comment) { + var content = ''; + if (debugInfoEnabled) { + content = ' ' + (directiveName || '') + ': '; + if (comment) content += comment + ' '; + } + return window.document.createComment(content); + }; + + return compile; + + //================================ + + function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, + previousCompileContext) { + if (!($compileNodes instanceof jqLite)) { + // jquery always rewraps, whereas we need to preserve the original selector so that we can + // modify it. + $compileNodes = jqLite($compileNodes); + } + + var NOT_EMPTY = /\S+/; + + // We can not compile top level text elements since text nodes can be merged and we will + // not be able to attach scope data to them, so we will wrap them in + for (var i = 0, len = $compileNodes.length; i < len; i++) { + var domNode = $compileNodes[i]; + + if (domNode.nodeType === NODE_TYPE_TEXT && domNode.nodeValue.match(NOT_EMPTY) /* non-empty */) { + jqLiteWrapNode(domNode, $compileNodes[i] = window.document.createElement('span')); + } + } + + var compositeLinkFn = + compileNodes($compileNodes, transcludeFn, $compileNodes, + maxPriority, ignoreDirective, previousCompileContext); + compile.$$addScopeClass($compileNodes); + var namespace = null; + return function publicLinkFn(scope, cloneConnectFn, options) { + assertArg(scope, 'scope'); + + if (previousCompileContext && previousCompileContext.needsNewScope) { + // A parent directive did a replace and a directive on this element asked + // for transclusion, which caused us to lose a layer of element on which + // we could hold the new transclusion scope, so we will create it manually + // here. + scope = scope.$parent.$new(); + } + + options = options || {}; + var parentBoundTranscludeFn = options.parentBoundTranscludeFn, + transcludeControllers = options.transcludeControllers, + futureParentElement = options.futureParentElement; + + // When `parentBoundTranscludeFn` is passed, it is a + // `controllersBoundTransclude` function (it was previously passed + // as `transclude` to directive.link) so we must unwrap it to get + // its `boundTranscludeFn` + if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { + parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; + } + + if (!namespace) { + namespace = detectNamespaceForChildElements(futureParentElement); + } + var $linkNode; + if (namespace !== 'html') { + // When using a directive with replace:true and templateUrl the $compileNodes + // (or a child element inside of them) + // might change, so we need to recreate the namespace adapted compileNodes + // for call to the link function. + // Note: This will already clone the nodes... + $linkNode = jqLite( + wrapTemplate(namespace, jqLite('
').append($compileNodes).html()) + ); + } else if (cloneConnectFn) { + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart + // and sometimes changes the structure of the DOM. + $linkNode = JQLitePrototype.clone.call($compileNodes); + } else { + $linkNode = $compileNodes; + } + + if (transcludeControllers) { + for (var controllerName in transcludeControllers) { + $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); + } + } + + compile.$$addScopeInfo($linkNode, scope); + + if (cloneConnectFn) cloneConnectFn($linkNode, scope); + if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); + return $linkNode; + }; + } + + function detectNamespaceForChildElements(parentElement) { + // TODO: Make this detect MathML as well... + var node = parentElement && parentElement[0]; + if (!node) { + return 'html'; + } else { + return nodeName_(node) !== 'foreignobject' && toString.call(node).match(/SVG/) ? 'svg' : 'html'; + } + } + + /** + * Compile function matches each node in nodeList against the directives. Once all directives + * for a particular node are collected their compile functions are executed. The compile + * functions return values - the linking functions - are combined into a composite linking + * function, which is the a linking function for the node. + * + * @param {NodeList} nodeList an array of nodes or NodeList to compile + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new child of the transcluded parent scope. + * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then + * the rootElement must be set the jqLite collection of the compile root. This is + * needed so that the jqLite collection items can be replaced with widgets. + * @param {number=} maxPriority Max directive priority. + * @returns {Function} A composite linking function of all of the matched directives or null. + */ + function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, + previousCompileContext) { + var linkFns = [], + attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; + + for (var i = 0; i < nodeList.length; i++) { + attrs = new Attributes(); + + // we must always refer to nodeList[i] since the nodes can be replaced underneath us. + directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, + ignoreDirective); + + nodeLinkFn = (directives.length) + ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, + null, [], [], previousCompileContext) + : null; + + if (nodeLinkFn && nodeLinkFn.scope) { + compile.$$addScopeClass(attrs.$$element); + } + + childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || + !(childNodes = nodeList[i].childNodes) || + !childNodes.length) + ? null + : compileNodes(childNodes, + nodeLinkFn ? ( + (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) + && nodeLinkFn.transclude) : transcludeFn); + + if (nodeLinkFn || childLinkFn) { + linkFns.push(i, nodeLinkFn, childLinkFn); + linkFnFound = true; + nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; + } + + //use the previous context only for the first element in the virtual group + previousCompileContext = null; + } + + // return a linking function if we have found anything, null otherwise + return linkFnFound ? compositeLinkFn : null; + + function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { + var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; + var stableNodeList; + + + if (nodeLinkFnFound) { + // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our + // offsets don't get screwed up + var nodeListLength = nodeList.length; + stableNodeList = new Array(nodeListLength); + + // create a sparse array by only copying the elements which have a linkFn + for (i = 0; i < linkFns.length; i+=3) { + idx = linkFns[i]; + stableNodeList[idx] = nodeList[idx]; + } + } else { + stableNodeList = nodeList; + } + + for (i = 0, ii = linkFns.length; i < ii;) { + node = stableNodeList[linkFns[i++]]; + nodeLinkFn = linkFns[i++]; + childLinkFn = linkFns[i++]; + + if (nodeLinkFn) { + if (nodeLinkFn.scope) { + childScope = scope.$new(); + compile.$$addScopeInfo(jqLite(node), childScope); + } else { + childScope = scope; + } + + if (nodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn( + scope, nodeLinkFn.transclude, parentBoundTranscludeFn); + + } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { + childBoundTranscludeFn = parentBoundTranscludeFn; + + } else if (!parentBoundTranscludeFn && transcludeFn) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); + + } else { + childBoundTranscludeFn = null; + } + + nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn); + + } else if (childLinkFn) { + childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); + } + } + } + } + + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { + function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { + + if (!transcludedScope) { + transcludedScope = scope.$new(false, containingScope); + transcludedScope.$$transcluded = true; + } + + return transcludeFn(transcludedScope, cloneFn, { + parentBoundTranscludeFn: previousBoundTranscludeFn, + transcludeControllers: controllers, + futureParentElement: futureParentElement + }); + } + + // We need to attach the transclusion slots onto the `boundTranscludeFn` + // so that they are available inside the `controllersBoundTransclude` function + var boundSlots = boundTranscludeFn.$$slots = createMap(); + for (var slotName in transcludeFn.$$slots) { + if (transcludeFn.$$slots[slotName]) { + boundSlots[slotName] = createBoundTranscludeFn(scope, transcludeFn.$$slots[slotName], previousBoundTranscludeFn); + } else { + boundSlots[slotName] = null; + } + } + + return boundTranscludeFn; + } + + /** + * Looks for directives on the given node and adds them to the directive collection which is + * sorted. + * + * @param node Node to search. + * @param directives An array to which the directives are added to. This array is sorted before + * the function returns. + * @param attrs The shared attrs object which is used to populate the normalized attributes. + * @param {number=} maxPriority Max directive priority. + */ + function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { + var nodeType = node.nodeType, + attrsMap = attrs.$attr, + match, + className; + + switch (nodeType) { + case NODE_TYPE_ELEMENT: /* Element */ + // use the node name: + addDirective(directives, + directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); + + // iterate over the attributes + for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { + var attrStartName = false; + var attrEndName = false; + + attr = nAttrs[j]; + name = attr.name; + value = trim(attr.value); + + // support ngAttr attribute binding + ngAttrName = directiveNormalize(name); + if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { + name = name.replace(PREFIX_REGEXP, '') + .substr(8).replace(/_(.)/g, function(match, letter) { + return letter.toUpperCase(); + }); + } + + var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE); + if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) { + attrStartName = name; + attrEndName = name.substr(0, name.length - 5) + 'end'; + name = name.substr(0, name.length - 6); + } + + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + if (isNgAttr || !attrs.hasOwnProperty(nName)) { + attrs[nName] = value; + if (getBooleanAttrName(node, nName)) { + attrs[nName] = true; // presence means true + } + } + addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); + addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, + attrEndName); + } + + // use class as directive + className = node.className; + if (isObject(className)) { + // Maybe SVGAnimatedString + className = className.animVal; + } + if (isString(className) && className !== '') { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); + } + } + break; + case NODE_TYPE_TEXT: /* Text Node */ + if (msie === 11) { + // Workaround for #11781 + while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { + node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } + addTextInterpolateDirective(directives, node.nodeValue); + break; + case NODE_TYPE_COMMENT: /* Comment */ + collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective); + break; + } + + directives.sort(byPriority); + return directives; + } + + function collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective) { + // function created because of performance, try/catch disables + // the optimization of the whole function #14848 + try { + var match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + var nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read + // comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + } + + /** + * Given a node with an directive-start it collects all of the siblings until it finds + * directive-end. + * @param node + * @param attrStart + * @param attrEnd + * @returns {*} + */ + function groupScan(node, attrStart, attrEnd) { + var nodes = []; + var depth = 0; + if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { + do { + if (!node) { + throw $compileMinErr('uterdir', + "Unterminated attribute, found '{0}' but no matching '{1}' found.", + attrStart, attrEnd); + } + if (node.nodeType == NODE_TYPE_ELEMENT) { + if (node.hasAttribute(attrStart)) depth++; + if (node.hasAttribute(attrEnd)) depth--; + } + nodes.push(node); + node = node.nextSibling; + } while (depth > 0); + } else { + nodes.push(node); + } + + return jqLite(nodes); + } + + /** + * Wrapper for linking function which converts normal linking function into a grouped + * linking function. + * @param linkFn + * @param attrStart + * @param attrEnd + * @returns {Function} + */ + function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { + return function groupedElementsLink(scope, element, attrs, controllers, transcludeFn) { + element = groupScan(element[0], attrStart, attrEnd); + return linkFn(scope, element, attrs, controllers, transcludeFn); + }; + } + + /** + * A function generator that is used to support both eager and lazy compilation + * linking function. + * @param eager + * @param $compileNodes + * @param transcludeFn + * @param maxPriority + * @param ignoreDirective + * @param previousCompileContext + * @returns {Function} + */ + function compilationGenerator(eager, $compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) { + var compiled; + + if (eager) { + return compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); + } + return function lazyCompilation() { + if (!compiled) { + compiled = compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); + + // Null out all of these references in order to make them eligible for garbage collection + // since this is a potentially long lived closure + $compileNodes = transcludeFn = previousCompileContext = null; + } + return compiled.apply(this, arguments); + }; + } + + /** + * Once the directives have been collected, their compile functions are executed. This method + * is responsible for inlining directive templates as well as terminating the application + * of the directives if the terminal directive has been reached. + * + * @param {Array} directives Array of collected directives to execute their compile function. + * this needs to be pre-sorted by priority order. + * @param {Node} compileNode The raw DOM node to apply the compile functions to + * @param {Object} templateAttrs The shared attribute function + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new + * child of the transcluded parent scope. + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this + * argument has the root jqLite array so that we can replace nodes + * on it. + * @param {Object=} originalReplaceDirective An optional directive that will be ignored when + * compiling the transclusion. + * @param {Array.} preLinkFns + * @param {Array.} postLinkFns + * @param {Object} previousCompileContext Context used for previous compilation of the current + * node + * @returns {Function} linkFn + */ + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, + jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, + previousCompileContext) { + previousCompileContext = previousCompileContext || {}; + + var terminalPriority = -Number.MAX_VALUE, + newScopeDirective = previousCompileContext.newScopeDirective, + controllerDirectives = previousCompileContext.controllerDirectives, + newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, + templateDirective = previousCompileContext.templateDirective, + nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, + hasTranscludeDirective = false, + hasTemplate = false, + hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, + $compileNode = templateAttrs.$$element = jqLite(compileNode), + directive, + directiveName, + $template, + replaceDirective = originalReplaceDirective, + childTranscludeFn = transcludeFn, + linkFn, + didScanForMultipleTransclusion = false, + mightHaveMultipleTransclusionError = false, + directiveValue; + + // executes all directives on the current element + for (var i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + var attrStart = directive.$$start; + var attrEnd = directive.$$end; + + // collect multiblock sections + if (attrStart) { + $compileNode = groupScan(compileNode, attrStart, attrEnd); + } + $template = undefined; + + if (terminalPriority > directive.priority) { + break; // prevent further processing of directives + } + + if (directiveValue = directive.scope) { + + // skip the check for directives with async templates, we'll check the derived sync + // directive when the template arrives + if (!directive.templateUrl) { + if (isObject(directiveValue)) { + // This directive is trying to add an isolated scope. + // Check that there is no scope of any kind already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, + directive, $compileNode); + newIsolateScopeDirective = directive; + } else { + // This directive is trying to add a child scope. + // Check that there is no isolated scope already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, + $compileNode); + } + } + + newScopeDirective = newScopeDirective || directive; + } + + directiveName = directive.name; + + // If we encounter a condition that can result in transclusion on the directive, + // then scan ahead in the remaining directives for others that may cause a multiple + // transclusion error to be thrown during the compilation process. If a matching directive + // is found, then we know that when we encounter a transcluded directive, we need to eagerly + // compile the `transclude` function rather than doing it lazily in order to throw + // exceptions at the correct time + if (!didScanForMultipleTransclusion && ((directive.replace && (directive.templateUrl || directive.template)) + || (directive.transclude && !directive.$$tlb))) { + var candidateDirective; + + for (var scanningIndex = i + 1; candidateDirective = directives[scanningIndex++];) { + if ((candidateDirective.transclude && !candidateDirective.$$tlb) + || (candidateDirective.replace && (candidateDirective.templateUrl || candidateDirective.template))) { + mightHaveMultipleTransclusionError = true; + break; + } + } + + didScanForMultipleTransclusion = true; + } + + if (!directive.templateUrl && directive.controller) { + directiveValue = directive.controller; + controllerDirectives = controllerDirectives || createMap(); + assertNoDuplicate("'" + directiveName + "' controller", + controllerDirectives[directiveName], directive, $compileNode); + controllerDirectives[directiveName] = directive; + } + + if (directiveValue = directive.transclude) { + hasTranscludeDirective = true; + + // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. + // This option should only be used by directives that know how to safely handle element transclusion, + // where the transcluded nodes are added or replaced after linking. + if (!directive.$$tlb) { + assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); + nonTlbTranscludeDirective = directive; + } + + if (directiveValue == 'element') { + hasElementTranscludeDirective = true; + terminalPriority = directive.priority; + $template = $compileNode; + $compileNode = templateAttrs.$$element = + jqLite(compile.$$createComment(directiveName, templateAttrs[directiveName])); + compileNode = $compileNode[0]; + replaceWith(jqCollection, sliceArgs($template), compileNode); + + // Support: Chrome < 50 + // https://github.com/angular/angular.js/issues/14041 + + // In the versions of V8 prior to Chrome 50, the document fragment that is created + // in the `replaceWith` function is improperly garbage collected despite still + // being referenced by the `parentNode` property of all of the child nodes. By adding + // a reference to the fragment via a different property, we can avoid that incorrect + // behavior. + // TODO: remove this line after Chrome 50 has been released + $template[0].$$parentNode = $template[0].parentNode; + + childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority, + replaceDirective && replaceDirective.name, { + // Don't pass in: + // - controllerDirectives - otherwise we'll create duplicates controllers + // - newIsolateScopeDirective or templateDirective - combining templates with + // element transclusion doesn't make sense. + // + // We need only nonTlbTranscludeDirective so that we prevent putting transclusion + // on the same element more than once. + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + } else { + + var slots = createMap(); + + $template = jqLite(jqLiteClone(compileNode)).contents(); + + if (isObject(directiveValue)) { + + // We have transclusion slots, + // collect them up, compile them and store their transclusion functions + $template = []; + + var slotMap = createMap(); + var filledSlots = createMap(); + + // Parse the element selectors + forEach(directiveValue, function(elementSelector, slotName) { + // If an element selector starts with a ? then it is optional + var optional = (elementSelector.charAt(0) === '?'); + elementSelector = optional ? elementSelector.substring(1) : elementSelector; + + slotMap[elementSelector] = slotName; + + // We explicitly assign `null` since this implies that a slot was defined but not filled. + // Later when calling boundTransclusion functions with a slot name we only error if the + // slot is `undefined` + slots[slotName] = null; + + // filledSlots contains `true` for all slots that are either optional or have been + // filled. This is used to check that we have not missed any required slots + filledSlots[slotName] = optional; + }); + + // Add the matching elements into their slot + forEach($compileNode.contents(), function(node) { + var slotName = slotMap[directiveNormalize(nodeName_(node))]; + if (slotName) { + filledSlots[slotName] = true; + slots[slotName] = slots[slotName] || []; + slots[slotName].push(node); + } else { + $template.push(node); + } + }); + + // Check for required slots that were not filled + forEach(filledSlots, function(filled, slotName) { + if (!filled) { + throw $compileMinErr('reqslot', 'Required transclusion slot `{0}` was not filled.', slotName); + } + }); + + for (var slotName in slots) { + if (slots[slotName]) { + // Only define a transclusion function if the slot was filled + slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn); + } + } + } + + $compileNode.empty(); // clear contents + childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, undefined, + undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope}); + childTranscludeFn.$$slots = slots; + } + } + + if (directive.template) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + directiveValue = (isFunction(directive.template)) + ? directive.template($compileNode, templateAttrs) + : directive.template; + + directiveValue = denormalizeTemplate(directiveValue); + + if (directive.replace) { + replaceDirective = directive; + if (jqLiteIsTextNode(directiveValue)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + directiveName, ''); + } + + replaceWith(jqCollection, $compileNode, compileNode); + + var newTemplateAttrs = {$attr: {}}; + + // combine directives from the original node and from the template: + // - take the array of directives for this element + // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) + // - collect directives from the template and sort them by priority + // - combine directives as: processed + template + unprocessed + var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); + var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); + + if (newIsolateScopeDirective || newScopeDirective) { + // The original directive caused the current element to be replaced but this element + // also needs to have a new scope, so we need to tell the template directives + // that they would need to get their scope from further up, if they require transclusion + markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective); + } + directives = directives.concat(templateDirectives).concat(unprocessedDirectives); + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); + + ii = directives.length; + } else { + $compileNode.html(directiveValue); + } + } + + if (directive.templateUrl) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + if (directive.replace) { + replaceDirective = directive; + } + + /* jshint -W021 */ + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, + /* jshint +W021 */ + templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { + controllerDirectives: controllerDirectives, + newScopeDirective: (newScopeDirective !== directive) && newScopeDirective, + newIsolateScopeDirective: newIsolateScopeDirective, + templateDirective: templateDirective, + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + ii = directives.length; + } else if (directive.compile) { + try { + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); + var context = directive.$$originalDirective || directive; + if (isFunction(linkFn)) { + addLinkFns(null, bind(context, linkFn), attrStart, attrEnd); + } else if (linkFn) { + addLinkFns(bind(context, linkFn.pre), bind(context, linkFn.post), attrStart, attrEnd); + } + } catch (e) { + $exceptionHandler(e, startingTag($compileNode)); + } + } + + if (directive.terminal) { + nodeLinkFn.terminal = true; + terminalPriority = Math.max(terminalPriority, directive.priority); + } + + } + + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; + nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; + nodeLinkFn.templateOnThisElement = hasTemplate; + nodeLinkFn.transclude = childTranscludeFn; + + previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; + + // might be normal or delayed nodeLinkFn depending on if templateUrl is present + return nodeLinkFn; + + //////////////////// + + function addLinkFns(pre, post, attrStart, attrEnd) { + if (pre) { + if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); + pre.require = directive.require; + pre.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + pre = cloneAndAnnotateFn(pre, {isolateScope: true}); + } + preLinkFns.push(pre); + } + if (post) { + if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); + post.require = directive.require; + post.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + post = cloneAndAnnotateFn(post, {isolateScope: true}); + } + postLinkFns.push(post); + } + } + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { + var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element, + attrs, scopeBindingInfo; + + if (compileNode === linkNode) { + attrs = templateAttrs; + $element = templateAttrs.$$element; + } else { + $element = jqLite(linkNode); + attrs = new Attributes($element, templateAttrs); + } + + controllerScope = scope; + if (newIsolateScopeDirective) { + isolateScope = scope.$new(true); + } else if (newScopeDirective) { + controllerScope = scope.$parent; + } + + if (boundTranscludeFn) { + // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` + // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` + transcludeFn = controllersBoundTransclude; + transcludeFn.$$boundTransclude = boundTranscludeFn; + // expose the slots on the `$transclude` function + transcludeFn.isSlotFilled = function(slotName) { + return !!boundTranscludeFn.$$slots[slotName]; + }; + } + + if (controllerDirectives) { + elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective); + } + + if (newIsolateScopeDirective) { + // Initialize isolate scope bindings for new isolate scope directive. + compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || + templateDirective === newIsolateScopeDirective.$$originalDirective))); + compile.$$addScopeClass($element, true); + isolateScope.$$isolateBindings = + newIsolateScopeDirective.$$isolateBindings; + scopeBindingInfo = initializeDirectiveBindings(scope, attrs, isolateScope, + isolateScope.$$isolateBindings, + newIsolateScopeDirective); + if (scopeBindingInfo.removeWatches) { + isolateScope.$on('$destroy', scopeBindingInfo.removeWatches); + } + } + + // Initialize bindToController bindings + for (var name in elementControllers) { + var controllerDirective = controllerDirectives[name]; + var controller = elementControllers[name]; + var bindings = controllerDirective.$$bindings.bindToController; + + if (controller.identifier && bindings) { + controller.bindingInfo = + initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); + } else { + controller.bindingInfo = {}; + } + + var controllerResult = controller(); + if (controllerResult !== controller.instance) { + // If the controller constructor has a return value, overwrite the instance + // from setupControllers + controller.instance = controllerResult; + $element.data('$' + controllerDirective.name + 'Controller', controllerResult); + controller.bindingInfo.removeWatches && controller.bindingInfo.removeWatches(); + controller.bindingInfo = + initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); + } + } + + // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy + forEach(controllerDirectives, function(controllerDirective, name) { + var require = controllerDirective.require; + if (controllerDirective.bindToController && !isArray(require) && isObject(require)) { + extend(elementControllers[name].instance, getControllers(name, require, $element, elementControllers)); + } + }); + + // Handle the init and destroy lifecycle hooks on all controllers that have them + forEach(elementControllers, function(controller) { + var controllerInstance = controller.instance; + if (isFunction(controllerInstance.$onChanges)) { + try { + controllerInstance.$onChanges(controller.bindingInfo.initialChanges); + } catch (e) { + $exceptionHandler(e); + } + } + if (isFunction(controllerInstance.$onInit)) { + try { + controllerInstance.$onInit(); + } catch (e) { + $exceptionHandler(e); + } + } + if (isFunction(controllerInstance.$doCheck)) { + controllerScope.$watch(function() { controllerInstance.$doCheck(); }); + controllerInstance.$doCheck(); + } + if (isFunction(controllerInstance.$onDestroy)) { + controllerScope.$on('$destroy', function callOnDestroyHook() { + controllerInstance.$onDestroy(); + }); + } + }); + + // PRELINKING + for (i = 0, ii = preLinkFns.length; i < ii; i++) { + linkFn = preLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // RECURSION + // We only pass the isolate scope, if the isolate directive has a template, + // otherwise the child elements do not belong to the isolate directive. + var scopeToChild = scope; + if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { + scopeToChild = isolateScope; + } + childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); + + // POSTLINKING + for (i = postLinkFns.length - 1; i >= 0; i--) { + linkFn = postLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // Trigger $postLink lifecycle hooks + forEach(elementControllers, function(controller) { + var controllerInstance = controller.instance; + if (isFunction(controllerInstance.$postLink)) { + controllerInstance.$postLink(); + } + }); + + // This is the function that is injected as `$transclude`. + // Note: all arguments are optional! + function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) { + var transcludeControllers; + // No scope passed in: + if (!isScope(scope)) { + slotName = futureParentElement; + futureParentElement = cloneAttachFn; + cloneAttachFn = scope; + scope = undefined; + } + + if (hasElementTranscludeDirective) { + transcludeControllers = elementControllers; + } + if (!futureParentElement) { + futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; + } + if (slotName) { + // slotTranscludeFn can be one of three things: + // * a transclude function - a filled slot + // * `null` - an optional slot that was not filled + // * `undefined` - a slot that was not declared (i.e. invalid) + var slotTranscludeFn = boundTranscludeFn.$$slots[slotName]; + if (slotTranscludeFn) { + return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } else if (isUndefined(slotTranscludeFn)) { + throw $compileMinErr('noslot', + 'No parent directive that requires a transclusion with slot name "{0}". ' + + 'Element: {1}', + slotName, startingTag($element)); + } + } else { + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } + } + } + } + + function getControllers(directiveName, require, $element, elementControllers) { + var value; + + if (isString(require)) { + var match = require.match(REQUIRE_PREFIX_REGEXP); + var name = require.substring(match[0].length); + var inheritType = match[1] || match[3]; + var optional = match[2] === '?'; + + //If only parents then start at the parent element + if (inheritType === '^^') { + $element = $element.parent(); + //Otherwise attempt getting the controller from elementControllers in case + //the element is transcluded (and has no data) and to avoid .data if possible + } else { + value = elementControllers && elementControllers[name]; + value = value && value.instance; + } + + if (!value) { + var dataName = '$' + name + 'Controller'; + value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); + } + + if (!value && !optional) { + throw $compileMinErr('ctreq', + "Controller '{0}', required by directive '{1}', can't be found!", + name, directiveName); + } + } else if (isArray(require)) { + value = []; + for (var i = 0, ii = require.length; i < ii; i++) { + value[i] = getControllers(directiveName, require[i], $element, elementControllers); + } + } else if (isObject(require)) { + value = {}; + forEach(require, function(controller, property) { + value[property] = getControllers(directiveName, controller, $element, elementControllers); + }); + } + + return value || null; + } + + function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective) { + var elementControllers = createMap(); + for (var controllerKey in controllerDirectives) { + var directive = controllerDirectives[controllerKey]; + var locals = { + $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, + $element: $element, + $attrs: attrs, + $transclude: transcludeFn + }; + + var controller = directive.controller; + if (controller == '@') { + controller = attrs[directive.name]; + } + + var controllerInstance = $controller(controller, locals, true, directive.controllerAs); + + // For directives with element transclusion the element is a comment. + // In this case .data will not attach any data. + // Instead, we save the controllers for the element in a local hash and attach to .data + // later, once we have the actual element. + elementControllers[directive.name] = controllerInstance; + $element.data('$' + directive.name + 'Controller', controllerInstance.instance); + } + return elementControllers; + } + + // Depending upon the context in which a directive finds itself it might need to have a new isolated + // or child scope created. For instance: + // * if the directive has been pulled into a template because another directive with a higher priority + // asked for element transclusion + // * if the directive itself asks for transclusion but it is at the root of a template and the original + // element was replaced. See https://github.com/angular/angular.js/issues/12936 + function markDirectiveScope(directives, isolateScope, newScope) { + for (var j = 0, jj = directives.length; j < jj; j++) { + directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope}); + } + } + + /** + * looks up the directive and decorates it with exception handling and proper parameters. We + * call this the boundDirective. + * + * @param {string} name name of the directive to look up. + * @param {string} location The directive must be found in specific format. + * String containing any of theses characters: + * + * * `E`: element name + * * `A': attribute + * * `C`: class + * * `M`: comment + * @returns {boolean} true if directive was added. + */ + function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, + endAttrName) { + if (name === ignoreDirective) return null; + var match = null; + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + try { + directive = directives[i]; + if ((isUndefined(maxPriority) || maxPriority > directive.priority) && + directive.restrict.indexOf(location) != -1) { + if (startAttrName) { + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); + } + if (!directive.$$bindings) { + var bindings = directive.$$bindings = + parseDirectiveBindings(directive, directive.name); + if (isObject(bindings.isolateScope)) { + directive.$$isolateBindings = bindings.isolateScope; + } + } + tDirectives.push(directive); + match = directive; + } + } catch (e) { $exceptionHandler(e); } + } + } + return match; + } + + + /** + * looks up the directive and returns true if it is a multi-element directive, + * and therefore requires DOM nodes between -start and -end markers to be grouped + * together. + * + * @param {string} name name of the directive to look up. + * @returns true if directive was registered as multi-element. + */ + function directiveIsMultiElement(name) { + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + if (directive.multiElement) { + return true; + } + } + } + return false; + } + + /** + * When the element is replaced with HTML template then the new attributes + * on the template need to be merged with the existing attributes in the DOM. + * The desired effect is to have both of the attributes present. + * + * @param {object} dst destination attributes (original DOM) + * @param {object} src source attributes (from the directive template) + */ + function mergeTemplateAttributes(dst, src) { + var srcAttr = src.$attr, + dstAttr = dst.$attr, + $element = dst.$$element; + + // reapply the old attributes to the new element + forEach(dst, function(value, key) { + if (key.charAt(0) != '$') { + if (src[key] && src[key] !== value) { + value += (key === 'style' ? ';' : ' ') + src[key]; + } + dst.$set(key, value, true, srcAttr[key]); + } + }); + + // copy the new attributes on the old attrs object + forEach(src, function(value, key) { + // Check if we already set this attribute in the loop above. + // `dst` will never contain hasOwnProperty as DOM parser won't let it. + // You will get an "InvalidCharacterError: DOM Exception 5" error if you + // have an attribute like "has-own-property" or "data-has-own-property", etc. + if (!dst.hasOwnProperty(key) && key.charAt(0) !== '$') { + dst[key] = value; + + if (key !== 'class' && key !== 'style') { + dstAttr[key] = srcAttr[key]; + } + } + }); + } + + + function compileTemplateUrl(directives, $compileNode, tAttrs, + $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { + var linkQueue = [], + afterTemplateNodeLinkFn, + afterTemplateChildLinkFn, + beforeTemplateCompileNode = $compileNode[0], + origAsyncDirective = directives.shift(), + derivedSyncDirective = inherit(origAsyncDirective, { + templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective + }), + templateUrl = (isFunction(origAsyncDirective.templateUrl)) + ? origAsyncDirective.templateUrl($compileNode, tAttrs) + : origAsyncDirective.templateUrl, + templateNamespace = origAsyncDirective.templateNamespace; + + $compileNode.empty(); + + $templateRequest(templateUrl) + .then(function(content) { + var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; + + content = denormalizeTemplate(content); + + if (origAsyncDirective.replace) { + if (jqLiteIsTextNode(content)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(templateNamespace, trim(content))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + origAsyncDirective.name, templateUrl); + } + + tempTemplateAttrs = {$attr: {}}; + replaceWith($rootElement, $compileNode, compileNode); + var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); + + if (isObject(origAsyncDirective.scope)) { + // the original directive that caused the template to be loaded async required + // an isolate scope + markDirectiveScope(templateDirectives, true); + } + directives = templateDirectives.concat(directives); + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); + } else { + compileNode = beforeTemplateCompileNode; + $compileNode.html(content); + } + + directives.unshift(derivedSyncDirective); + + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, + childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, + previousCompileContext); + forEach($rootElement, function(node, i) { + if (node == compileNode) { + $rootElement[i] = $compileNode[0]; + } + }); + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); + + while (linkQueue.length) { + var scope = linkQueue.shift(), + beforeTemplateLinkNode = linkQueue.shift(), + linkRootElement = linkQueue.shift(), + boundTranscludeFn = linkQueue.shift(), + linkNode = $compileNode[0]; + + if (scope.$$destroyed) continue; + + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { + var oldClasses = beforeTemplateLinkNode.className; + + if (!(previousCompileContext.hasElementTranscludeDirective && + origAsyncDirective.replace)) { + // it was cloned therefore we have to clone as well. + linkNode = jqLiteClone(compileNode); + } + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); + + // Copy in CSS classes from original node + safeAddClass(jqLite(linkNode), oldClasses); + } + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } else { + childBoundTranscludeFn = boundTranscludeFn; + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, + childBoundTranscludeFn); + } + linkQueue = null; + }); + + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { + var childBoundTranscludeFn = boundTranscludeFn; + if (scope.$$destroyed) return; + if (linkQueue) { + linkQueue.push(scope, + node, + rootElement, + childBoundTranscludeFn); + } else { + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); + } + }; + } + + + /** + * Sorting function for bound directives. + */ + function byPriority(a, b) { + var diff = b.priority - a.priority; + if (diff !== 0) return diff; + if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; + return a.index - b.index; + } + + function assertNoDuplicate(what, previousDirective, directive, element) { + + function wrapModuleNameIfDefined(moduleName) { + return moduleName ? + (' (module: ' + moduleName + ')') : + ''; + } + + if (previousDirective) { + throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}', + previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName), + directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element)); + } + } + + + function addTextInterpolateDirective(directives, text) { + var interpolateFn = $interpolate(text, true); + if (interpolateFn) { + directives.push({ + priority: 0, + compile: function textInterpolateCompileFn(templateNode) { + var templateNodeParent = templateNode.parent(), + hasCompileParent = !!templateNodeParent.length; + + // When transcluding a template that has bindings in the root + // we don't have a parent and thus need to add the class during linking fn. + if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); + + return function textInterpolateLinkFn(scope, node) { + var parent = node.parent(); + if (!hasCompileParent) compile.$$addBindingClass(parent); + compile.$$addBindingInfo(parent, interpolateFn.expressions); + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { + node[0].nodeValue = value; + }); + }; + } + }); + } + } + + + function wrapTemplate(type, template) { + type = lowercase(type || 'html'); + switch (type) { + case 'svg': + case 'math': + var wrapper = window.document.createElement('div'); + wrapper.innerHTML = '<' + type + '>' + template + ''; + return wrapper.childNodes[0].childNodes; + default: + return template; + } + } + + + function getTrustedContext(node, attrNormalizedName) { + if (attrNormalizedName == "srcdoc") { + return $sce.HTML; + } + var tag = nodeName_(node); + // maction[xlink:href] can source SVG. It's not limited to . + if (attrNormalizedName == "xlinkHref" || + (tag == "form" && attrNormalizedName == "action") || + (tag != "img" && (attrNormalizedName == "src" || + attrNormalizedName == "ngSrc"))) { + return $sce.RESOURCE_URL; + } + } + + + function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { + var trustedContext = getTrustedContext(node, name); + allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; + + var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); + + // no interpolation found -> ignore + if (!interpolateFn) return; + + + if (name === "multiple" && nodeName_(node) === "select") { + throw $compileMinErr("selmulti", + "Binding to the 'multiple' attribute is not supported. Element: {0}", + startingTag(node)); + } + + directives.push({ + priority: 100, + compile: function() { + return { + pre: function attrInterpolatePreLinkFn(scope, element, attr) { + var $$observers = (attr.$$observers || (attr.$$observers = createMap())); + + if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { + throw $compileMinErr('nodomevents', + "Interpolations for HTML DOM event attributes are disallowed. Please use the " + + "ng- versions (such as ng-click instead of onclick) instead."); + } + + // If the attribute has changed since last $interpolate()ed + var newValue = attr[name]; + if (newValue !== value) { + // we need to interpolate again since the attribute value has been updated + // (e.g. by another directive's compile function) + // ensure unset/empty values make interpolateFn falsy + interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); + value = newValue; + } + + // if attribute was updated so that there is no interpolation going on we don't want to + // register any observers + if (!interpolateFn) return; + + // initialize attr object so that it's ready in case we need the value for isolate + // scope initialization, otherwise the value would not be available from isolate + // directive's linking fn during linking phase + attr[name] = interpolateFn(scope); + + ($$observers[name] || ($$observers[name] = [])).$$inter = true; + (attr.$$observers && attr.$$observers[name].$$scope || scope). + $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { + //special case for class attribute addition + removal + //so that class changes can tap into the animation + //hooks provided by the $animate service. Be sure to + //skip animations when the first digest occurs (when + //both the new and the old values are the same) since + //the CSS classes are the non-interpolated values + if (name === 'class' && newValue != oldValue) { + attr.$updateClass(newValue, oldValue); + } else { + attr.$set(name, newValue); + } + }); + } + }; + } + }); + } + + + /** + * This is a special jqLite.replaceWith, which can replace items which + * have no parents, provided that the containing jqLite collection is provided. + * + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes + * in the root of the tree. + * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep + * the shell, but replace its DOM node reference. + * @param {Node} newNode The new DOM node. + */ + function replaceWith($rootElement, elementsToRemove, newNode) { + var firstElementToRemove = elementsToRemove[0], + removeCount = elementsToRemove.length, + parent = firstElementToRemove.parentNode, + i, ii; + + if ($rootElement) { + for (i = 0, ii = $rootElement.length; i < ii; i++) { + if ($rootElement[i] == firstElementToRemove) { + $rootElement[i++] = newNode; + for (var j = i, j2 = j + removeCount - 1, + jj = $rootElement.length; + j < jj; j++, j2++) { + if (j2 < jj) { + $rootElement[j] = $rootElement[j2]; + } else { + delete $rootElement[j]; + } + } + $rootElement.length -= removeCount - 1; + + // If the replaced element is also the jQuery .context then replace it + // .context is a deprecated jQuery api, so we should set it only when jQuery set it + // http://api.jquery.com/context/ + if ($rootElement.context === firstElementToRemove) { + $rootElement.context = newNode; + } + break; + } + } + } + + if (parent) { + parent.replaceChild(newNode, firstElementToRemove); + } + + // Append all the `elementsToRemove` to a fragment. This will... + // - remove them from the DOM + // - allow them to still be traversed with .nextSibling + // - allow a single fragment.qSA to fetch all elements being removed + var fragment = window.document.createDocumentFragment(); + for (i = 0; i < removeCount; i++) { + fragment.appendChild(elementsToRemove[i]); + } + + if (jqLite.hasData(firstElementToRemove)) { + // Copy over user data (that includes Angular's $scope etc.). Don't copy private + // data here because there's no public interface in jQuery to do that and copying over + // event listeners (which is the main use of private data) wouldn't work anyway. + jqLite.data(newNode, jqLite.data(firstElementToRemove)); + + // Remove $destroy event listeners from `firstElementToRemove` + jqLite(firstElementToRemove).off('$destroy'); + } + + // Cleanup any data/listeners on the elements and children. + // This includes invoking the $destroy event on any elements with listeners. + jqLite.cleanData(fragment.querySelectorAll('*')); + + // Update the jqLite collection to only contain the `newNode` + for (i = 1; i < removeCount; i++) { + delete elementsToRemove[i]; + } + elementsToRemove[0] = newNode; + elementsToRemove.length = 1; + } + + + function cloneAndAnnotateFn(fn, annotation) { + return extend(function() { return fn.apply(null, arguments); }, fn, annotation); + } + + + function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { + try { + linkFn(scope, $element, attrs, controllers, transcludeFn); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + + // Set up $watches for isolate scope and controller bindings. This process + // only occurs for isolate scopes and new scopes with controllerAs. + function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) { + var removeWatchCollection = []; + var initialChanges = {}; + var changes; + forEach(bindings, function initializeBinding(definition, scopeName) { + var attrName = definition.attrName, + optional = definition.optional, + mode = definition.mode, // @, =, <, or & + lastValue, + parentGet, parentSet, compare, removeWatch; + + switch (mode) { + + case '@': + if (!optional && !hasOwnProperty.call(attrs, attrName)) { + destination[scopeName] = attrs[attrName] = void 0; + } + attrs.$observe(attrName, function(value) { + if (isString(value) || isBoolean(value)) { + var oldValue = destination[scopeName]; + recordChanges(scopeName, value, oldValue); + destination[scopeName] = value; + } + }); + attrs.$$observers[attrName].$$scope = scope; + lastValue = attrs[attrName]; + if (isString(lastValue)) { + // If the attribute has been provided then we trigger an interpolation to ensure + // the value is there for use in the link fn + destination[scopeName] = $interpolate(lastValue)(scope); + } else if (isBoolean(lastValue)) { + // If the attributes is one of the BOOLEAN_ATTR then Angular will have converted + // the value to boolean rather than a string, so we special case this situation + destination[scopeName] = lastValue; + } + initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]); + break; + + case '=': + if (!hasOwnProperty.call(attrs, attrName)) { + if (optional) break; + attrs[attrName] = void 0; + } + if (optional && !attrs[attrName]) break; + + parentGet = $parse(attrs[attrName]); + if (parentGet.literal) { + compare = equals; + } else { + compare = function simpleCompare(a, b) { return a === b || (a !== a && b !== b); }; + } + parentSet = parentGet.assign || function() { + // reset the change, or we will throw this exception on every $digest + lastValue = destination[scopeName] = parentGet(scope); + throw $compileMinErr('nonassign', + "Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!", + attrs[attrName], attrName, directive.name); + }; + lastValue = destination[scopeName] = parentGet(scope); + var parentValueWatch = function parentValueWatch(parentValue) { + if (!compare(parentValue, destination[scopeName])) { + // we are out of sync and need to copy + if (!compare(parentValue, lastValue)) { + // parent changed and it has precedence + destination[scopeName] = parentValue; + } else { + // if the parent can be assigned then do so + parentSet(scope, parentValue = destination[scopeName]); + } + } + return lastValue = parentValue; + }; + parentValueWatch.$stateful = true; + if (definition.collection) { + removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch); + } else { + removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); + } + removeWatchCollection.push(removeWatch); + break; + + case '<': + if (!hasOwnProperty.call(attrs, attrName)) { + if (optional) break; + attrs[attrName] = void 0; + } + if (optional && !attrs[attrName]) break; + + parentGet = $parse(attrs[attrName]); + + var initialValue = destination[scopeName] = parentGet(scope); + initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]); + + removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) { + if (oldValue === newValue) { + if (oldValue === initialValue) return; + oldValue = initialValue; + } + recordChanges(scopeName, newValue, oldValue); + destination[scopeName] = newValue; + }, parentGet.literal); + + removeWatchCollection.push(removeWatch); + break; + + case '&': + // Don't assign Object.prototype method to scope + parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop; + + // Don't assign noop to destination if expression is not valid + if (parentGet === noop && optional) break; + + destination[scopeName] = function(locals) { + return parentGet(scope, locals); + }; + break; + } + }); + + function recordChanges(key, currentValue, previousValue) { + if (isFunction(destination.$onChanges) && currentValue !== previousValue) { + // If we have not already scheduled the top level onChangesQueue handler then do so now + if (!onChangesQueue) { + scope.$$postDigest(flushOnChangesQueue); + onChangesQueue = []; + } + // If we have not already queued a trigger of onChanges for this controller then do so now + if (!changes) { + changes = {}; + onChangesQueue.push(triggerOnChangesHook); + } + // If the has been a change on this property already then we need to reuse the previous value + if (changes[key]) { + previousValue = changes[key].previousValue; + } + // Store this change + changes[key] = new SimpleChange(previousValue, currentValue); + } + } + + function triggerOnChangesHook() { + destination.$onChanges(changes); + // Now clear the changes so that we schedule onChanges when more changes arrive + changes = undefined; + } + + return { + initialChanges: initialChanges, + removeWatches: removeWatchCollection.length && function removeWatches() { + for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) { + removeWatchCollection[i](); + } + } + }; + } + }]; +} + +function SimpleChange(previous, current) { + this.previousValue = previous; + this.currentValue = current; +} +SimpleChange.prototype.isFirstChange = function() { return this.previousValue === _UNINITIALIZED_VALUE; }; + + +var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; +/** + * Converts all accepted directives format into proper directive name. + * @param name Name to normalize + */ +function directiveNormalize(name) { + return camelCase(name.replace(PREFIX_REGEXP, '')); +} + +/** + * @ngdoc type + * @name $compile.directive.Attributes + * + * @description + * A shared object between directive compile / linking functions which contains normalized DOM + * element attributes. The values reflect current binding state `{{ }}`. The normalization is + * needed since all of these are treated as equivalent in Angular: + * + * ``` + * + * ``` + */ + +/** + * @ngdoc property + * @name $compile.directive.Attributes#$attr + * + * @description + * A map of DOM element attribute names to the normalized name. This is + * needed to do reverse lookup from normalized name back to actual name. + */ + + +/** + * @ngdoc method + * @name $compile.directive.Attributes#$set + * @kind function + * + * @description + * Set DOM element attribute value. + * + * + * @param {string} name Normalized element attribute name of the property to modify. The name is + * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} + * property to the original name. + * @param {string} value Value to set the attribute to. The value can be an interpolated string. + */ + + + +/** + * Closure compiler type information + */ + +function nodesetLinkingFn( + /* angular.Scope */ scope, + /* NodeList */ nodeList, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function directiveLinkingFn( + /* nodesetLinkingFn */ nodesetLinkingFn, + /* angular.Scope */ scope, + /* Node */ node, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function tokenDifference(str1, str2) { + var values = '', + tokens1 = str1.split(/\s+/), + tokens2 = str2.split(/\s+/); + + outer: + for (var i = 0; i < tokens1.length; i++) { + var token = tokens1[i]; + for (var j = 0; j < tokens2.length; j++) { + if (token == tokens2[j]) continue outer; + } + values += (values.length > 0 ? ' ' : '') + token; + } + return values; +} + +function removeComments(jqNodes) { + jqNodes = jqLite(jqNodes); + var i = jqNodes.length; + + if (i <= 1) { + return jqNodes; + } + + while (i--) { + var node = jqNodes[i]; + if (node.nodeType === NODE_TYPE_COMMENT) { + splice.call(jqNodes, i, 1); + } + } + return jqNodes; +} + +var $controllerMinErr = minErr('$controller'); + + +var CNTRL_REG = /^(\S+)(\s+as\s+([\w$]+))?$/; +function identifierForController(controller, ident) { + if (ident && isString(ident)) return ident; + if (isString(controller)) { + var match = CNTRL_REG.exec(controller); + if (match) return match[3]; + } +} + + +/** + * @ngdoc provider + * @name $controllerProvider + * @description + * The {@link ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link ng.$controllerProvider#register register} method. + */ +function $ControllerProvider() { + var controllers = {}, + globals = false; + + /** + * @ngdoc method + * @name $controllerProvider#has + * @param {string} name Controller name to check. + */ + this.has = function(name) { + return controllers.hasOwnProperty(name); + }; + + /** + * @ngdoc method + * @name $controllerProvider#register + * @param {string|Object} name Controller name, or an object map of controllers where the keys are + * the names and the values are the constructors. + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI + * annotations in the array notation). + */ + this.register = function(name, constructor) { + assertNotHasOwnProperty(name, 'controller'); + if (isObject(name)) { + extend(controllers, name); + } else { + controllers[name] = constructor; + } + }; + + /** + * @ngdoc method + * @name $controllerProvider#allowGlobals + * @description If called, allows `$controller` to find controller constructors on `window` + */ + this.allowGlobals = function() { + globals = true; + }; + + + this.$get = ['$injector', '$window', function($injector, $window) { + + /** + * @ngdoc service + * @name $controller + * @requires $injector + * + * @param {Function|string} constructor If called with a function then it's considered to be the + * controller constructor function. Otherwise it's considered to be a string which is used + * to retrieve the controller constructor using the following steps: + * + * * check if a controller with given name is registered via `$controllerProvider` + * * check if evaluating the string on the current scope returns a constructor + * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global + * `window` object (not recommended) + * + * The string can use the `controller as property` syntax, where the controller instance is published + * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this + * to work correctly. + * + * @param {Object} locals Injection locals for Controller. + * @return {Object} Instance of given controller. + * + * @description + * `$controller` service is responsible for instantiating controllers. + * + * It's just a simple call to {@link auto.$injector $injector}, but extracted into + * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). + */ + return function $controller(expression, locals, later, ident) { + // PRIVATE API: + // param `later` --- indicates that the controller's constructor is invoked at a later time. + // If true, $controller will allocate the object with the correct + // prototype chain, but will not invoke the controller until a returned + // callback is invoked. + // param `ident` --- An optional label which overrides the label parsed from the controller + // expression, if any. + var instance, match, constructor, identifier; + later = later === true; + if (ident && isString(ident)) { + identifier = ident; + } + + if (isString(expression)) { + match = expression.match(CNTRL_REG); + if (!match) { + throw $controllerMinErr('ctrlfmt', + "Badly formed controller string '{0}'. " + + "Must match `__name__ as __id__` or `__name__`.", expression); + } + constructor = match[1], + identifier = identifier || match[3]; + expression = controllers.hasOwnProperty(constructor) + ? controllers[constructor] + : getter(locals.$scope, constructor, true) || + (globals ? getter($window, constructor, true) : undefined); + + assertArgFn(expression, constructor, true); + } + + if (later) { + // Instantiate controller later: + // This machinery is used to create an instance of the object before calling the + // controller's constructor itself. + // + // This allows properties to be added to the controller before the constructor is + // invoked. Primarily, this is used for isolate scope bindings in $compile. + // + // This feature is not intended for use by applications, and is thus not documented + // publicly. + // Object creation: http://jsperf.com/create-constructor/2 + var controllerPrototype = (isArray(expression) ? + expression[expression.length - 1] : expression).prototype; + instance = Object.create(controllerPrototype || null); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + var instantiate; + return instantiate = extend(function $controllerInit() { + var result = $injector.invoke(expression, instance, locals, constructor); + if (result !== instance && (isObject(result) || isFunction(result))) { + instance = result; + if (identifier) { + // If result changed, re-assign controllerAs value to scope. + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + } + return instance; + }, { + instance: instance, + identifier: identifier + }); + } + + instance = $injector.instantiate(expression, locals, constructor); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + return instance; + }; + + function addIdentifier(locals, identifier, instance, name) { + if (!(locals && isObject(locals.$scope))) { + throw minErr('$controller')('noscp', + "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", + name, identifier); + } + + locals.$scope[identifier] = instance; + } + }]; +} + +/** + * @ngdoc service + * @name $document + * @requires $window + * + * @description + * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. + * + * @example + + +
+

$document title:

+

window.document title:

+
+
+ + angular.module('documentExample', []) + .controller('ExampleController', ['$scope', '$document', function($scope, $document) { + $scope.title = $document[0].title; + $scope.windowTitle = angular.element(window.document)[0].title; + }]); + +
+ */ +function $DocumentProvider() { + this.$get = ['$window', function(window) { + return jqLite(window.document); + }]; +} + +/** + * @ngdoc service + * @name $exceptionHandler + * @requires ng.$log + * + * @description + * Any uncaught exception in angular expressions is delegated to this service. + * The default implementation simply delegates to `$log.error` which logs it into + * the browser console. + * + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. + * + * ## Example: + * + * The example below will overwrite the default `$exceptionHandler` in order to (a) log uncaught + * errors to the backend for later inspection by the developers and (b) to use `$log.warn()` instead + * of `$log.error()`. + * + * ```js + * angular. + * module('exceptionOverwrite', []). + * factory('$exceptionHandler', ['$log', 'logErrorsToBackend', function($log, logErrorsToBackend) { + * return function myExceptionHandler(exception, cause) { + * logErrorsToBackend(exception, cause); + * $log.warn(exception, cause); + * }; + * }]); + * ``` + * + *
+ * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` + * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} + * (unless executed during a digest). + * + * If you wish, you can manually delegate exceptions, e.g. + * `try { ... } catch(e) { $exceptionHandler(e); }` + * + * @param {Error} exception Exception associated with the error. + * @param {string=} cause Optional information about the context in which + * the error was thrown. + * + */ +function $ExceptionHandlerProvider() { + this.$get = ['$log', function($log) { + return function(exception, cause) { + $log.error.apply($log, arguments); + }; + }]; +} + +var $$ForceReflowProvider = function() { + this.$get = ['$document', function($document) { + return function(domNode) { + //the line below will force the browser to perform a repaint so + //that all the animated elements within the animation frame will + //be properly updated and drawn on screen. This is required to + //ensure that the preparation animation is properly flushed so that + //the active state picks up from there. DO NOT REMOVE THIS LINE. + //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH + //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND + //WILL TAKE YEARS AWAY FROM YOUR LIFE. + if (domNode) { + if (!domNode.nodeType && domNode instanceof jqLite) { + domNode = domNode[0]; + } + } else { + domNode = $document[0].body; + } + return domNode.offsetWidth + 1; + }; + }]; +}; + +var APPLICATION_JSON = 'application/json'; +var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; +var JSON_START = /^\[|^\{(?!\{)/; +var JSON_ENDS = { + '[': /]$/, + '{': /}$/ +}; +var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; +var $httpMinErr = minErr('$http'); +var $httpMinErrLegacyFn = function(method) { + return function() { + throw $httpMinErr('legacy', 'The method `{0}` on the promise returned from `$http` has been disabled.', method); + }; +}; + +function serializeValue(v) { + if (isObject(v)) { + return isDate(v) ? v.toISOString() : toJson(v); + } + return v; +} + + +function $HttpParamSerializerProvider() { + /** + * @ngdoc service + * @name $httpParamSerializer + * @description + * + * Default {@link $http `$http`} params serializer that converts objects to strings + * according to the following rules: + * + * * `{'foo': 'bar'}` results in `foo=bar` + * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) + * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) + * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D` (stringified and encoded representation of an object) + * + * Note that serializer will sort the request parameters alphabetically. + * */ + + this.$get = function() { + return function ngParamSerializer(params) { + if (!params) return ''; + var parts = []; + forEachSorted(params, function(value, key) { + if (value === null || isUndefined(value)) return; + if (isArray(value)) { + forEach(value, function(v) { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); + }); + } else { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); + } + }); + + return parts.join('&'); + }; + }; +} + +function $HttpParamSerializerJQLikeProvider() { + /** + * @ngdoc service + * @name $httpParamSerializerJQLike + * @description + * + * Alternative {@link $http `$http`} params serializer that follows + * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic. + * The serializer will also sort the params alphabetically. + * + * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property: + * + * ```js + * $http({ + * url: myUrl, + * method: 'GET', + * params: myParams, + * paramSerializer: '$httpParamSerializerJQLike' + * }); + * ``` + * + * It is also possible to set it as the default `paramSerializer` in the + * {@link $httpProvider#defaults `$httpProvider`}. + * + * Additionally, you can inject the serializer and use it explicitly, for example to serialize + * form data for submission: + * + * ```js + * .controller(function($http, $httpParamSerializerJQLike) { + * //... + * + * $http({ + * url: myUrl, + * method: 'POST', + * data: $httpParamSerializerJQLike(myData), + * headers: { + * 'Content-Type': 'application/x-www-form-urlencoded' + * } + * }); + * + * }); + * ``` + * + * */ + this.$get = function() { + return function jQueryLikeParamSerializer(params) { + if (!params) return ''; + var parts = []; + serialize(params, '', true); + return parts.join('&'); + + function serialize(toSerialize, prefix, topLevel) { + if (toSerialize === null || isUndefined(toSerialize)) return; + if (isArray(toSerialize)) { + forEach(toSerialize, function(value, index) { + serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']'); + }); + } else if (isObject(toSerialize) && !isDate(toSerialize)) { + forEachSorted(toSerialize, function(value, key) { + serialize(value, prefix + + (topLevel ? '' : '[') + + key + + (topLevel ? '' : ']')); + }); + } else { + parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); + } + } + }; + }; +} + +function defaultHttpResponseTransform(data, headers) { + if (isString(data)) { + // Strip json vulnerability protection prefix and trim whitespace + var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); + + if (tempData) { + var contentType = headers('Content-Type'); + if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { + data = fromJson(tempData); + } + } + } + + return data; +} + +function isJsonLike(str) { + var jsonStart = str.match(JSON_START); + return jsonStart && JSON_ENDS[jsonStart[0]].test(str); +} + +/** + * Parse headers into key value object + * + * @param {string} headers Raw headers as a string + * @returns {Object} Parsed headers as key value object + */ +function parseHeaders(headers) { + var parsed = createMap(), i; + + function fillInParsed(key, val) { + if (key) { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + + if (isString(headers)) { + forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1))); + }); + } else if (isObject(headers)) { + forEach(headers, function(headerVal, headerKey) { + fillInParsed(lowercase(headerKey), trim(headerVal)); + }); + } + + return parsed; +} + + +/** + * Returns a function that provides access to parsed headers. + * + * Headers are lazy parsed when first requested. + * @see parseHeaders + * + * @param {(string|Object)} headers Headers to provide access to. + * @returns {function(string=)} Returns a getter function which if called with: + * + * - if called with single an argument returns a single header value or null + * - if called with no arguments returns an object containing all headers. + */ +function headersGetter(headers) { + var headersObj; + + return function(name) { + if (!headersObj) headersObj = parseHeaders(headers); + + if (name) { + var value = headersObj[lowercase(name)]; + if (value === void 0) { + value = null; + } + return value; + } + + return headersObj; + }; +} + + +/** + * Chain all given functions + * + * This function is used for both request and response transforming + * + * @param {*} data Data to transform. + * @param {function(string=)} headers HTTP headers getter fn. + * @param {number} status HTTP status code of the response. + * @param {(Function|Array.)} fns Function or an array of functions. + * @returns {*} Transformed data. + */ +function transformData(data, headers, status, fns) { + if (isFunction(fns)) { + return fns(data, headers, status); + } + + forEach(fns, function(fn) { + data = fn(data, headers, status); + }); + + return data; +} + + +function isSuccess(status) { + return 200 <= status && status < 300; +} + + +/** + * @ngdoc provider + * @name $httpProvider + * @description + * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. + * */ +function $HttpProvider() { + /** + * @ngdoc property + * @name $httpProvider#defaults + * @description + * + * Object containing default values for all {@link ng.$http $http} requests. + * + * - **`defaults.cache`** - {boolean|Object} - A boolean value or object created with + * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses + * by default. See {@link $http#caching $http Caching} for more information. + * + * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. + * Defaults value is `'XSRF-TOKEN'`. + * + * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the + * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. + * + * - **`defaults.headers`** - {Object} - Default headers for all $http requests. + * Refer to {@link ng.$http#setting-http-headers $http} for documentation on + * setting default headers. + * - **`defaults.headers.common`** + * - **`defaults.headers.post`** + * - **`defaults.headers.put`** + * - **`defaults.headers.patch`** + * + * + * - **`defaults.paramSerializer`** - `{string|function(Object):string}` - A function + * used to the prepare string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}. + * Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}. + * + **/ + var defaults = this.defaults = { + // transform incoming response data + transformResponse: [defaultHttpResponseTransform], + + // transform outgoing request data + transformRequest: [function(d) { + return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; + }], + + // default headers + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + }, + post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) + }, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + paramSerializer: '$httpParamSerializer' + }; + + var useApplyAsync = false; + /** + * @ngdoc method + * @name $httpProvider#useApplyAsync + * @description + * + * Configure $http service to combine processing of multiple http responses received at around + * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in + * significant performance improvement for bigger applications that make many HTTP requests + * concurrently (common during application bootstrap). + * + * Defaults to false. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred + * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window + * to load and share the same digest cycle. + * + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + **/ + this.useApplyAsync = function(value) { + if (isDefined(value)) { + useApplyAsync = !!value; + return this; + } + return useApplyAsync; + }; + + var useLegacyPromise = true; + /** + * @ngdoc method + * @name $httpProvider#useLegacyPromiseExtensions + * @description + * + * Configure `$http` service to return promises without the shorthand methods `success` and `error`. + * This should be used to make sure that applications work without these methods. + * + * Defaults to true. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, `$http` will return a promise with the deprecated legacy `success` and `error` methods. + * + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + **/ + this.useLegacyPromiseExtensions = function(value) { + if (isDefined(value)) { + useLegacyPromise = !!value; + return this; + } + return useLegacyPromise; + }; + + /** + * @ngdoc property + * @name $httpProvider#interceptors + * @description + * + * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} + * pre-processing of request or postprocessing of responses. + * + * These service factories are ordered by request, i.e. they are applied in the same order as the + * array, on request, but reverse order, on response. + * + * {@link ng.$http#interceptors Interceptors detailed info} + **/ + var interceptorFactories = this.interceptors = []; + + this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', + function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { + + var defaultCache = $cacheFactory('$http'); + + /** + * Make sure that default param serializer is exposed as a function + */ + defaults.paramSerializer = isString(defaults.paramSerializer) ? + $injector.get(defaults.paramSerializer) : defaults.paramSerializer; + + /** + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. + * The reversal is needed so that we can build up the interception chain around the + * server request. + */ + var reversedInterceptors = []; + + forEach(interceptorFactories, function(interceptorFactory) { + reversedInterceptors.unshift(isString(interceptorFactory) + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); + }); + + /** + * @ngdoc service + * @kind function + * @name $http + * @requires ng.$httpBackend + * @requires $cacheFactory + * @requires $rootScope + * @requires $q + * @requires $injector + * + * @description + * The `$http` service is a core Angular service that facilitates communication with the remote + * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) + * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). + * + * For unit testing applications that use `$http` service, see + * {@link ngMock.$httpBackend $httpBackend mock}. + * + * For a higher level of abstraction, please check out the {@link ngResource.$resource + * $resource} service. + * + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage + * it is important to familiarize yourself with these APIs and the guarantees they provide. + * + * + * ## General usage + * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} — + * that is used to generate an HTTP request and returns a {@link ng.$q promise}. + * + * ```js + * // Simple GET request example: + * $http({ + * method: 'GET', + * url: '/someUrl' + * }).then(function successCallback(response) { + * // this callback will be called asynchronously + * // when the response is available + * }, function errorCallback(response) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * The response object has these properties: + * + * - **data** – `{string|Object}` – The response body transformed with the transform + * functions. + * - **status** – `{number}` – HTTP status code of the response. + * - **headers** – `{function([headerName])}` – Header getter function. + * - **config** – `{Object}` – The configuration object that was used to generate the request. + * - **statusText** – `{string}` – HTTP status text of the response. + * + * A response status code between 200 and 299 is considered a success status and will result in + * the success callback being called. Any response status code outside of that range is + * considered an error status and will result in the error callback being called. + * Also, status codes less than -1 are normalized to zero. -1 usually means the request was + * aborted, e.g. using a `config.timeout`. + * Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning + * that the outcome (success or error) will be determined by the final response status code. + * + * + * ## Shortcut methods + * + * Shortcut methods are also available. All shortcut methods require passing in the URL, and + * request data must be passed in for POST/PUT requests. An optional config can be passed as the + * last argument. + * + * ```js + * $http.get('/someUrl', config).then(successCallback, errorCallback); + * $http.post('/someUrl', data, config).then(successCallback, errorCallback); + * ``` + * + * Complete list of shortcut methods: + * + * - {@link ng.$http#get $http.get} + * - {@link ng.$http#head $http.head} + * - {@link ng.$http#post $http.post} + * - {@link ng.$http#put $http.put} + * - {@link ng.$http#delete $http.delete} + * - {@link ng.$http#jsonp $http.jsonp} + * - {@link ng.$http#patch $http.patch} + * + * + * ## Writing Unit Tests that use $http + * When unit testing (using {@link ngMock ngMock}), it is necessary to call + * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending + * request using trained responses. + * + * ``` + * $httpBackend.expectGET(...); + * $http.get(...); + * $httpBackend.flush(); + * ``` + * + * ## Deprecation Notice + *
+ * The `$http` legacy promise methods `success` and `error` have been deprecated. + * Use the standard `then` method instead. + * If {@link $httpProvider#useLegacyPromiseExtensions `$httpProvider.useLegacyPromiseExtensions`} is set to + * `false` then these methods will throw {@link $http:legacy `$http/legacy`} error. + *
+ * + * ## Setting HTTP Headers + * + * The $http service will automatically add certain HTTP headers to all requests. These defaults + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration + * object, which currently contains this default configuration: + * + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): + * - `Accept: application/json, text/plain, * / *` + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) + * - `Content-Type: application/json` + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) + * - `Content-Type: application/json` + * + * To add or overwrite these defaults, simply add or remove a property from these configuration + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object + * with the lowercased HTTP method name as the key, e.g. + * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`. + * + * The defaults can also be set at runtime via the `$http.defaults` object in the same + * fashion. For example: + * + * ``` + * module.run(function($http) { + * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'; + * }); + * ``` + * + * In addition, you can supply a `headers` property in the config object passed when + * calling `$http(config)`, which overrides the defaults without changing them globally. + * + * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, + * Use the `headers` property, setting the desired header to `undefined`. For example: + * + * ```js + * var req = { + * method: 'POST', + * url: 'http://example.com', + * headers: { + * 'Content-Type': undefined + * }, + * data: { test: 'test' } + * } + * + * $http(req).then(function(){...}, function(){...}); + * ``` + * + * ## Transforming Requests and Responses + * + * Both requests and responses can be transformed using transformation functions: `transformRequest` + * and `transformResponse`. These properties can be a single function that returns + * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, + * which allows you to `push` or `unshift` a new transformation function into the transformation chain. + * + *
+ * **Note:** Angular does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline. + * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference). + * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest + * function will be reflected on the scope and in any templates where the object is data-bound. + * To prevent this, transform functions should have no side-effects. + * If you need to modify properties, it is recommended to make a copy of the data, or create new object to return. + *
+ * + * ### Default Transformations + * + * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and + * `defaults.transformResponse` properties. If a request does not provide its own transformations + * then these will be applied. + * + * You can augment or replace the default transformations by modifying these properties by adding to or + * replacing the array. + * + * Angular provides the following default transformations: + * + * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): + * + * - If the `data` property of the request configuration object contains an object, serialize it + * into JSON format. + * + * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): + * + * - If XSRF prefix is detected, strip it (see Security Considerations section below). + * - If JSON response is detected, deserialize it using a JSON parser. + * + * + * ### Overriding the Default Transformations Per Request + * + * If you wish to override the request/response transformations only for a single request then provide + * `transformRequest` and/or `transformResponse` properties on the configuration object passed + * into `$http`. + * + * Note that if you provide these properties on the config object the default transformations will be + * overwritten. If you wish to augment the default transformations then you must include them in your + * local transformation array. + * + * The following code demonstrates adding a new response transformation to be run after the default response + * transformations have been run. + * + * ```js + * function appendTransform(defaults, transform) { + * + * // We can't guarantee that the default transformation is an array + * defaults = angular.isArray(defaults) ? defaults : [defaults]; + * + * // Append the new transformation to the defaults + * return defaults.concat(transform); + * } + * + * $http({ + * url: '...', + * method: 'GET', + * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { + * return doTransform(value); + * }) + * }); + * ``` + * + * + * ## Caching + * + * {@link ng.$http `$http`} responses are not cached by default. To enable caching, you must + * set the config.cache value or the default cache value to TRUE or to a cache object (created + * with {@link ng.$cacheFactory `$cacheFactory`}). If defined, the value of config.cache takes + * precedence over the default cache value. + * + * In order to: + * * cache all responses - set the default cache value to TRUE or to a cache object + * * cache a specific response - set config.cache value to TRUE or to a cache object + * + * If caching is enabled, but neither the default cache nor config.cache are set to a cache object, + * then the default `$cacheFactory("$http")` object is used. + * + * The default cache value can be set by updating the + * {@link ng.$http#defaults `$http.defaults.cache`} property or the + * {@link $httpProvider#defaults `$httpProvider.defaults.cache`} property. + * + * When caching is enabled, {@link ng.$http `$http`} stores the response from the server using + * the relevant cache object. The next time the same request is made, the response is returned + * from the cache without sending a request to the server. + * + * Take note that: + * + * * Only GET and JSONP requests are cached. + * * The cache key is the request URL including search parameters; headers are not considered. + * * Cached responses are returned asynchronously, in the same way as responses from the server. + * * If multiple identical requests are made using the same cache, which is not yet populated, + * one request will be made to the server and remaining requests will return the same response. + * * A cache-control header on the response does not affect if or how responses are cached. + * + * + * ## Interceptors + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication, or any kind of synchronous or + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be + * able to intercept requests before they are handed to the server and + * responses before they are handed over to the application code that + * initiated these requests. The interceptors leverage the {@link ng.$q + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. + * + * The interceptors are service factories that are registered with the `$httpProvider` by + * adding them to the `$httpProvider.interceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor. + * + * There are two kinds of interceptors (and two kinds of rejection interceptors): + * + * * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to + * modify the `config` object or create a new one. The function needs to return the `config` + * object directly, or a promise containing the `config` or a new `config` object. + * * `requestError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * * `response`: interceptors get called with http `response` object. The function is free to + * modify the `response` object or create a new one. The function needs to return the `response` + * object directly, or as a promise containing the `response` or a new `response` object. + * * `responseError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * + * + * ```js + * // register the interceptor as a service + * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { + * return { + * // optional method + * 'request': function(config) { + * // do something on success + * return config; + * }, + * + * // optional method + * 'requestError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * }, + * + * + * + * // optional method + * 'response': function(response) { + * // do something on success + * return response; + * }, + * + * // optional method + * 'responseError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * } + * }; + * }); + * + * $httpProvider.interceptors.push('myHttpInterceptor'); + * + * + * // alternatively, register the interceptor via an anonymous factory + * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { + * return { + * 'request': function(config) { + * // same as above + * }, + * + * 'response': function(response) { + * // same as above + * } + * }; + * }); + * ``` + * + * ## Security Considerations + * + * When designing web applications, consider security threats from: + * + * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) + * + * Both server and the client must cooperate in order to eliminate these threats. Angular comes + * pre-configured with strategies that address these issues, but for this to work backend server + * cooperation is required. + * + * ### JSON Vulnerability Protection + * + * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * allows third party website to turn your JSON resource URL into + * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. + * Angular will automatically strip the prefix before processing it as JSON. + * + * For example if your server needs to return: + * ```js + * ['one','two'] + * ``` + * + * which is vulnerable to attack, your server can return: + * ```js + * )]}', + * ['one','two'] + * ``` + * + * Angular will strip the prefix, before processing the JSON. + * + * + * ### Cross Site Request Forgery (XSRF) Protection + * + * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by + * which the attacker can trick an authenticated user into unknowingly executing actions on your + * website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the + * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP + * header (`X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read the + * cookie, your server can be assured that the XHR came from JavaScript running on your domain. + * The header will not be set for cross-domain requests. + * + * To take advantage of this, your server needs to set a token in a JavaScript readable session + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure + * that only JavaScript running on your domain could have sent the request. The token must be + * unique for each user and must be verifiable by the server (to prevent the JavaScript from + * making up its own tokens). We recommend that the token is a digest of your site's + * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) + * for added security. + * + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName + * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, + * or the per-request config object. + * + * In order to prevent collisions in environments where multiple Angular apps share the + * same domain or subdomain, we recommend that each application uses unique cookie name. + * + * @param {object} config Object describing the request to be made and how it should be + * processed. The object has following properties: + * + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. + * - **params** – `{Object.}` – Map of strings or objects which will be serialized + * with the `paramSerializer` and appended as GET parameters. + * - **data** – `{string|Object}` – Data to be sent as the request message data. + * - **headers** – `{Object}` – Map of strings or functions which return strings representing + * HTTP headers to send to the server. If the return value of a function is null, the + * header will not be sent. Functions accept a config object as an argument. + * - **eventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest object. + * To bind events to the XMLHttpRequest upload object, use `uploadEventHandlers`. + * The handler will be called in the context of a `$apply` block. + * - **uploadEventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest upload + * object. To bind events to the XMLHttpRequest object, use `eventHandlers`. + * The handler will be called in the context of a `$apply` block. + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. + * - **transformRequest** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default Transformations} + * - **transformResponse** – + * `{function(data, headersGetter, status)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body, headers and status and returns its transformed (typically deserialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default Transformations} + * - **paramSerializer** - `{string|function(Object):string}` - A function used to + * prepare the string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as function registered with the + * {@link $injector $injector}, which means you can create your own serializer + * by registering it as a {@link auto.$provide#service service}. + * The default serializer is the {@link $httpParamSerializer $httpParamSerializer}; + * alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike} + * - **cache** – `{boolean|Object}` – A boolean value or object created with + * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response. + * See {@link $http#caching $http Caching} for more information. + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} + * that should abort the request when resolved. + * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the + * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) + * for more information. + * - **responseType** - `{string}` - see + * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype). + * + * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object + * when the request succeeds or fails. + * + * + * @property {Array.} pendingRequests Array of config objects for currently pending + * requests. This is primarily meant to be used for debugging purposes. + * + * + * @example + + +
+ + +
+ + + +
http status code: {{status}}
+
http response data: {{data}}
+
+
+ + angular.module('httpExample', []) + .controller('FetchController', ['$scope', '$http', '$templateCache', + function($scope, $http, $templateCache) { + $scope.method = 'GET'; + $scope.url = 'http-hello.html'; + + $scope.fetch = function() { + $scope.code = null; + $scope.response = null; + + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). + then(function(response) { + $scope.status = response.status; + $scope.data = response.data; + }, function(response) { + $scope.data = response.data || "Request failed"; + $scope.status = response.status; + }); + }; + + $scope.updateModel = function(method, url) { + $scope.method = method; + $scope.url = url; + }; + }]); + + + Hello, $http! + + + var status = element(by.binding('status')); + var data = element(by.binding('data')); + var fetchBtn = element(by.id('fetchbtn')); + var sampleGetBtn = element(by.id('samplegetbtn')); + var sampleJsonpBtn = element(by.id('samplejsonpbtn')); + var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); + + it('should make an xhr GET request', function() { + sampleGetBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('200'); + expect(data.getText()).toMatch(/Hello, \$http!/); + }); + +// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 +// it('should make a JSONP request to angularjs.org', function() { +// sampleJsonpBtn.click(); +// fetchBtn.click(); +// expect(status.getText()).toMatch('200'); +// expect(data.getText()).toMatch(/Super Hero!/); +// }); + + it('should make JSONP request to invalid URL and invoke the error handler', + function() { + invalidJsonpBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('0'); + expect(data.getText()).toMatch('Request failed'); + }); + +
+ */ + function $http(requestConfig) { + + if (!isObject(requestConfig)) { + throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); + } + + if (!isString(requestConfig.url)) { + throw minErr('$http')('badreq', 'Http request configuration url must be a string. Received: {0}', requestConfig.url); + } + + var config = extend({ + method: 'get', + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse, + paramSerializer: defaults.paramSerializer + }, requestConfig); + + config.headers = mergeHeaders(requestConfig); + config.method = uppercase(config.method); + config.paramSerializer = isString(config.paramSerializer) ? + $injector.get(config.paramSerializer) : config.paramSerializer; + + var requestInterceptors = []; + var responseInterceptors = []; + var promise = $q.when(config); + + // apply interceptors + forEach(reversedInterceptors, function(interceptor) { + if (interceptor.request || interceptor.requestError) { + requestInterceptors.unshift(interceptor.request, interceptor.requestError); + } + if (interceptor.response || interceptor.responseError) { + responseInterceptors.push(interceptor.response, interceptor.responseError); + } + }); + + promise = chainInterceptors(promise, requestInterceptors); + promise = promise.then(serverRequest); + promise = chainInterceptors(promise, responseInterceptors); + + if (useLegacyPromise) { + promise.success = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + promise.error = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(null, function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + } else { + promise.success = $httpMinErrLegacyFn('success'); + promise.error = $httpMinErrLegacyFn('error'); + } + + return promise; + + + function chainInterceptors(promise, interceptors) { + for (var i = 0, ii = interceptors.length; i < ii;) { + var thenFn = interceptors[i++]; + var rejectFn = interceptors[i++]; + + promise = promise.then(thenFn, rejectFn); + } + + interceptors.length = 0; + + return promise; + } + + function executeHeaderFns(headers, config) { + var headerContent, processedHeaders = {}; + + forEach(headers, function(headerFn, header) { + if (isFunction(headerFn)) { + headerContent = headerFn(config); + if (headerContent != null) { + processedHeaders[header] = headerContent; + } + } else { + processedHeaders[header] = headerFn; + } + }); + + return processedHeaders; + } + + function mergeHeaders(config) { + var defHeaders = defaults.headers, + reqHeaders = extend({}, config.headers), + defHeaderName, lowercaseDefHeaderName, reqHeaderName; + + defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); + + // using for-in instead of forEach to avoid unnecessary iteration after header has been found + defaultHeadersIteration: + for (defHeaderName in defHeaders) { + lowercaseDefHeaderName = lowercase(defHeaderName); + + for (reqHeaderName in reqHeaders) { + if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { + continue defaultHeadersIteration; + } + } + + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; + } + + // execute if header value is a function for merged headers + return executeHeaderFns(reqHeaders, shallowCopy(config)); + } + + function serverRequest(config) { + var headers = config.headers; + var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(reqData)) { + forEach(headers, function(value, header) { + if (lowercase(header) === 'content-type') { + delete headers[header]; + } + }); + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData).then(transformResponse, transformResponse); + } + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response); + resp.data = transformData(response.data, response.headers, response.status, + config.transformResponse); + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } + } + + $http.pendingRequests = []; + + /** + * @ngdoc method + * @name $http#get + * + * @description + * Shortcut method to perform `GET` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#delete + * + * @description + * Shortcut method to perform `DELETE` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#head + * + * @description + * Shortcut method to perform `HEAD` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#jsonp + * + * @description + * Shortcut method to perform `JSONP` request. + * If you would like to customise where and how the callbacks are stored then try overriding + * or decorating the {@link $jsonpCallbacks} service. + * + * @param {string} url Relative or absolute URL specifying the destination of the request. + * The name of the callback should be the string `JSON_CALLBACK`. + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethods('get', 'delete', 'head', 'jsonp'); + + /** + * @ngdoc method + * @name $http#post + * + * @description + * Shortcut method to perform `POST` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#put + * + * @description + * Shortcut method to perform `PUT` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#patch + * + * @description + * Shortcut method to perform `PATCH` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethodsWithData('post', 'put', 'patch'); + + /** + * @ngdoc property + * @name $http#defaults + * + * @description + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of + * default headers, withCredentials as well as request and response transformations. + * + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. + */ + $http.defaults = defaults; + + + return $http; + + + function createShortMethods(names) { + forEach(arguments, function(name) { + $http[name] = function(url, config) { + return $http(extend({}, config || {}, { + method: name, + url: url + })); + }; + }); + } + + + function createShortMethodsWithData(name) { + forEach(arguments, function(name) { + $http[name] = function(url, data, config) { + return $http(extend({}, config || {}, { + method: name, + url: url, + data: data + })); + }; + }); + } + + + /** + * Makes the request. + * + * !!! ACCESSES CLOSURE VARS: + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests + */ + function sendReq(config, reqData) { + var deferred = $q.defer(), + promise = deferred.promise, + cache, + cachedResp, + reqHeaders = config.headers, + url = buildUrl(config.url, config.paramSerializer(config.params)); + + $http.pendingRequests.push(config); + promise.then(removePendingReq, removePendingReq); + + + if ((config.cache || defaults.cache) && config.cache !== false && + (config.method === 'GET' || config.method === 'JSONP')) { + cache = isObject(config.cache) ? config.cache + : isObject(defaults.cache) ? defaults.cache + : defaultCache; + } + + if (cache) { + cachedResp = cache.get(url); + if (isDefined(cachedResp)) { + if (isPromiseLike(cachedResp)) { + // cached request has already been sent, but there is no response yet + cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); + } else { + // serving from cache + if (isArray(cachedResp)) { + resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); + } else { + resolvePromise(cachedResp, 200, {}, 'OK'); + } + } + } else { + // put the promise for the non-transformed response into cache as a placeholder + cache.put(url, promise); + } + } + + + // if we won't have the response in cache, set the xsrf headers and + // send the request to the backend + if (isUndefined(cachedResp)) { + var xsrfValue = urlIsSameOrigin(config.url) + ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] + : undefined; + if (xsrfValue) { + reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; + } + + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, + config.withCredentials, config.responseType, + createApplyHandlers(config.eventHandlers), + createApplyHandlers(config.uploadEventHandlers)); + } + + return promise; + + function createApplyHandlers(eventHandlers) { + if (eventHandlers) { + var applyHandlers = {}; + forEach(eventHandlers, function(eventHandler, key) { + applyHandlers[key] = function(event) { + if (useApplyAsync) { + $rootScope.$applyAsync(callEventHandler); + } else if ($rootScope.$$phase) { + callEventHandler(); + } else { + $rootScope.$apply(callEventHandler); + } + + function callEventHandler() { + eventHandler(event); + } + }; + }); + return applyHandlers; + } + } + + + /** + * Callback registered to $httpBackend(): + * - caches the response if desired + * - resolves the raw $http promise + * - calls $apply + */ + function done(status, response, headersString, statusText) { + if (cache) { + if (isSuccess(status)) { + cache.put(url, [status, response, parseHeaders(headersString), statusText]); + } else { + // remove promise from the cache + cache.remove(url); + } + } + + function resolveHttpPromise() { + resolvePromise(response, status, headersString, statusText); + } + + if (useApplyAsync) { + $rootScope.$applyAsync(resolveHttpPromise); + } else { + resolveHttpPromise(); + if (!$rootScope.$$phase) $rootScope.$apply(); + } + } + + + /** + * Resolves the raw $http promise. + */ + function resolvePromise(response, status, headers, statusText) { + //status: HTTP response status code, 0, -1 (aborted by timeout / promise) + status = status >= -1 ? status : 0; + + (isSuccess(status) ? deferred.resolve : deferred.reject)({ + data: response, + status: status, + headers: headersGetter(headers), + config: config, + statusText: statusText + }); + } + + function resolvePromiseWithResult(result) { + resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); + } + + function removePendingReq() { + var idx = $http.pendingRequests.indexOf(config); + if (idx !== -1) $http.pendingRequests.splice(idx, 1); + } + } + + + function buildUrl(url, serializedParams) { + if (serializedParams.length > 0) { + url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams; + } + return url; + } + }]; +} + +/** + * @ngdoc service + * @name $xhrFactory + * + * @description + * Factory function used to create XMLHttpRequest objects. + * + * Replace or decorate this service to create your own custom XMLHttpRequest objects. + * + * ``` + * angular.module('myApp', []) + * .factory('$xhrFactory', function() { + * return function createXhr(method, url) { + * return new window.XMLHttpRequest({mozSystem: true}); + * }; + * }); + * ``` + * + * @param {string} method HTTP method of the request (GET, POST, PUT, ..) + * @param {string} url URL of the request. + */ +function $xhrFactoryProvider() { + this.$get = function() { + return function createXhr() { + return new window.XMLHttpRequest(); + }; + }; +} + +/** + * @ngdoc service + * @name $httpBackend + * @requires $jsonpCallbacks + * @requires $document + * @requires $xhrFactory + * + * @description + * HTTP backend used by the {@link ng.$http service} that delegates to + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. + * + * You should never need to use this service directly, instead use the higher-level abstractions: + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. + * + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock + * $httpBackend} which can be trained with responses. + */ +function $HttpBackendProvider() { + this.$get = ['$browser', '$jsonpCallbacks', '$document', '$xhrFactory', function($browser, $jsonpCallbacks, $document, $xhrFactory) { + return createHttpBackend($browser, $xhrFactory, $browser.defer, $jsonpCallbacks, $document[0]); + }]; +} + +function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { + // TODO(vojta): fix the signature + return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) { + $browser.$$incOutstandingRequestCount(); + url = url || $browser.url(); + + if (lowercase(method) === 'jsonp') { + var callbackPath = callbacks.createCallback(url); + var jsonpDone = jsonpReq(url, callbackPath, function(status, text) { + // jsonpReq only ever sets status to 200 (OK), 404 (ERROR) or -1 (WAITING) + var response = (status === 200) && callbacks.getResponse(callbackPath); + completeRequest(callback, status, response, "", text); + callbacks.removeCallback(callbackPath); + }); + } else { + + var xhr = createXhr(method, url); + + xhr.open(method, url, true); + forEach(headers, function(value, key) { + if (isDefined(value)) { + xhr.setRequestHeader(key, value); + } + }); + + xhr.onload = function requestLoaded() { + var statusText = xhr.statusText || ''; + + // responseText is the old-school way of retrieving response (supported by IE9) + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) + var response = ('response' in xhr) ? xhr.response : xhr.responseText; + + // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) + var status = xhr.status === 1223 ? 204 : xhr.status; + + // fix status code when it is 0 (0 status is undocumented). + // Occurs when accessing file resources or on Android 4.1 stock browser + // while retrieving files from application cache. + if (status === 0) { + status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; + } + + completeRequest(callback, + status, + response, + xhr.getAllResponseHeaders(), + statusText); + }; + + var requestError = function() { + // The response is always empty + // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error + completeRequest(callback, -1, null, null, ''); + }; + + xhr.onerror = requestError; + xhr.onabort = requestError; + + forEach(eventHandlers, function(value, key) { + xhr.addEventListener(key, value); + }); + + forEach(uploadEventHandlers, function(value, key) { + xhr.upload.addEventListener(key, value); + }); + + if (withCredentials) { + xhr.withCredentials = true; + } + + if (responseType) { + try { + xhr.responseType = responseType; + } catch (e) { + // WebKit added support for the json responseType value on 09/03/2013 + // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are + // known to throw when setting the value "json" as the response type. Other older + // browsers implementing the responseType + // + // The json response type can be ignored if not supported, because JSON payloads are + // parsed on the client-side regardless. + if (responseType !== 'json') { + throw e; + } + } + } + + xhr.send(isUndefined(post) ? null : post); + } + + if (timeout > 0) { + var timeoutId = $browserDefer(timeoutRequest, timeout); + } else if (isPromiseLike(timeout)) { + timeout.then(timeoutRequest); + } + + + function timeoutRequest() { + jsonpDone && jsonpDone(); + xhr && xhr.abort(); + } + + function completeRequest(callback, status, response, headersString, statusText) { + // cancel timeout and subsequent timeout promise resolution + if (isDefined(timeoutId)) { + $browserDefer.cancel(timeoutId); + } + jsonpDone = xhr = null; + + callback(status, response, headersString, statusText); + $browser.$$completeOutstandingRequest(noop); + } + }; + + function jsonpReq(url, callbackPath, done) { + url = url.replace('JSON_CALLBACK', callbackPath); + // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.: + // - fetches local scripts via XHR and evals them + // - adds and immediately removes script elements from the document + var script = rawDocument.createElement('script'), callback = null; + script.type = "text/javascript"; + script.src = url; + script.async = true; + + callback = function(event) { + removeEventListenerFn(script, "load", callback); + removeEventListenerFn(script, "error", callback); + rawDocument.body.removeChild(script); + script = null; + var status = -1; + var text = "unknown"; + + if (event) { + if (event.type === "load" && !callbacks.wasCalled(callbackPath)) { + event = { type: "error" }; + } + text = event.type; + status = event.type === "error" ? 404 : 200; + } + + if (done) { + done(status, text); + } + }; + + addEventListenerFn(script, "load", callback); + addEventListenerFn(script, "error", callback); + rawDocument.body.appendChild(script); + return callback; + } +} + +var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); +$interpolateMinErr.throwNoconcat = function(text) { + throw $interpolateMinErr('noconcat', + "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + + "interpolations that concatenate multiple expressions when a trusted value is " + + "required. See http://docs.angularjs.org/api/ng.$sce", text); +}; + +$interpolateMinErr.interr = function(text, err) { + return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); +}; + +/** + * @ngdoc provider + * @name $interpolateProvider + * + * @description + * + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. + * + *
+ * This feature is sometimes used to mix different markup languages, e.g. to wrap an Angular + * template within a Python Jinja template (or any other template language). Mixing templating + * languages is **very dangerous**. The embedding template language will not safely escape Angular + * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS) + * security bugs! + *
+ * + * @example + + + +
+ //demo.label// +
+
+ + it('should interpolate binding with custom symbols', function() { + expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); + }); + +
+ */ +function $InterpolateProvider() { + var startSymbol = '{{'; + var endSymbol = '}}'; + + /** + * @ngdoc method + * @name $interpolateProvider#startSymbol + * @description + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. + * + * @param {string=} value new value to set the starting symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.startSymbol = function(value) { + if (value) { + startSymbol = value; + return this; + } else { + return startSymbol; + } + }; + + /** + * @ngdoc method + * @name $interpolateProvider#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * @param {string=} value new value to set the ending symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.endSymbol = function(value) { + if (value) { + endSymbol = value; + return this; + } else { + return endSymbol; + } + }; + + + this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { + var startSymbolLength = startSymbol.length, + endSymbolLength = endSymbol.length, + escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), + escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); + + function escape(ch) { + return '\\\\\\' + ch; + } + + function unescapeText(text) { + return text.replace(escapedStartRegexp, startSymbol). + replace(escapedEndRegexp, endSymbol); + } + + function stringify(value) { + if (value == null) { // null || undefined + return ''; + } + switch (typeof value) { + case 'string': + break; + case 'number': + value = '' + value; + break; + default: + value = toJson(value); + } + + return value; + } + + //TODO: this is the same as the constantWatchDelegate in parse.js + function constantWatchDelegate(scope, listener, objectEquality, constantInterp) { + var unwatch; + return unwatch = scope.$watch(function constantInterpolateWatch(scope) { + unwatch(); + return constantInterp(scope); + }, listener, objectEquality); + } + + /** + * @ngdoc service + * @name $interpolate + * @kind function + * + * @requires $parse + * @requires $sce + * + * @description + * + * Compiles a string with markup into an interpolation function. This service is used by the + * HTML {@link ng.$compile $compile} service for data binding. See + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the + * interpolation markup. + * + * + * ```js + * var $interpolate = ...; // injected + * var exp = $interpolate('Hello {{name | uppercase}}!'); + * expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!'); + * ``` + * + * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is + * `true`, the interpolation function will return `undefined` unless all embedded expressions + * evaluate to a value other than `undefined`. + * + * ```js + * var $interpolate = ...; // injected + * var context = {greeting: 'Hello', name: undefined }; + * + * // default "forgiving" mode + * var exp = $interpolate('{{greeting}} {{name}}!'); + * expect(exp(context)).toEqual('Hello !'); + * + * // "allOrNothing" mode + * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); + * expect(exp(context)).toBeUndefined(); + * context.name = 'Angular'; + * expect(exp(context)).toEqual('Hello Angular!'); + * ``` + * + * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. + * + * #### Escaped Interpolation + * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers + * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). + * It will be rendered as a regular start/end marker, and will not be interpreted as an expression + * or binding. + * + * This enables web-servers to prevent script injection attacks and defacing attacks, to some + * degree, while also enabling code examples to work without relying on the + * {@link ng.directive:ngNonBindable ngNonBindable} directive. + * + * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, + * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all + * interpolation start/end markers with their escaped counterparts.** + * + * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered + * output when the $interpolate service processes the text. So, for HTML elements interpolated + * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter + * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, + * this is typically useful only when user-data is used in rendering a template from the server, or + * when otherwise untrusted data is used by a directive. + * + * + * + *
+ *

{{apptitle}}: \{\{ username = "defaced value"; \}\} + *

+ *

{{username}} attempts to inject code which will deface the + * application, but fails to accomplish their task, because the server has correctly + * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) + * characters.

+ *

Instead, the result of the attempted script injection is visible, and can be removed + * from the database by an administrator.

+ *
+ *
+ *
+ * + * @knownIssue + * It is currently not possible for an interpolated expression to contain the interpolation end + * symbol. For example, `{{ '}}' }}` will be incorrectly interpreted as `{{ ' }}` + `' }}`, i.e. + * an interpolated expression consisting of a single-quote (`'`) and the `' }}` string. + * + * @knownIssue + * All directives and components must use the standard `{{` `}}` interpolation symbols + * in their templates. If you change the application interpolation symbols the {@link $compile} + * service will attempt to denormalize the standard symbols to the custom symbols. + * The denormalization process is not clever enough to know not to replace instances of the standard + * symbols where they would not normally be treated as interpolation symbols. For example in the following + * code snippet the closing braces of the literal object will get incorrectly denormalized: + * + * ``` + *
+ * ``` + * + * See https://github.com/angular/angular.js/pull/14610#issuecomment-219401099 for more information. + * + * @param {string} text The text with markup to interpolate. + * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have + * embedded expression in order to return an interpolation function. Strings with no + * embedded expression will return null for the interpolation function. + * @param {string=} trustedContext when provided, the returned function passes the interpolated + * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, + * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that + * provides Strict Contextual Escaping for details. + * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined + * unless all embedded expressions evaluate to a value other than `undefined`. + * @returns {function(context)} an interpolation function which is used to compute the + * interpolated string. The function has these parameters: + * + * - `context`: evaluation context for all expressions embedded in the interpolated text + */ + function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { + // Provide a quick exit and simplified result function for text with no interpolation + if (!text.length || text.indexOf(startSymbol) === -1) { + var constantInterp; + if (!mustHaveExpression) { + var unescapedText = unescapeText(text); + constantInterp = valueFn(unescapedText); + constantInterp.exp = text; + constantInterp.expressions = []; + constantInterp.$$watchDelegate = constantWatchDelegate; + } + return constantInterp; + } + + allOrNothing = !!allOrNothing; + var startIndex, + endIndex, + index = 0, + expressions = [], + parseFns = [], + textLength = text.length, + exp, + concat = [], + expressionPositions = []; + + while (index < textLength) { + if (((startIndex = text.indexOf(startSymbol, index)) != -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { + if (index !== startIndex) { + concat.push(unescapeText(text.substring(index, startIndex))); + } + exp = text.substring(startIndex + startSymbolLength, endIndex); + expressions.push(exp); + parseFns.push($parse(exp, parseStringifyInterceptor)); + index = endIndex + endSymbolLength; + expressionPositions.push(concat.length); + concat.push(''); + } else { + // we did not find an interpolation, so we have to add the remainder to the separators array + if (index !== textLength) { + concat.push(unescapeText(text.substring(index))); + } + break; + } + } + + // Concatenating expressions makes it hard to reason about whether some combination of + // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a + // single expression be used for iframe[src], object[src], etc., we ensure that the value + // that's used is assigned or constructed by some JS code somewhere that is more testable or + // make it obvious that you bound the value to some user controlled value. This helps reduce + // the load when auditing for XSS issues. + if (trustedContext && concat.length > 1) { + $interpolateMinErr.throwNoconcat(text); + } + + if (!mustHaveExpression || expressions.length) { + var compute = function(values) { + for (var i = 0, ii = expressions.length; i < ii; i++) { + if (allOrNothing && isUndefined(values[i])) return; + concat[expressionPositions[i]] = values[i]; + } + return concat.join(''); + }; + + var getValue = function(value) { + return trustedContext ? + $sce.getTrusted(trustedContext, value) : + $sce.valueOf(value); + }; + + return extend(function interpolationFn(context) { + var i = 0; + var ii = expressions.length; + var values = new Array(ii); + + try { + for (; i < ii; i++) { + values[i] = parseFns[i](context); + } + + return compute(values); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + + }, { + // all of these properties are undocumented for now + exp: text, //just for compatibility with regular watchers created via $watch + expressions: expressions, + $$watchDelegate: function(scope, listener) { + var lastValue; + return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { + var currValue = compute(values); + if (isFunction(listener)) { + listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); + } + lastValue = currValue; + }); + } + }); + } + + function parseStringifyInterceptor(value) { + try { + value = getValue(value); + return allOrNothing && !isDefined(value) ? value : stringify(value); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + } + } + + + /** + * @ngdoc method + * @name $interpolate#startSymbol + * @description + * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. + * + * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change + * the symbol. + * + * @returns {string} start symbol. + */ + $interpolate.startSymbol = function() { + return startSymbol; + }; + + + /** + * @ngdoc method + * @name $interpolate#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change + * the symbol. + * + * @returns {string} end symbol. + */ + $interpolate.endSymbol = function() { + return endSymbol; + }; + + return $interpolate; + }]; +} + +function $IntervalProvider() { + this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser', + function($rootScope, $window, $q, $$q, $browser) { + var intervals = {}; + + + /** + * @ngdoc service + * @name $interval + * + * @description + * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` + * milliseconds. + * + * The return value of registering an interval function is a promise. This promise will be + * notified upon each tick of the interval, and will be resolved after `count` iterations, or + * run indefinitely if `count` is not defined. The value of the notification will be the + * number of iterations that have run. + * To cancel an interval, call `$interval.cancel(promise)`. + * + * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that + * time. + * + *
+ * **Note**: Intervals created by this service must be explicitly destroyed when you are finished + * with them. In particular they are not automatically destroyed when a controller's scope or a + * directive's element are destroyed. + * You should take this into consideration and make sure to always cancel the interval at the + * appropriate moment. See the example below for more details on how and when to do this. + *
+ * + * @param {function()} fn A function that should be called repeatedly. + * @param {number} delay Number of milliseconds between each function call. + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat + * indefinitely. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {promise} A promise which will be notified on each iteration. + * + * @example + * + * + * + * + *
+ *
+ *
+ * Current time is: + *
+ * Blood 1 : {{blood_1}} + * Blood 2 : {{blood_2}} + * + * + * + *
+ *
+ * + *
+ *
+ */ + function interval(fn, delay, count, invokeApply) { + var hasParams = arguments.length > 4, + args = hasParams ? sliceArgs(arguments, 4) : [], + setInterval = $window.setInterval, + clearInterval = $window.clearInterval, + iteration = 0, + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise; + + count = isDefined(count) ? count : 0; + + promise.$$intervalId = setInterval(function tick() { + if (skipApply) { + $browser.defer(callback); + } else { + $rootScope.$evalAsync(callback); + } + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + deferred.resolve(iteration); + clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + } + + if (!skipApply) $rootScope.$apply(); + + }, delay); + + intervals[promise.$$intervalId] = deferred; + + return promise; + + function callback() { + if (!hasParams) { + fn(iteration); + } else { + fn.apply(null, args); + } + } + } + + + /** + * @ngdoc method + * @name $interval#cancel + * + * @description + * Cancels a task associated with the `promise`. + * + * @param {Promise=} promise returned by the `$interval` function. + * @returns {boolean} Returns `true` if the task was successfully canceled. + */ + interval.cancel = function(promise) { + if (promise && promise.$$intervalId in intervals) { + intervals[promise.$$intervalId].reject('canceled'); + $window.clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + return true; + } + return false; + }; + + return interval; + }]; +} + +/** + * @ngdoc service + * @name $jsonpCallbacks + * @requires $window + * @description + * This service handles the lifecycle of callbacks to handle JSONP requests. + * Override this service if you wish to customise where the callbacks are stored and + * how they vary compared to the requested url. + */ +var $jsonpCallbacksProvider = function() { + this.$get = ['$window', function($window) { + var callbacks = $window.angular.callbacks; + var callbackMap = {}; + + function createCallback(callbackId) { + var callback = function(data) { + callback.data = data; + callback.called = true; + }; + callback.id = callbackId; + return callback; + } + + return { + /** + * @ngdoc method + * @name $jsonpCallbacks#createCallback + * @param {string} url the url of the JSONP request + * @returns {string} the callback path to send to the server as part of the JSONP request + * @description + * {@link $httpBackend} calls this method to create a callback and get hold of the path to the callback + * to pass to the server, which will be used to call the callback with its payload in the JSONP response. + */ + createCallback: function(url) { + var callbackId = '_' + (callbacks.$$counter++).toString(36); + var callbackPath = 'angular.callbacks.' + callbackId; + var callback = createCallback(callbackId); + callbackMap[callbackPath] = callbacks[callbackId] = callback; + return callbackPath; + }, + /** + * @ngdoc method + * @name $jsonpCallbacks#wasCalled + * @param {string} callbackPath the path to the callback that was sent in the JSONP request + * @returns {boolean} whether the callback has been called, as a result of the JSONP response + * @description + * {@link $httpBackend} calls this method to find out whether the JSONP response actually called the + * callback that was passed in the request. + */ + wasCalled: function(callbackPath) { + return callbackMap[callbackPath].called; + }, + /** + * @ngdoc method + * @name $jsonpCallbacks#getResponse + * @param {string} callbackPath the path to the callback that was sent in the JSONP request + * @returns {*} the data received from the response via the registered callback + * @description + * {@link $httpBackend} calls this method to get hold of the data that was provided to the callback + * in the JSONP response. + */ + getResponse: function(callbackPath) { + return callbackMap[callbackPath].data; + }, + /** + * @ngdoc method + * @name $jsonpCallbacks#removeCallback + * @param {string} callbackPath the path to the callback that was sent in the JSONP request + * @description + * {@link $httpBackend} calls this method to remove the callback after the JSONP request has + * completed or timed-out. + */ + removeCallback: function(callbackPath) { + var callback = callbackMap[callbackPath]; + delete callbacks[callback.id]; + delete callbackMap[callbackPath]; + } + }; + }]; +}; + +/** + * @ngdoc service + * @name $locale + * + * @description + * $locale service provides localization rules for various Angular components. As of right now the + * only public api is: + * + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) + */ + +var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, + DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; +var $locationMinErr = minErr('$location'); + + +/** + * Encode path using encodeUriSegment, ignoring forward slashes + * + * @param {string} path Path to encode + * @returns {string} + */ +function encodePath(path) { + var segments = path.split('/'), + i = segments.length; + + while (i--) { + segments[i] = encodeUriSegment(segments[i]); + } + + return segments.join('/'); +} + +function parseAbsoluteUrl(absoluteUrl, locationObj) { + var parsedUrl = urlResolve(absoluteUrl); + + locationObj.$$protocol = parsedUrl.protocol; + locationObj.$$host = parsedUrl.hostname; + locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; +} + + +function parseAppUrl(relativeUrl, locationObj) { + var prefixed = (relativeUrl.charAt(0) !== '/'); + if (prefixed) { + relativeUrl = '/' + relativeUrl; + } + var match = urlResolve(relativeUrl); + locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? + match.pathname.substring(1) : match.pathname); + locationObj.$$search = parseKeyValue(match.search); + locationObj.$$hash = decodeURIComponent(match.hash); + + // make sure path starts with '/'; + if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { + locationObj.$$path = '/' + locationObj.$$path; + } +} + +function startsWith(haystack, needle) { + return haystack.lastIndexOf(needle, 0) === 0; +} + +/** + * + * @param {string} base + * @param {string} url + * @returns {string} returns text from `url` after `base` or `undefined` if it does not begin with + * the expected string. + */ +function stripBaseUrl(base, url) { + if (startsWith(url, base)) { + return url.substr(base.length); + } +} + + +function stripHash(url) { + var index = url.indexOf('#'); + return index == -1 ? url : url.substr(0, index); +} + +function trimEmptyHash(url) { + return url.replace(/(#.+)|#$/, '$1'); +} + + +function stripFile(url) { + return url.substr(0, stripHash(url).lastIndexOf('/') + 1); +} + +/* return the server only (scheme://host:port) */ +function serverBase(url) { + return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); +} + + +/** + * LocationHtml5Url represents an url + * This object is exposed as $location service when HTML5 mode is enabled and supported + * + * @constructor + * @param {string} appBase application base URL + * @param {string} appBaseNoFile application base URL stripped of any filename + * @param {string} basePrefix url path prefix + */ +function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) { + this.$$html5 = true; + basePrefix = basePrefix || ''; + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given html5 (regular) url string into properties + * @param {string} url HTML5 url + * @private + */ + this.$$parse = function(url) { + var pathUrl = stripBaseUrl(appBaseNoFile, url); + if (!isString(pathUrl)) { + throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, + appBaseNoFile); + } + + parseAppUrl(pathUrl, this); + + if (!this.$$path) { + this.$$path = '/'; + } + + this.$$compose(); + }; + + /** + * Compose url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + var appUrl, prevAppUrl; + var rewrittenUrl; + + if (isDefined(appUrl = stripBaseUrl(appBase, url))) { + prevAppUrl = appUrl; + if (isDefined(appUrl = stripBaseUrl(basePrefix, appUrl))) { + rewrittenUrl = appBaseNoFile + (stripBaseUrl('/', appUrl) || appUrl); + } else { + rewrittenUrl = appBase + prevAppUrl; + } + } else if (isDefined(appUrl = stripBaseUrl(appBaseNoFile, url))) { + rewrittenUrl = appBaseNoFile + appUrl; + } else if (appBaseNoFile == url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when developer doesn't opt into html5 mode. + * It also serves as the base class for html5 mode fallback on legacy browsers. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} appBaseNoFile application base URL stripped of any filename + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { + + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given hashbang url into properties + * @param {string} url Hashbang url + * @private + */ + this.$$parse = function(url) { + var withoutBaseUrl = stripBaseUrl(appBase, url) || stripBaseUrl(appBaseNoFile, url); + var withoutHashUrl; + + if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { + + // The rest of the url starts with a hash so we have + // got either a hashbang path or a plain hash fragment + withoutHashUrl = stripBaseUrl(hashPrefix, withoutBaseUrl); + if (isUndefined(withoutHashUrl)) { + // There was no hashbang prefix so we just have a hash fragment + withoutHashUrl = withoutBaseUrl; + } + + } else { + // There was no hashbang path nor hash fragment: + // If we are in HTML5 mode we use what is left as the path; + // Otherwise we ignore what is left + if (this.$$html5) { + withoutHashUrl = withoutBaseUrl; + } else { + withoutHashUrl = ''; + if (isUndefined(withoutBaseUrl)) { + appBase = url; + this.replace(); + } + } + } + + parseAppUrl(withoutHashUrl, this); + + this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); + + this.$$compose(); + + /* + * In Windows, on an anchor node on documents loaded from + * the filesystem, the browser will return a pathname + * prefixed with the drive name ('/C:/path') when a + * pathname without a drive is set: + * * a.setAttribute('href', '/foo') + * * a.pathname === '/C:/foo' //true + * + * Inside of Angular, we're always using pathnames that + * do not include drive names for routing. + */ + function removeWindowsDriveName(path, url, base) { + /* + Matches paths for file protocol on windows, + such as /C:/foo/bar, and captures only /foo/bar. + */ + var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; + + var firstPathSegmentMatch; + + //Get the relative path from the input URL. + if (startsWith(url, base)) { + url = url.replace(base, ''); + } + + // The input URL intentionally contains a first path segment that ends with a colon. + if (windowsFilePathExp.exec(url)) { + return path; + } + + firstPathSegmentMatch = windowsFilePathExp.exec(path); + return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; + } + }; + + /** + * Compose hashbang url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (stripHash(appBase) == stripHash(url)) { + this.$$parse(url); + return true; + } + return false; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when html5 history api is enabled but the browser + * does not support it. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} appBaseNoFile application base URL stripped of any filename + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) { + this.$$html5 = true; + LocationHashbangUrl.apply(this, arguments); + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + + var rewrittenUrl; + var appUrl; + + if (appBase == stripHash(url)) { + rewrittenUrl = url; + } else if ((appUrl = stripBaseUrl(appBaseNoFile, url))) { + rewrittenUrl = appBase + hashPrefix + appUrl; + } else if (appBaseNoFile === url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; + + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#' + this.$$absUrl = appBase + hashPrefix + this.$$url; + }; + +} + + +var locationPrototype = { + + /** + * Ensure absolute url is initialized. + * @private + */ + $$absUrl:'', + + /** + * Are we in html5 mode? + * @private + */ + $$html5: false, + + /** + * Has any change been replacing? + * @private + */ + $$replace: false, + + /** + * @ngdoc method + * @name $location#absUrl + * + * @description + * This method is getter only. + * + * Return full url representation with all segments encoded according to rules specified in + * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var absUrl = $location.absUrl(); + * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" + * ``` + * + * @return {string} full url + */ + absUrl: locationGetter('$$absUrl'), + + /** + * @ngdoc method + * @name $location#url + * + * @description + * This method is getter / setter. + * + * Return url (e.g. `/path?a=b#hash`) when called without any parameter. + * + * Change path, search and hash, when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var url = $location.url(); + * // => "/some/path?foo=bar&baz=xoxo" + * ``` + * + * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) + * @return {string} url + */ + url: function(url) { + if (isUndefined(url)) { + return this.$$url; + } + + var match = PATH_MATCH.exec(url); + if (match[1] || url === '') this.path(decodeURIComponent(match[1])); + if (match[2] || match[1] || url === '') this.search(match[3] || ''); + this.hash(match[5] || ''); + + return this; + }, + + /** + * @ngdoc method + * @name $location#protocol + * + * @description + * This method is getter only. + * + * Return protocol of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var protocol = $location.protocol(); + * // => "http" + * ``` + * + * @return {string} protocol of current url + */ + protocol: locationGetter('$$protocol'), + + /** + * @ngdoc method + * @name $location#host + * + * @description + * This method is getter only. + * + * Return host of current url. + * + * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var host = $location.host(); + * // => "example.com" + * + * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo + * host = $location.host(); + * // => "example.com" + * host = location.host; + * // => "example.com:8080" + * ``` + * + * @return {string} host of current url. + */ + host: locationGetter('$$host'), + + /** + * @ngdoc method + * @name $location#port + * + * @description + * This method is getter only. + * + * Return port of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var port = $location.port(); + * // => 80 + * ``` + * + * @return {Number} port + */ + port: locationGetter('$$port'), + + /** + * @ngdoc method + * @name $location#path + * + * @description + * This method is getter / setter. + * + * Return path of current url when called without any parameter. + * + * Change path when called with parameter and return `$location`. + * + * Note: Path should always begin with forward slash (/), this method will add the forward slash + * if it is missing. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var path = $location.path(); + * // => "/some/path" + * ``` + * + * @param {(string|number)=} path New path + * @return {(string|object)} path if called with no parameters, or `$location` if called with a parameter + */ + path: locationGetterSetter('$$path', function(path) { + path = path !== null ? path.toString() : ''; + return path.charAt(0) == '/' ? path : '/' + path; + }), + + /** + * @ngdoc method + * @name $location#search + * + * @description + * This method is getter / setter. + * + * Return search part (as object) of current url when called without any parameter. + * + * Change search part when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var searchObject = $location.search(); + * // => {foo: 'bar', baz: 'xoxo'} + * + * // set foo to 'yipee' + * $location.search('foo', 'yipee'); + * // $location.search() => {foo: 'yipee', baz: 'xoxo'} + * ``` + * + * @param {string|Object.|Object.>} search New search params - string or + * hash object. + * + * When called with a single argument the method acts as a setter, setting the `search` component + * of `$location` to the specified value. + * + * If the argument is a hash object containing an array of values, these values will be encoded + * as duplicate search parameters in the url. + * + * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` + * will override only a single search property. + * + * If `paramValue` is an array, it will override the property of the `search` component of + * `$location` specified via the first argument. + * + * If `paramValue` is `null`, the property specified via the first argument will be deleted. + * + * If `paramValue` is `true`, the property specified via the first argument will be added with no + * value nor trailing equal sign. + * + * @return {Object} If called with no arguments returns the parsed `search` object. If called with + * one or more arguments returns `$location` object itself. + */ + search: function(search, paramValue) { + switch (arguments.length) { + case 0: + return this.$$search; + case 1: + if (isString(search) || isNumber(search)) { + search = search.toString(); + this.$$search = parseKeyValue(search); + } else if (isObject(search)) { + search = copy(search, {}); + // remove object undefined or null properties + forEach(search, function(value, key) { + if (value == null) delete search[key]; + }); + + this.$$search = search; + } else { + throw $locationMinErr('isrcharg', + 'The first argument of the `$location#search()` call must be a string or an object.'); + } + break; + default: + if (isUndefined(paramValue) || paramValue === null) { + delete this.$$search[search]; + } else { + this.$$search[search] = paramValue; + } + } + + this.$$compose(); + return this; + }, + + /** + * @ngdoc method + * @name $location#hash + * + * @description + * This method is getter / setter. + * + * Returns the hash fragment when called without any parameters. + * + * Changes the hash fragment when called with a parameter and returns `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue + * var hash = $location.hash(); + * // => "hashValue" + * ``` + * + * @param {(string|number)=} hash New hash fragment + * @return {string} hash + */ + hash: locationGetterSetter('$$hash', function(hash) { + return hash !== null ? hash.toString() : ''; + }), + + /** + * @ngdoc method + * @name $location#replace + * + * @description + * If called, all changes to $location during the current `$digest` will replace the current history + * record, instead of adding a new one. + */ + replace: function() { + this.$$replace = true; + return this; + } +}; + +forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { + Location.prototype = Object.create(locationPrototype); + + /** + * @ngdoc method + * @name $location#state + * + * @description + * This method is getter / setter. + * + * Return the history state object when called without any parameter. + * + * Change the history state object when called with one parameter and return `$location`. + * The state object is later passed to `pushState` or `replaceState`. + * + * NOTE: This method is supported only in HTML5 mode and only in browsers supporting + * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support + * older browsers (like IE9 or Android < 4.0), don't use this method. + * + * @param {object=} state State object for pushState or replaceState + * @return {object} state + */ + Location.prototype.state = function(state) { + if (!arguments.length) { + return this.$$state; + } + + if (Location !== LocationHtml5Url || !this.$$html5) { + throw $locationMinErr('nostate', 'History API state support is available only ' + + 'in HTML5 mode and only in browsers supporting HTML5 History API'); + } + // The user might modify `stateObject` after invoking `$location.state(stateObject)` + // but we're changing the $$state reference to $browser.state() during the $digest + // so the modification window is narrow. + this.$$state = isUndefined(state) ? null : state; + + return this; + }; +}); + + +function locationGetter(property) { + return function() { + return this[property]; + }; +} + + +function locationGetterSetter(property, preprocess) { + return function(value) { + if (isUndefined(value)) { + return this[property]; + } + + this[property] = preprocess(value); + this.$$compose(); + + return this; + }; +} + + +/** + * @ngdoc service + * @name $location + * + * @requires $rootElement + * + * @description + * The $location service parses the URL in the browser address bar (based on the + * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL + * available to your application. Changes to the URL in the address bar are reflected into + * $location service and changes to $location are reflected into the browser address bar. + * + * **The $location service:** + * + * - Exposes the current URL in the browser address bar, so you can + * - Watch and observe the URL. + * - Change the URL. + * - Synchronizes the URL with the browser when the user + * - Changes the address bar. + * - Clicks the back or forward button (or clicks a History link). + * - Clicks on a link. + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). + * + * For more information see {@link guide/$location Developer Guide: Using $location} + */ + +/** + * @ngdoc provider + * @name $locationProvider + * @description + * Use the `$locationProvider` to configure how the application deep linking paths are stored. + */ +function $LocationProvider() { + var hashPrefix = '', + html5Mode = { + enabled: false, + requireBase: true, + rewriteLinks: true + }; + + /** + * @ngdoc method + * @name $locationProvider#hashPrefix + * @description + * @param {string=} prefix Prefix for hash part (containing path and search) + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.hashPrefix = function(prefix) { + if (isDefined(prefix)) { + hashPrefix = prefix; + return this; + } else { + return hashPrefix; + } + }; + + /** + * @ngdoc method + * @name $locationProvider#html5Mode + * @description + * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. + * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported + * properties: + * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to + * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not + * support `pushState`. + * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies + * whether or not a tag is required to be present. If `enabled` and `requireBase` are + * true, and a base tag is not present, an error will be thrown when `$location` is injected. + * See the {@link guide/$location $location guide for more information} + * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, + * enables/disables url rewriting for relative links. + * + * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter + */ + this.html5Mode = function(mode) { + if (isBoolean(mode)) { + html5Mode.enabled = mode; + return this; + } else if (isObject(mode)) { + + if (isBoolean(mode.enabled)) { + html5Mode.enabled = mode.enabled; + } + + if (isBoolean(mode.requireBase)) { + html5Mode.requireBase = mode.requireBase; + } + + if (isBoolean(mode.rewriteLinks)) { + html5Mode.rewriteLinks = mode.rewriteLinks; + } + + return this; + } else { + return html5Mode; + } + }; + + /** + * @ngdoc event + * @name $location#$locationChangeStart + * @eventType broadcast on root scope + * @description + * Broadcasted before a URL will change. + * + * This change can be prevented by calling + * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more + * details about event object. Upon successful change + * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + /** + * @ngdoc event + * @name $location#$locationChangeSuccess + * @eventType broadcast on root scope + * @description + * Broadcasted after a URL was changed. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', + function($rootScope, $browser, $sniffer, $rootElement, $window) { + var $location, + LocationMode, + baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' + initialUrl = $browser.url(), + appBase; + + if (html5Mode.enabled) { + if (!baseHref && html5Mode.requireBase) { + throw $locationMinErr('nobase', + "$location in HTML5 mode requires a tag to be present!"); + } + appBase = serverBase(initialUrl) + (baseHref || '/'); + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; + } else { + appBase = stripHash(initialUrl); + LocationMode = LocationHashbangUrl; + } + var appBaseNoFile = stripFile(appBase); + + $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix); + $location.$$parseLinkUrl(initialUrl, initialUrl); + + $location.$$state = $browser.state(); + + var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; + + function setBrowserUrlWithFallback(url, replace, state) { + var oldUrl = $location.url(); + var oldState = $location.$$state; + try { + $browser.url(url, replace, state); + + // Make sure $location.state() returns referentially identical (not just deeply equal) + // state object; this makes possible quick checking if the state changed in the digest + // loop. Checking deep equality would be too expensive. + $location.$$state = $browser.state(); + } catch (e) { + // Restore old values if pushState fails + $location.url(oldUrl); + $location.$$state = oldState; + + throw e; + } + } + + $rootElement.on('click', function(event) { + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) + // currently we open nice url link and redirect then + + if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; + + var elm = jqLite(event.target); + + // traverse the DOM up to find first A tag + while (nodeName_(elm[0]) !== 'a') { + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; + } + + var absHref = elm.prop('href'); + // get the actual href attribute - see + // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx + var relHref = elm.attr('href') || elm.attr('xlink:href'); + + if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { + // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during + // an animation. + absHref = urlResolve(absHref.animVal).href; + } + + // Ignore when url is started with javascript: or mailto: + if (IGNORE_URI_REGEXP.test(absHref)) return; + + if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { + if ($location.$$parseLinkUrl(absHref, relHref)) { + // We do a preventDefault for all urls that are part of the angular application, + // in html5mode and also without, so that we are able to abort navigation without + // getting double entries in the location history. + event.preventDefault(); + // update location manually + if ($location.absUrl() != $browser.url()) { + $rootScope.$apply(); + // hack to work around FF6 bug 684208 when scenario runner clicks on links + $window.angular['ff-684208-preventDefault'] = true; + } + } + } + }); + + + // rewrite hashbang url <> html5 url + if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { + $browser.url($location.absUrl(), true); + } + + var initializing = true; + + // update $location when $browser url changes + $browser.onUrlChange(function(newUrl, newState) { + + if (isUndefined(stripBaseUrl(appBaseNoFile, newUrl))) { + // If we are navigating outside of the app then force a reload + $window.location.href = newUrl; + return; + } + + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + var oldState = $location.$$state; + var defaultPrevented; + newUrl = trimEmptyHash(newUrl); + $location.$$parse(newUrl); + $location.$$state = newState; + + defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + newState, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + setBrowserUrlWithFallback(oldUrl, false, oldState); + } else { + initializing = false; + afterLocationChange(oldUrl, oldState); + } + }); + if (!$rootScope.$$phase) $rootScope.$digest(); + }); + + // update browser + $rootScope.$watch(function $locationWatch() { + var oldUrl = trimEmptyHash($browser.url()); + var newUrl = trimEmptyHash($location.absUrl()); + var oldState = $browser.state(); + var currentReplace = $location.$$replace; + var urlOrStateChanged = oldUrl !== newUrl || + ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); + + if (initializing || urlOrStateChanged) { + initializing = false; + + $rootScope.$evalAsync(function() { + var newUrl = $location.absUrl(); + var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + $location.$$state, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + } else { + if (urlOrStateChanged) { + setBrowserUrlWithFallback(newUrl, currentReplace, + oldState === $location.$$state ? null : $location.$$state); + } + afterLocationChange(oldUrl, oldState); + } + }); + } + + $location.$$replace = false; + + // we don't need to return anything because $evalAsync will make the digest loop dirty when + // there is a change + }); + + return $location; + + function afterLocationChange(oldUrl, oldState) { + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, + $location.$$state, oldState); + } +}]; +} + +/** + * @ngdoc service + * @name $log + * @requires $window + * + * @description + * Simple service for logging. Default implementation safely writes the message + * into the browser's console (if present). + * + * The main purpose of this service is to simplify debugging and troubleshooting. + * + * The default is to log `debug` messages. You can use + * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. + * + * @example + + + angular.module('logExample', []) + .controller('LogController', ['$scope', '$log', function($scope, $log) { + $scope.$log = $log; + $scope.message = 'Hello World!'; + }]); + + +
+

Reload this page with open console, enter text and hit the log button...

+ + + + + + +
+
+
+ */ + +/** + * @ngdoc provider + * @name $logProvider + * @description + * Use the `$logProvider` to configure how the application logs messages + */ +function $LogProvider() { + var debug = true, + self = this; + + /** + * @ngdoc method + * @name $logProvider#debugEnabled + * @description + * @param {boolean=} flag enable or disable debug level messages + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.debugEnabled = function(flag) { + if (isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = ['$window', function($window) { + return { + /** + * @ngdoc method + * @name $log#log + * + * @description + * Write a log message + */ + log: consoleLog('log'), + + /** + * @ngdoc method + * @name $log#info + * + * @description + * Write an information message + */ + info: consoleLog('info'), + + /** + * @ngdoc method + * @name $log#warn + * + * @description + * Write a warning message + */ + warn: consoleLog('warn'), + + /** + * @ngdoc method + * @name $log#error + * + * @description + * Write an error message + */ + error: consoleLog('error'), + + /** + * @ngdoc method + * @name $log#debug + * + * @description + * Write a debug message + */ + debug: (function() { + var fn = consoleLog('debug'); + + return function() { + if (debug) { + fn.apply(self, arguments); + } + }; + }()) + }; + + function formatError(arg) { + if (arg instanceof Error) { + if (arg.stack) { + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) + ? 'Error: ' + arg.message + '\n' + arg.stack + : arg.stack; + } else if (arg.sourceURL) { + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; + } + } + return arg; + } + + function consoleLog(type) { + var console = $window.console || {}, + logFn = console[type] || console.log || noop, + hasApply = false; + + // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. + // The reason behind this is that console.log has type "object" in IE8... + try { + hasApply = !!logFn.apply; + } catch (e) {} + + if (hasApply) { + return function() { + var args = []; + forEach(arguments, function(arg) { + args.push(formatError(arg)); + }); + return logFn.apply(console, args); + }; + } + + // we are IE which either doesn't have window.console => this is noop and we do nothing, + // or we are IE where console.log doesn't have apply so we log at least first 2 args + return function(arg1, arg2) { + logFn(arg1, arg2 == null ? '' : arg2); + }; + } + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $parseMinErr = minErr('$parse'); + +// Sandboxing Angular Expressions +// ------------------------------ +// Angular expressions are generally considered safe because these expressions only have direct +// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by +// obtaining a reference to native JS functions such as the Function constructor. +// +// As an example, consider the following Angular expression: +// +// {}.toString.constructor('alert("evil JS code")') +// +// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits +// against the expression language, but not to prevent exploits that were enabled by exposing +// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good +// practice and therefore we are not even trying to protect against interaction with an object +// explicitly exposed in this way. +// +// In general, it is not possible to access a Window object from an angular expression unless a +// window or some DOM object that has a reference to window is published onto a Scope. +// Similarly we prevent invocations of function known to be dangerous, as well as assignments to +// native objects. +// +// See https://docs.angularjs.org/guide/security + + +function ensureSafeMemberName(name, fullExpression) { + if (name === "__defineGetter__" || name === "__defineSetter__" + || name === "__lookupGetter__" || name === "__lookupSetter__" + || name === "__proto__") { + throw $parseMinErr('isecfld', + 'Attempting to access a disallowed field in Angular expressions! ' + + 'Expression: {0}', fullExpression); + } + return name; +} + +function getStringValue(name) { + // Property names must be strings. This means that non-string objects cannot be used + // as keys in an object. Any non-string object, including a number, is typecasted + // into a string via the toString method. + // -- MDN, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Property_accessors#Property_names + // + // So, to ensure that we are checking the same `name` that JavaScript would use, we cast it + // to a string. It's not always possible. If `name` is an object and its `toString` method is + // 'broken' (doesn't return a string, isn't a function, etc.), an error will be thrown: + // + // TypeError: Cannot convert object to primitive value + // + // For performance reasons, we don't catch this error here and allow it to propagate up the call + // stack. Note that you'll get the same error in JavaScript if you try to access a property using + // such a 'broken' object as a key. + return name + ''; +} + +function ensureSafeObject(obj, fullExpression) { + // nifty check if obj is Function that is fast and works across iframes and other contexts + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isWindow(obj) + obj.window === obj) { + throw $parseMinErr('isecwindow', + 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isElement(obj) + obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { + throw $parseMinErr('isecdom', + 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// block Object so that we can't get hold of dangerous Object.* methods + obj === Object) { + throw $parseMinErr('isecobj', + 'Referencing Object in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } + return obj; +} + +var CALL = Function.prototype.call; +var APPLY = Function.prototype.apply; +var BIND = Function.prototype.bind; + +function ensureSafeFunction(obj, fullExpression) { + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (obj === CALL || obj === APPLY || obj === BIND) { + throw $parseMinErr('isecff', + 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } +} + +function ensureSafeAssignContext(obj, fullExpression) { + if (obj) { + if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor || + obj === {}.constructor || obj === [].constructor || obj === Function.constructor) { + throw $parseMinErr('isecaf', + 'Assigning to a constructor is disallowed! Expression: {0}', fullExpression); + } + } +} + +var OPERATORS = createMap(); +forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; + + +///////////////////////////////////////// + + +/** + * @constructor + */ +var Lexer = function(options) { + this.options = options; +}; + +Lexer.prototype = { + constructor: Lexer, + + lex: function(text) { + this.text = text; + this.index = 0; + this.tokens = []; + + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (ch === '"' || ch === "'") { + this.readString(ch); + } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { + this.readNumber(); + } else if (this.isIdentifierStart(this.peekMultichar())) { + this.readIdent(); + } else if (this.is(ch, '(){}[].,;:?')) { + this.tokens.push({index: this.index, text: ch}); + this.index++; + } else if (this.isWhitespace(ch)) { + this.index++; + } else { + var ch2 = ch + this.peek(); + var ch3 = ch2 + this.peek(2); + var op1 = OPERATORS[ch]; + var op2 = OPERATORS[ch2]; + var op3 = OPERATORS[ch3]; + if (op1 || op2 || op3) { + var token = op3 ? ch3 : (op2 ? ch2 : ch); + this.tokens.push({index: this.index, text: token, operator: true}); + this.index += token.length; + } else { + this.throwError('Unexpected next character ', this.index, this.index + 1); + } + } + } + return this.tokens; + }, + + is: function(ch, chars) { + return chars.indexOf(ch) !== -1; + }, + + peek: function(i) { + var num = i || 1; + return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; + }, + + isNumber: function(ch) { + return ('0' <= ch && ch <= '9') && typeof ch === "string"; + }, + + isWhitespace: function(ch) { + // IE treats non-breaking space as \u00A0 + return (ch === ' ' || ch === '\r' || ch === '\t' || + ch === '\n' || ch === '\v' || ch === '\u00A0'); + }, + + isIdentifierStart: function(ch) { + return this.options.isIdentifierStart ? + this.options.isIdentifierStart(ch, this.codePointAt(ch)) : + this.isValidIdentifierStart(ch); + }, + + isValidIdentifierStart: function(ch) { + return ('a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + '_' === ch || ch === '$'); + }, + + isIdentifierContinue: function(ch) { + return this.options.isIdentifierContinue ? + this.options.isIdentifierContinue(ch, this.codePointAt(ch)) : + this.isValidIdentifierContinue(ch); + }, + + isValidIdentifierContinue: function(ch, cp) { + return this.isValidIdentifierStart(ch, cp) || this.isNumber(ch); + }, + + codePointAt: function(ch) { + if (ch.length === 1) return ch.charCodeAt(0); + /*jshint bitwise: false*/ + return (ch.charCodeAt(0) << 10) + ch.charCodeAt(1) - 0x35FDC00; + /*jshint bitwise: true*/ + }, + + peekMultichar: function() { + var ch = this.text.charAt(this.index); + var peek = this.peek(); + if (!peek) { + return ch; + } + var cp1 = ch.charCodeAt(0); + var cp2 = peek.charCodeAt(0); + if (cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF) { + return ch + peek; + } + return ch; + }, + + isExpOperator: function(ch) { + return (ch === '-' || ch === '+' || this.isNumber(ch)); + }, + + throwError: function(error, start, end) { + end = end || this.index; + var colStr = (isDefined(start) + ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' + : ' ' + end); + throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', + error, colStr, this.text); + }, + + readNumber: function() { + var number = ''; + var start = this.index; + while (this.index < this.text.length) { + var ch = lowercase(this.text.charAt(this.index)); + if (ch == '.' || this.isNumber(ch)) { + number += ch; + } else { + var peekCh = this.peek(); + if (ch == 'e' && this.isExpOperator(peekCh)) { + number += ch; + } else if (this.isExpOperator(ch) && + peekCh && this.isNumber(peekCh) && + number.charAt(number.length - 1) == 'e') { + number += ch; + } else if (this.isExpOperator(ch) && + (!peekCh || !this.isNumber(peekCh)) && + number.charAt(number.length - 1) == 'e') { + this.throwError('Invalid exponent'); + } else { + break; + } + } + this.index++; + } + this.tokens.push({ + index: start, + text: number, + constant: true, + value: Number(number) + }); + }, + + readIdent: function() { + var start = this.index; + this.index += this.peekMultichar().length; + while (this.index < this.text.length) { + var ch = this.peekMultichar(); + if (!this.isIdentifierContinue(ch)) { + break; + } + this.index += ch.length; + } + this.tokens.push({ + index: start, + text: this.text.slice(start, this.index), + identifier: true + }); + }, + + readString: function(quote) { + var start = this.index; + this.index++; + var string = ''; + var rawString = quote; + var escape = false; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + rawString += ch; + if (escape) { + if (ch === 'u') { + var hex = this.text.substring(this.index + 1, this.index + 5); + if (!hex.match(/[\da-f]{4}/i)) { + this.throwError('Invalid unicode escape [\\u' + hex + ']'); + } + this.index += 4; + string += String.fromCharCode(parseInt(hex, 16)); + } else { + var rep = ESCAPE[ch]; + string = string + (rep || ch); + } + escape = false; + } else if (ch === '\\') { + escape = true; + } else if (ch === quote) { + this.index++; + this.tokens.push({ + index: start, + text: rawString, + constant: true, + value: string + }); + return; + } else { + string += ch; + } + this.index++; + } + this.throwError('Unterminated quote', start); + } +}; + +var AST = function(lexer, options) { + this.lexer = lexer; + this.options = options; +}; + +AST.Program = 'Program'; +AST.ExpressionStatement = 'ExpressionStatement'; +AST.AssignmentExpression = 'AssignmentExpression'; +AST.ConditionalExpression = 'ConditionalExpression'; +AST.LogicalExpression = 'LogicalExpression'; +AST.BinaryExpression = 'BinaryExpression'; +AST.UnaryExpression = 'UnaryExpression'; +AST.CallExpression = 'CallExpression'; +AST.MemberExpression = 'MemberExpression'; +AST.Identifier = 'Identifier'; +AST.Literal = 'Literal'; +AST.ArrayExpression = 'ArrayExpression'; +AST.Property = 'Property'; +AST.ObjectExpression = 'ObjectExpression'; +AST.ThisExpression = 'ThisExpression'; +AST.LocalsExpression = 'LocalsExpression'; + +// Internal use only +AST.NGValueParameter = 'NGValueParameter'; + +AST.prototype = { + ast: function(text) { + this.text = text; + this.tokens = this.lexer.lex(text); + + var value = this.program(); + + if (this.tokens.length !== 0) { + this.throwError('is an unexpected token', this.tokens[0]); + } + + return value; + }, + + program: function() { + var body = []; + while (true) { + if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) + body.push(this.expressionStatement()); + if (!this.expect(';')) { + return { type: AST.Program, body: body}; + } + } + }, + + expressionStatement: function() { + return { type: AST.ExpressionStatement, expression: this.filterChain() }; + }, + + filterChain: function() { + var left = this.expression(); + var token; + while ((token = this.expect('|'))) { + left = this.filter(left); + } + return left; + }, + + expression: function() { + return this.assignment(); + }, + + assignment: function() { + var result = this.ternary(); + if (this.expect('=')) { + result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='}; + } + return result; + }, + + ternary: function() { + var test = this.logicalOR(); + var alternate; + var consequent; + if (this.expect('?')) { + alternate = this.expression(); + if (this.consume(':')) { + consequent = this.expression(); + return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent}; + } + } + return test; + }, + + logicalOR: function() { + var left = this.logicalAND(); + while (this.expect('||')) { + left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() }; + } + return left; + }, + + logicalAND: function() { + var left = this.equality(); + while (this.expect('&&')) { + left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()}; + } + return left; + }, + + equality: function() { + var left = this.relational(); + var token; + while ((token = this.expect('==','!=','===','!=='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() }; + } + return left; + }, + + relational: function() { + var left = this.additive(); + var token; + while ((token = this.expect('<', '>', '<=', '>='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() }; + } + return left; + }, + + additive: function() { + var left = this.multiplicative(); + var token; + while ((token = this.expect('+','-'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() }; + } + return left; + }, + + multiplicative: function() { + var left = this.unary(); + var token; + while ((token = this.expect('*','/','%'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() }; + } + return left; + }, + + unary: function() { + var token; + if ((token = this.expect('+', '-', '!'))) { + return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() }; + } else { + return this.primary(); + } + }, + + primary: function() { + var primary; + if (this.expect('(')) { + primary = this.filterChain(); + this.consume(')'); + } else if (this.expect('[')) { + primary = this.arrayDeclaration(); + } else if (this.expect('{')) { + primary = this.object(); + } else if (this.selfReferential.hasOwnProperty(this.peek().text)) { + primary = copy(this.selfReferential[this.consume().text]); + } else if (this.options.literals.hasOwnProperty(this.peek().text)) { + primary = { type: AST.Literal, value: this.options.literals[this.consume().text]}; + } else if (this.peek().identifier) { + primary = this.identifier(); + } else if (this.peek().constant) { + primary = this.constant(); + } else { + this.throwError('not a primary expression', this.peek()); + } + + var next; + while ((next = this.expect('(', '[', '.'))) { + if (next.text === '(') { + primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() }; + this.consume(')'); + } else if (next.text === '[') { + primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true }; + this.consume(']'); + } else if (next.text === '.') { + primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false }; + } else { + this.throwError('IMPOSSIBLE'); + } + } + return primary; + }, + + filter: function(baseExpression) { + var args = [baseExpression]; + var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true}; + + while (this.expect(':')) { + args.push(this.expression()); + } + + return result; + }, + + parseArguments: function() { + var args = []; + if (this.peekToken().text !== ')') { + do { + args.push(this.filterChain()); + } while (this.expect(',')); + } + return args; + }, + + identifier: function() { + var token = this.consume(); + if (!token.identifier) { + this.throwError('is not a valid identifier', token); + } + return { type: AST.Identifier, name: token.text }; + }, + + constant: function() { + // TODO check that it is a constant + return { type: AST.Literal, value: this.consume().value }; + }, + + arrayDeclaration: function() { + var elements = []; + if (this.peekToken().text !== ']') { + do { + if (this.peek(']')) { + // Support trailing commas per ES5.1. + break; + } + elements.push(this.expression()); + } while (this.expect(',')); + } + this.consume(']'); + + return { type: AST.ArrayExpression, elements: elements }; + }, + + object: function() { + var properties = [], property; + if (this.peekToken().text !== '}') { + do { + if (this.peek('}')) { + // Support trailing commas per ES5.1. + break; + } + property = {type: AST.Property, kind: 'init'}; + if (this.peek().constant) { + property.key = this.constant(); + property.computed = false; + this.consume(':'); + property.value = this.expression(); + } else if (this.peek().identifier) { + property.key = this.identifier(); + property.computed = false; + if (this.peek(':')) { + this.consume(':'); + property.value = this.expression(); + } else { + property.value = property.key; + } + } else if (this.peek('[')) { + this.consume('['); + property.key = this.expression(); + this.consume(']'); + property.computed = true; + this.consume(':'); + property.value = this.expression(); + } else { + this.throwError("invalid key", this.peek()); + } + properties.push(property); + } while (this.expect(',')); + } + this.consume('}'); + + return {type: AST.ObjectExpression, properties: properties }; + }, + + throwError: function(msg, token) { + throw $parseMinErr('syntax', + 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', + token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); + }, + + consume: function(e1) { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + + var token = this.expect(e1); + if (!token) { + this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); + } + return token; + }, + + peekToken: function() { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + return this.tokens[0]; + }, + + peek: function(e1, e2, e3, e4) { + return this.peekAhead(0, e1, e2, e3, e4); + }, + + peekAhead: function(i, e1, e2, e3, e4) { + if (this.tokens.length > i) { + var token = this.tokens[i]; + var t = token.text; + if (t === e1 || t === e2 || t === e3 || t === e4 || + (!e1 && !e2 && !e3 && !e4)) { + return token; + } + } + return false; + }, + + expect: function(e1, e2, e3, e4) { + var token = this.peek(e1, e2, e3, e4); + if (token) { + this.tokens.shift(); + return token; + } + return false; + }, + + selfReferential: { + 'this': {type: AST.ThisExpression }, + '$locals': {type: AST.LocalsExpression } + } +}; + +function ifDefined(v, d) { + return typeof v !== 'undefined' ? v : d; +} + +function plusFn(l, r) { + if (typeof l === 'undefined') return r; + if (typeof r === 'undefined') return l; + return l + r; +} + +function isStateless($filter, filterName) { + var fn = $filter(filterName); + return !fn.$stateful; +} + +function findConstantAndWatchExpressions(ast, $filter) { + var allConstants; + var argsToWatch; + switch (ast.type) { + case AST.Program: + allConstants = true; + forEach(ast.body, function(expr) { + findConstantAndWatchExpressions(expr.expression, $filter); + allConstants = allConstants && expr.expression.constant; + }); + ast.constant = allConstants; + break; + case AST.Literal: + ast.constant = true; + ast.toWatch = []; + break; + case AST.UnaryExpression: + findConstantAndWatchExpressions(ast.argument, $filter); + ast.constant = ast.argument.constant; + ast.toWatch = ast.argument.toWatch; + break; + case AST.BinaryExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch); + break; + case AST.LogicalExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.ConditionalExpression: + findConstantAndWatchExpressions(ast.test, $filter); + findConstantAndWatchExpressions(ast.alternate, $filter); + findConstantAndWatchExpressions(ast.consequent, $filter); + ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.Identifier: + ast.constant = false; + ast.toWatch = [ast]; + break; + case AST.MemberExpression: + findConstantAndWatchExpressions(ast.object, $filter); + if (ast.computed) { + findConstantAndWatchExpressions(ast.property, $filter); + } + ast.constant = ast.object.constant && (!ast.computed || ast.property.constant); + ast.toWatch = [ast]; + break; + case AST.CallExpression: + allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; + argsToWatch = []; + forEach(ast.arguments, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; + break; + case AST.AssignmentExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = [ast]; + break; + case AST.ArrayExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.elements, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ObjectExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.properties, function(property) { + findConstantAndWatchExpressions(property.value, $filter); + allConstants = allConstants && property.value.constant && !property.computed; + if (!property.value.constant) { + argsToWatch.push.apply(argsToWatch, property.value.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ThisExpression: + ast.constant = false; + ast.toWatch = []; + break; + case AST.LocalsExpression: + ast.constant = false; + ast.toWatch = []; + break; + } +} + +function getInputs(body) { + if (body.length != 1) return; + var lastExpression = body[0].expression; + var candidate = lastExpression.toWatch; + if (candidate.length !== 1) return candidate; + return candidate[0] !== lastExpression ? candidate : undefined; +} + +function isAssignable(ast) { + return ast.type === AST.Identifier || ast.type === AST.MemberExpression; +} + +function assignableAST(ast) { + if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) { + return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='}; + } +} + +function isLiteral(ast) { + return ast.body.length === 0 || + ast.body.length === 1 && ( + ast.body[0].expression.type === AST.Literal || + ast.body[0].expression.type === AST.ArrayExpression || + ast.body[0].expression.type === AST.ObjectExpression); +} + +function isConstant(ast) { + return ast.constant; +} + +function ASTCompiler(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTCompiler.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.state = { + nextId: 0, + filters: {}, + expensiveChecks: expensiveChecks, + fn: {vars: [], body: [], own: {}}, + assign: {vars: [], body: [], own: {}}, + inputs: [] + }; + findConstantAndWatchExpressions(ast, self.$filter); + var extra = ''; + var assignable; + this.stage = 'assign'; + if ((assignable = assignableAST(ast))) { + this.state.computing = 'assign'; + var result = this.nextId(); + this.recurse(assignable, result); + this.return_(result); + extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l'); + } + var toWatch = getInputs(ast.body); + self.stage = 'inputs'; + forEach(toWatch, function(watch, key) { + var fnKey = 'fn' + key; + self.state[fnKey] = {vars: [], body: [], own: {}}; + self.state.computing = fnKey; + var intoId = self.nextId(); + self.recurse(watch, intoId); + self.return_(intoId); + self.state.inputs.push(fnKey); + watch.watchId = key; + }); + this.state.computing = 'fn'; + this.stage = 'main'; + this.recurse(ast); + var fnString = + // The build and minification steps remove the string "use strict" from the code, but this is done using a regex. + // This is a workaround for this until we do a better job at only removing the prefix only when we should. + '"' + this.USE + ' ' + this.STRICT + '";\n' + + this.filterPrefix() + + 'var fn=' + this.generateFunction('fn', 's,l,a,i') + + extra + + this.watchFns() + + 'return fn;'; + + /* jshint -W054 */ + var fn = (new Function('$filter', + 'ensureSafeMemberName', + 'ensureSafeObject', + 'ensureSafeFunction', + 'getStringValue', + 'ensureSafeAssignContext', + 'ifDefined', + 'plus', + 'text', + fnString))( + this.$filter, + ensureSafeMemberName, + ensureSafeObject, + ensureSafeFunction, + getStringValue, + ensureSafeAssignContext, + ifDefined, + plusFn, + expression); + /* jshint +W054 */ + this.state = this.stage = undefined; + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + USE: 'use', + + STRICT: 'strict', + + watchFns: function() { + var result = []; + var fns = this.state.inputs; + var self = this; + forEach(fns, function(name) { + result.push('var ' + name + '=' + self.generateFunction(name, 's')); + }); + if (fns.length) { + result.push('fn.inputs=[' + fns.join(',') + '];'); + } + return result.join(''); + }, + + generateFunction: function(name, params) { + return 'function(' + params + '){' + + this.varsPrefix(name) + + this.body(name) + + '};'; + }, + + filterPrefix: function() { + var parts = []; + var self = this; + forEach(this.state.filters, function(id, filter) { + parts.push(id + '=$filter(' + self.escape(filter) + ')'); + }); + if (parts.length) return 'var ' + parts.join(',') + ';'; + return ''; + }, + + varsPrefix: function(section) { + return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : ''; + }, + + body: function(section) { + return this.state[section].body.join(''); + }, + + recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var left, right, self = this, args, expression, computed; + recursionFn = recursionFn || noop; + if (!skipWatchIdCheck && isDefined(ast.watchId)) { + intoId = intoId || this.nextId(); + this.if_('i', + this.lazyAssign(intoId, this.computedMember('i', ast.watchId)), + this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true) + ); + return; + } + switch (ast.type) { + case AST.Program: + forEach(ast.body, function(expression, pos) { + self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; }); + if (pos !== ast.body.length - 1) { + self.current().body.push(right, ';'); + } else { + self.return_(right); + } + }); + break; + case AST.Literal: + expression = this.escape(ast.value); + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.UnaryExpression: + this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; }); + expression = ast.operator + '(' + this.ifDefined(right, 0) + ')'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.BinaryExpression: + this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; }); + this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; }); + if (ast.operator === '+') { + expression = this.plus(left, right); + } else if (ast.operator === '-') { + expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0); + } else { + expression = '(' + left + ')' + ast.operator + '(' + right + ')'; + } + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.LogicalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.left, intoId); + self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId)); + recursionFn(intoId); + break; + case AST.ConditionalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.test, intoId); + self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId)); + recursionFn(intoId); + break; + case AST.Identifier: + intoId = intoId || this.nextId(); + if (nameId) { + nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s'); + nameId.computed = false; + nameId.name = ast.name; + } + ensureSafeMemberName(ast.name); + self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), + function() { + self.if_(self.stage === 'inputs' || 's', function() { + if (create && create !== 1) { + self.if_( + self.not(self.nonComputedMember('s', ast.name)), + self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); + } + self.assign(intoId, self.nonComputedMember('s', ast.name)); + }); + }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) + ); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { + self.addEnsureSafeObject(intoId); + } + recursionFn(intoId); + break; + case AST.MemberExpression: + left = nameId && (nameId.context = this.nextId()) || this.nextId(); + intoId = intoId || this.nextId(); + self.recurse(ast.object, left, undefined, function() { + self.if_(self.notNull(left), function() { + if (create && create !== 1) { + self.addEnsureSafeAssignContext(left); + } + if (ast.computed) { + right = self.nextId(); + self.recurse(ast.property, right); + self.getStringValue(right); + self.addEnsureSafeMemberName(right); + if (create && create !== 1) { + self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); + } + expression = self.ensureSafeObject(self.computedMember(left, right)); + self.assign(intoId, expression); + if (nameId) { + nameId.computed = true; + nameId.name = right; + } + } else { + ensureSafeMemberName(ast.property.name); + if (create && create !== 1) { + self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); + } + expression = self.nonComputedMember(left, ast.property.name); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { + expression = self.ensureSafeObject(expression); + } + self.assign(intoId, expression); + if (nameId) { + nameId.computed = false; + nameId.name = ast.property.name; + } + } + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }, !!create); + break; + case AST.CallExpression: + intoId = intoId || this.nextId(); + if (ast.filter) { + right = self.filter(ast.callee.name); + args = []; + forEach(ast.arguments, function(expr) { + var argument = self.nextId(); + self.recurse(expr, argument); + args.push(argument); + }); + expression = right + '(' + args.join(',') + ')'; + self.assign(intoId, expression); + recursionFn(intoId); + } else { + right = self.nextId(); + left = {}; + args = []; + self.recurse(ast.callee, right, left, function() { + self.if_(self.notNull(right), function() { + self.addEnsureSafeFunction(right); + forEach(ast.arguments, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(self.ensureSafeObject(argument)); + }); + }); + if (left.name) { + if (!self.state.expensiveChecks) { + self.addEnsureSafeObject(left.context); + } + expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; + } else { + expression = right + '(' + args.join(',') + ')'; + } + expression = self.ensureSafeObject(expression); + self.assign(intoId, expression); + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }); + } + break; + case AST.AssignmentExpression: + right = this.nextId(); + left = {}; + if (!isAssignable(ast.left)) { + throw $parseMinErr('lval', 'Trying to assign a value to a non l-value'); + } + this.recurse(ast.left, undefined, left, function() { + self.if_(self.notNull(left.context), function() { + self.recurse(ast.right, right); + self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); + self.addEnsureSafeAssignContext(left.context); + expression = self.member(left.context, left.name, left.computed) + ast.operator + right; + self.assign(intoId, expression); + recursionFn(intoId || expression); + }); + }, 1); + break; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(argument); + }); + }); + expression = '[' + args.join(',') + ']'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ObjectExpression: + args = []; + computed = false; + forEach(ast.properties, function(property) { + if (property.computed) { + computed = true; + } + }); + if (computed) { + intoId = intoId || this.nextId(); + this.assign(intoId, '{}'); + forEach(ast.properties, function(property) { + if (property.computed) { + left = self.nextId(); + self.recurse(property.key, left); + } else { + left = property.key.type === AST.Identifier ? + property.key.name : + ('' + property.key.value); + } + right = self.nextId(); + self.recurse(property.value, right); + self.assign(self.member(intoId, left, property.computed), right); + }); + } else { + forEach(ast.properties, function(property) { + self.recurse(property.value, ast.constant ? undefined : self.nextId(), undefined, function(expr) { + args.push(self.escape( + property.key.type === AST.Identifier ? property.key.name : + ('' + property.key.value)) + + ':' + expr); + }); + }); + expression = '{' + args.join(',') + '}'; + this.assign(intoId, expression); + } + recursionFn(intoId || expression); + break; + case AST.ThisExpression: + this.assign(intoId, 's'); + recursionFn('s'); + break; + case AST.LocalsExpression: + this.assign(intoId, 'l'); + recursionFn('l'); + break; + case AST.NGValueParameter: + this.assign(intoId, 'v'); + recursionFn('v'); + break; + } + }, + + getHasOwnProperty: function(element, property) { + var key = element + '.' + property; + var own = this.current().own; + if (!own.hasOwnProperty(key)) { + own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')'); + } + return own[key]; + }, + + assign: function(id, value) { + if (!id) return; + this.current().body.push(id, '=', value, ';'); + return id; + }, + + filter: function(filterName) { + if (!this.state.filters.hasOwnProperty(filterName)) { + this.state.filters[filterName] = this.nextId(true); + } + return this.state.filters[filterName]; + }, + + ifDefined: function(id, defaultValue) { + return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')'; + }, + + plus: function(left, right) { + return 'plus(' + left + ',' + right + ')'; + }, + + return_: function(id) { + this.current().body.push('return ', id, ';'); + }, + + if_: function(test, alternate, consequent) { + if (test === true) { + alternate(); + } else { + var body = this.current().body; + body.push('if(', test, '){'); + alternate(); + body.push('}'); + if (consequent) { + body.push('else{'); + consequent(); + body.push('}'); + } + } + }, + + not: function(expression) { + return '!(' + expression + ')'; + }, + + notNull: function(expression) { + return expression + '!=null'; + }, + + nonComputedMember: function(left, right) { + var SAFE_IDENTIFIER = /[$_a-zA-Z][$_a-zA-Z0-9]*/; + var UNSAFE_CHARACTERS = /[^$_a-zA-Z0-9]/g; + if (SAFE_IDENTIFIER.test(right)) { + return left + '.' + right; + } else { + return left + '["' + right.replace(UNSAFE_CHARACTERS, this.stringEscapeFn) + '"]'; + } + }, + + computedMember: function(left, right) { + return left + '[' + right + ']'; + }, + + member: function(left, right, computed) { + if (computed) return this.computedMember(left, right); + return this.nonComputedMember(left, right); + }, + + addEnsureSafeObject: function(item) { + this.current().body.push(this.ensureSafeObject(item), ';'); + }, + + addEnsureSafeMemberName: function(item) { + this.current().body.push(this.ensureSafeMemberName(item), ';'); + }, + + addEnsureSafeFunction: function(item) { + this.current().body.push(this.ensureSafeFunction(item), ';'); + }, + + addEnsureSafeAssignContext: function(item) { + this.current().body.push(this.ensureSafeAssignContext(item), ';'); + }, + + ensureSafeObject: function(item) { + return 'ensureSafeObject(' + item + ',text)'; + }, + + ensureSafeMemberName: function(item) { + return 'ensureSafeMemberName(' + item + ',text)'; + }, + + ensureSafeFunction: function(item) { + return 'ensureSafeFunction(' + item + ',text)'; + }, + + getStringValue: function(item) { + this.assign(item, 'getStringValue(' + item + ')'); + }, + + ensureSafeAssignContext: function(item) { + return 'ensureSafeAssignContext(' + item + ',text)'; + }, + + lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var self = this; + return function() { + self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck); + }; + }, + + lazyAssign: function(id, value) { + var self = this; + return function() { + self.assign(id, value); + }; + }, + + stringEscapeRegex: /[^ a-zA-Z0-9]/g, + + stringEscapeFn: function(c) { + return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); + }, + + escape: function(value) { + if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; + if (isNumber(value)) return value.toString(); + if (value === true) return 'true'; + if (value === false) return 'false'; + if (value === null) return 'null'; + if (typeof value === 'undefined') return 'undefined'; + + throw $parseMinErr('esc', 'IMPOSSIBLE'); + }, + + nextId: function(skip, init) { + var id = 'v' + (this.state.nextId++); + if (!skip) { + this.current().vars.push(id + (init ? '=' + init : '')); + } + return id; + }, + + current: function() { + return this.state[this.state.computing]; + } +}; + + +function ASTInterpreter(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTInterpreter.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.expression = expression; + this.expensiveChecks = expensiveChecks; + findConstantAndWatchExpressions(ast, self.$filter); + var assignable; + var assign; + if ((assignable = assignableAST(ast))) { + assign = this.recurse(assignable); + } + var toWatch = getInputs(ast.body); + var inputs; + if (toWatch) { + inputs = []; + forEach(toWatch, function(watch, key) { + var input = self.recurse(watch); + watch.input = input; + inputs.push(input); + watch.watchId = key; + }); + } + var expressions = []; + forEach(ast.body, function(expression) { + expressions.push(self.recurse(expression.expression)); + }); + var fn = ast.body.length === 0 ? noop : + ast.body.length === 1 ? expressions[0] : + function(scope, locals) { + var lastValue; + forEach(expressions, function(exp) { + lastValue = exp(scope, locals); + }); + return lastValue; + }; + if (assign) { + fn.assign = function(scope, value, locals) { + return assign(scope, locals, value); + }; + } + if (inputs) { + fn.inputs = inputs; + } + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + recurse: function(ast, context, create) { + var left, right, self = this, args, expression; + if (ast.input) { + return this.inputs(ast.input, ast.watchId); + } + switch (ast.type) { + case AST.Literal: + return this.value(ast.value, context); + case AST.UnaryExpression: + right = this.recurse(ast.argument); + return this['unary' + ast.operator](right, context); + case AST.BinaryExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.LogicalExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.ConditionalExpression: + return this['ternary?:']( + this.recurse(ast.test), + this.recurse(ast.alternate), + this.recurse(ast.consequent), + context + ); + case AST.Identifier: + ensureSafeMemberName(ast.name, self.expression); + return self.identifier(ast.name, + self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), + context, create, self.expression); + case AST.MemberExpression: + left = this.recurse(ast.object, false, !!create); + if (!ast.computed) { + ensureSafeMemberName(ast.property.name, self.expression); + right = ast.property.name; + } + if (ast.computed) right = this.recurse(ast.property); + return ast.computed ? + this.computedMember(left, right, context, create, self.expression) : + this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); + case AST.CallExpression: + args = []; + forEach(ast.arguments, function(expr) { + args.push(self.recurse(expr)); + }); + if (ast.filter) right = this.$filter(ast.callee.name); + if (!ast.filter) right = this.recurse(ast.callee, true); + return ast.filter ? + function(scope, locals, assign, inputs) { + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(args[i](scope, locals, assign, inputs)); + } + var value = right.apply(undefined, values, inputs); + return context ? {context: undefined, name: undefined, value: value} : value; + } : + function(scope, locals, assign, inputs) { + var rhs = right(scope, locals, assign, inputs); + var value; + if (rhs.value != null) { + ensureSafeObject(rhs.context, self.expression); + ensureSafeFunction(rhs.value, self.expression); + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); + } + value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); + } + return context ? {value: value} : value; + }; + case AST.AssignmentExpression: + left = this.recurse(ast.left, true, 1); + right = this.recurse(ast.right); + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + ensureSafeObject(lhs.value, self.expression); + ensureSafeAssignContext(lhs.context); + lhs.context[lhs.name] = rhs; + return context ? {value: rhs} : rhs; + }; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + args.push(self.recurse(expr)); + }); + return function(scope, locals, assign, inputs) { + var value = []; + for (var i = 0; i < args.length; ++i) { + value.push(args[i](scope, locals, assign, inputs)); + } + return context ? {value: value} : value; + }; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + if (property.computed) { + args.push({key: self.recurse(property.key), + computed: true, + value: self.recurse(property.value) + }); + } else { + args.push({key: property.key.type === AST.Identifier ? + property.key.name : + ('' + property.key.value), + computed: false, + value: self.recurse(property.value) + }); + } + }); + return function(scope, locals, assign, inputs) { + var value = {}; + for (var i = 0; i < args.length; ++i) { + if (args[i].computed) { + value[args[i].key(scope, locals, assign, inputs)] = args[i].value(scope, locals, assign, inputs); + } else { + value[args[i].key] = args[i].value(scope, locals, assign, inputs); + } + } + return context ? {value: value} : value; + }; + case AST.ThisExpression: + return function(scope) { + return context ? {value: scope} : scope; + }; + case AST.LocalsExpression: + return function(scope, locals) { + return context ? {value: locals} : locals; + }; + case AST.NGValueParameter: + return function(scope, locals, assign) { + return context ? {value: assign} : assign; + }; + } + }, + + 'unary+': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = +arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary-': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = -arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary!': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = !argument(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary+': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = plusFn(lhs, rhs); + return context ? {value: arg} : arg; + }; + }, + 'binary-': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0); + return context ? {value: arg} : arg; + }; + }, + 'binary*': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary/': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary%': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary===': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary&&': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary||': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'ternary?:': function(test, alternate, consequent, context) { + return function(scope, locals, assign, inputs) { + var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + value: function(value, context) { + return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; + }, + identifier: function(name, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var base = locals && (name in locals) ? locals : scope; + if (create && create !== 1 && base && !(base[name])) { + base[name] = {}; + } + var value = base ? base[name] : undefined; + if (expensiveChecks) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: base, name: name, value: value}; + } else { + return value; + } + }; + }, + computedMember: function(left, right, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs; + var value; + if (lhs != null) { + rhs = right(scope, locals, assign, inputs); + rhs = getStringValue(rhs); + ensureSafeMemberName(rhs, expression); + if (create && create !== 1) { + ensureSafeAssignContext(lhs); + if (lhs && !(lhs[rhs])) { + lhs[rhs] = {}; + } + } + value = lhs[rhs]; + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: rhs, value: value}; + } else { + return value; + } + }; + }, + nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + if (create && create !== 1) { + ensureSafeAssignContext(lhs); + if (lhs && !(lhs[right])) { + lhs[right] = {}; + } + } + var value = lhs != null ? lhs[right] : undefined; + if (expensiveChecks || isPossiblyDangerousMemberName(right)) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: right, value: value}; + } else { + return value; + } + }; + }, + inputs: function(input, watchId) { + return function(scope, value, locals, inputs) { + if (inputs) return inputs[watchId]; + return input(scope, value, locals); + }; + } +}; + +/** + * @constructor + */ +var Parser = function(lexer, $filter, options) { + this.lexer = lexer; + this.$filter = $filter; + this.options = options; + this.ast = new AST(lexer, options); + this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) : + new ASTCompiler(this.ast, $filter); +}; + +Parser.prototype = { + constructor: Parser, + + parse: function(text) { + return this.astCompiler.compile(text, this.options.expensiveChecks); + } +}; + +function isPossiblyDangerousMemberName(name) { + return name == 'constructor'; +} + +var objectValueOf = Object.prototype.valueOf; + +function getValueOf(value) { + return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); +} + +/////////////////////////////////// + +/** + * @ngdoc service + * @name $parse + * @kind function + * + * @description + * + * Converts Angular {@link guide/expression expression} into a function. + * + * ```js + * var getter = $parse('user.name'); + * var setter = getter.assign; + * var context = {user:{name:'angular'}}; + * var locals = {user:{name:'local'}}; + * + * expect(getter(context)).toEqual('angular'); + * setter(context, 'newValue'); + * expect(context.user.name).toEqual('newValue'); + * expect(getter(context, locals)).toEqual('local'); + * ``` + * + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + * + * The returned function also has the following properties: + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript + * literal. + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript + * constant literals. + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be + * set to a function to change its value on the given context. + * + */ + + +/** + * @ngdoc provider + * @name $parseProvider + * + * @description + * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} + * service. + */ +function $ParseProvider() { + var cacheDefault = createMap(); + var cacheExpensive = createMap(); + var literals = { + 'true': true, + 'false': false, + 'null': null, + 'undefined': undefined + }; + var identStart, identContinue; + + /** + * @ngdoc method + * @name $parseProvider#addLiteral + * @description + * + * Configure $parse service to add literal values that will be present as literal at expressions. + * + * @param {string} literalName Token for the literal value. The literal name value must be a valid literal name. + * @param {*} literalValue Value for this literal. All literal values must be primitives or `undefined`. + * + **/ + this.addLiteral = function(literalName, literalValue) { + literals[literalName] = literalValue; + }; + + /** + * @ngdoc method + * @name $parseProvider#setIdentifierFns + * @description + * + * Allows defining the set of characters that are allowed in Angular expressions. The function + * `identifierStart` will get called to know if a given character is a valid character to be the + * first character for an identifier. The function `identifierContinue` will get called to know if + * a given character is a valid character to be a follow-up identifier character. The functions + * `identifierStart` and `identifierContinue` will receive as arguments the single character to be + * identifier and the character code point. These arguments will be `string` and `numeric`. Keep in + * mind that the `string` parameter can be two characters long depending on the character + * representation. It is expected for the function to return `true` or `false`, whether that + * character is allowed or not. + * + * Since this function will be called extensivelly, keep the implementation of these functions fast, + * as the performance of these functions have a direct impact on the expressions parsing speed. + * + * @param {function=} identifierStart The function that will decide whether the given character is + * a valid identifier start character. + * @param {function=} identifierContinue The function that will decide whether the given character is + * a valid identifier continue character. + */ + this.setIdentifierFns = function(identifierStart, identifierContinue) { + identStart = identifierStart; + identContinue = identifierContinue; + return this; + }; + + this.$get = ['$filter', function($filter) { + var noUnsafeEval = csp().noUnsafeEval; + var $parseOptions = { + csp: noUnsafeEval, + expensiveChecks: false, + literals: copy(literals), + isIdentifierStart: isFunction(identStart) && identStart, + isIdentifierContinue: isFunction(identContinue) && identContinue + }, + $parseOptionsExpensive = { + csp: noUnsafeEval, + expensiveChecks: true, + literals: copy(literals), + isIdentifierStart: isFunction(identStart) && identStart, + isIdentifierContinue: isFunction(identContinue) && identContinue + }; + var runningChecksEnabled = false; + + $parse.$$runningExpensiveChecks = function() { + return runningChecksEnabled; + }; + + return $parse; + + function $parse(exp, interceptorFn, expensiveChecks) { + var parsedExpression, oneTime, cacheKey; + + expensiveChecks = expensiveChecks || runningChecksEnabled; + + switch (typeof exp) { + case 'string': + exp = exp.trim(); + cacheKey = exp; + + var cache = (expensiveChecks ? cacheExpensive : cacheDefault); + parsedExpression = cache[cacheKey]; + + if (!parsedExpression) { + if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { + oneTime = true; + exp = exp.substring(2); + } + var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; + var lexer = new Lexer(parseOptions); + var parser = new Parser(lexer, $filter, parseOptions); + parsedExpression = parser.parse(exp); + if (parsedExpression.constant) { + parsedExpression.$$watchDelegate = constantWatchDelegate; + } else if (oneTime) { + parsedExpression.$$watchDelegate = parsedExpression.literal ? + oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; + } else if (parsedExpression.inputs) { + parsedExpression.$$watchDelegate = inputsWatchDelegate; + } + if (expensiveChecks) { + parsedExpression = expensiveChecksInterceptor(parsedExpression); + } + cache[cacheKey] = parsedExpression; + } + return addInterceptor(parsedExpression, interceptorFn); + + case 'function': + return addInterceptor(exp, interceptorFn); + + default: + return addInterceptor(noop, interceptorFn); + } + } + + function expensiveChecksInterceptor(fn) { + if (!fn) return fn; + expensiveCheckFn.$$watchDelegate = fn.$$watchDelegate; + expensiveCheckFn.assign = expensiveChecksInterceptor(fn.assign); + expensiveCheckFn.constant = fn.constant; + expensiveCheckFn.literal = fn.literal; + for (var i = 0; fn.inputs && i < fn.inputs.length; ++i) { + fn.inputs[i] = expensiveChecksInterceptor(fn.inputs[i]); + } + expensiveCheckFn.inputs = fn.inputs; + + return expensiveCheckFn; + + function expensiveCheckFn(scope, locals, assign, inputs) { + var expensiveCheckOldValue = runningChecksEnabled; + runningChecksEnabled = true; + try { + return fn(scope, locals, assign, inputs); + } finally { + runningChecksEnabled = expensiveCheckOldValue; + } + } + } + + function expressionInputDirtyCheck(newValue, oldValueOfValue) { + + if (newValue == null || oldValueOfValue == null) { // null/undefined + return newValue === oldValueOfValue; + } + + if (typeof newValue === 'object') { + + // attempt to convert the value to a primitive type + // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can + // be cheaply dirty-checked + newValue = getValueOf(newValue); + + if (typeof newValue === 'object') { + // objects/arrays are not supported - deep-watching them would be too expensive + return false; + } + + // fall-through to the primitive equality check + } + + //Primitive or NaN + return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); + } + + function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { + var inputExpressions = parsedExpression.inputs; + var lastResult; + + if (inputExpressions.length === 1) { + var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails + inputExpressions = inputExpressions[0]; + return scope.$watch(function expressionInputWatch(scope) { + var newInputValue = inputExpressions(scope); + if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) { + lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]); + oldInputValueOf = newInputValue && getValueOf(newInputValue); + } + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + var oldInputValueOfValues = []; + var oldInputValues = []; + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails + oldInputValues[i] = null; + } + + return scope.$watch(function expressionInputsWatch(scope) { + var changed = false; + + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + var newInputValue = inputExpressions[i](scope); + if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { + oldInputValues[i] = newInputValue; + oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); + } + } + + if (changed) { + lastResult = parsedExpression(scope, undefined, undefined, oldInputValues); + } + + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.apply(this, arguments); + } + if (isDefined(value)) { + scope.$$postDigest(function() { + if (isDefined(lastValue)) { + unwatch(); + } + }); + } + }, objectEquality); + } + + function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.call(this, value, old, scope); + } + if (isAllDefined(value)) { + scope.$$postDigest(function() { + if (isAllDefined(lastValue)) unwatch(); + }); + } + }, objectEquality); + + function isAllDefined(value) { + var allDefined = true; + forEach(value, function(val) { + if (!isDefined(val)) allDefined = false; + }); + return allDefined; + } + } + + function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch; + return unwatch = scope.$watch(function constantWatch(scope) { + unwatch(); + return parsedExpression(scope); + }, listener, objectEquality); + } + + function addInterceptor(parsedExpression, interceptorFn) { + if (!interceptorFn) return parsedExpression; + var watchDelegate = parsedExpression.$$watchDelegate; + var useInputs = false; + + var regularWatch = + watchDelegate !== oneTimeLiteralWatchDelegate && + watchDelegate !== oneTimeWatchDelegate; + + var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { + var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs); + return interceptorFn(value, scope, locals); + } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + var result = interceptorFn(value, scope, locals); + // we only return the interceptor's result if the + // initial value is defined (for bind-once) + return isDefined(value) ? result : value; + }; + + // Propagate $$watchDelegates other then inputsWatchDelegate + if (parsedExpression.$$watchDelegate && + parsedExpression.$$watchDelegate !== inputsWatchDelegate) { + fn.$$watchDelegate = parsedExpression.$$watchDelegate; + } else if (!interceptorFn.$stateful) { + // If there is an interceptor, but no watchDelegate then treat the interceptor like + // we treat filters - it is assumed to be a pure function unless flagged with $stateful + fn.$$watchDelegate = inputsWatchDelegate; + useInputs = !parsedExpression.inputs; + fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression]; + } + + return fn; + } + }]; +} + +/** + * @ngdoc service + * @name $q + * @requires $rootScope + * + * @description + * A service that helps you run functions asynchronously, and use their return values (or exceptions) + * when they are done processing. + * + * This is an implementation of promises/deferred objects inspired by + * [Kris Kowal's Q](https://github.com/kriskowal/q). + * + * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred + * implementations, and the other which resembles ES6 (ES2015) promises to some degree. + * + * # $q constructor + * + * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` + * function as the first argument. This is similar to the native Promise implementation from ES6, + * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). + * + * While the constructor-style use is supported, not all of the supporting methods from ES6 promises are + * available yet. + * + * It can be used like so: + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * // perform some asynchronous operation, resolve or reject the promise when appropriate. + * return $q(function(resolve, reject) { + * setTimeout(function() { + * if (okToGreet(name)) { + * resolve('Hello, ' + name + '!'); + * } else { + * reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * }); + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }); + * ``` + * + * Note: progress/notify callbacks are not currently supported via the ES6-style interface. + * + * Note: unlike ES6 behavior, an exception thrown in the constructor function will NOT implicitly reject the promise. + * + * However, the more traditional CommonJS-style usage is still available, and documented below. + * + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an + * interface for interacting with an object that represents the result of an action that is + * performed asynchronously, and may or may not be finished at any given point in time. + * + * From the perspective of dealing with error handling, deferred and promise APIs are to + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * var deferred = $q.defer(); + * + * setTimeout(function() { + * deferred.notify('About to greet ' + name + '.'); + * + * if (okToGreet(name)) { + * deferred.resolve('Hello, ' + name + '!'); + * } else { + * deferred.reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * + * return deferred.promise; + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }, function(update) { + * alert('Got notification: ' + update); + * }); + * ``` + * + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff + * comes in the way of guarantees that promise and deferred APIs make, see + * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. + * + * Additionally the promise api allows for composition that is very hard to do with the + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the + * section on serial or parallel joining of promises. + * + * # The Deferred API + * + * A new instance of deferred is constructed by calling `$q.defer()`. + * + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs + * that can be used for signaling the successful or unsuccessful completion, as well as the status + * of the task. + * + * **Methods** + * + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection + * constructed via `$q.reject`, the promise will be rejected instead. + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to + * resolving it with a rejection constructed via `$q.reject`. + * - `notify(value)` - provides updates on the status of the promise's execution. This may be called + * multiple times before the promise is either resolved or rejected. + * + * **Properties** + * + * - promise – `{Promise}` – promise object associated with this deferred. + * + * + * # The Promise API + * + * A new promise instance is created when a deferred instance is created and can be retrieved by + * calling `deferred.promise`. + * + * The purpose of the promise object is to allow for interested parties to get access to the result + * of the deferred task when it completes. + * + * **Methods** + * + * - `then(successCallback, [errorCallback], [notifyCallback])` – regardless of when the promise was or + * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously + * as soon as the result is available. The callbacks are called with a single argument: the result + * or rejection reason. Additionally, the notify callback may be called zero or more times to + * provide a progress indication, before the promise is resolved or rejected. + * + * This method *returns a new promise* which is resolved or rejected via the return value of the + * `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved + * with the value which is resolved in that promise using + * [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)). + * It also notifies via the return value of the `notifyCallback` method. The promise cannot be + * resolved or rejected from the notifyCallback method. The errorCallback and notifyCallback + * arguments are optional. + * + * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` + * + * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. + * + * # Chaining promises + * + * Because calling the `then` method of a promise returns a new derived promise, it is easily + * possible to create a chain of promises: + * + * ```js + * promiseB = promiseA.then(function(result) { + * return result + 1; + * }); + * + * // promiseB will be resolved immediately after promiseA is resolved and its value + * // will be the result of promiseA incremented by 1 + * ``` + * + * It is possible to create chains of any length and since a promise can be resolved with another + * promise (which will defer its resolution further), it is possible to pause/defer resolution of + * the promises at any point in the chain. This makes it possible to implement powerful APIs like + * $http's response interceptors. + * + * + * # Differences between Kris Kowal's Q and $q + * + * There are two main differences: + * + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation + * mechanism in angular, which means faster propagation of resolution or rejection into your + * models and avoiding unnecessary browser repaints, which would result in flickering UI. + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains + * all the important functionality needed for common async tasks. + * + * # Testing + * + * ```js + * it('should simulate promise', inject(function($q, $rootScope) { + * var deferred = $q.defer(); + * var promise = deferred.promise; + * var resolvedValue; + * + * promise.then(function(value) { resolvedValue = value; }); + * expect(resolvedValue).toBeUndefined(); + * + * // Simulate resolving of promise + * deferred.resolve(123); + * // Note that the 'then' function does not get called synchronously. + * // This is because we want the promise API to always be async, whether or not + * // it got called synchronously or asynchronously. + * expect(resolvedValue).toBeUndefined(); + * + * // Propagate promise resolution to 'then' functions using $apply(). + * $rootScope.$apply(); + * expect(resolvedValue).toEqual(123); + * })); + * ``` + * + * @param {function(function, function)} resolver Function which is responsible for resolving or + * rejecting the newly created promise. The first parameter is a function which resolves the + * promise, the second parameter is a function which rejects the promise. + * + * @returns {Promise} The newly created promise. + */ +function $QProvider() { + + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { + return qFactory(function(callback) { + $rootScope.$evalAsync(callback); + }, $exceptionHandler); + }]; +} + +function $$QProvider() { + this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { + return qFactory(function(callback) { + $browser.defer(callback); + }, $exceptionHandler); + }]; +} + +/** + * Constructs a promise manager. + * + * @param {function(function)} nextTick Function for executing functions in the next turn. + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for + * debugging purposes. + * @returns {object} Promise manager. + */ +function qFactory(nextTick, exceptionHandler) { + var $qMinErr = minErr('$q', TypeError); + + /** + * @ngdoc method + * @name ng.$q#defer + * @kind function + * + * @description + * Creates a `Deferred` object which represents a task which will finish in the future. + * + * @returns {Deferred} Returns a new instance of deferred. + */ + var defer = function() { + var d = new Deferred(); + //Necessary to support unbound execution :/ + d.resolve = simpleBind(d, d.resolve); + d.reject = simpleBind(d, d.reject); + d.notify = simpleBind(d, d.notify); + return d; + }; + + function Promise() { + this.$$state = { status: 0 }; + } + + extend(Promise.prototype, { + then: function(onFulfilled, onRejected, progressBack) { + if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) { + return this; + } + var result = new Deferred(); + + this.$$state.pending = this.$$state.pending || []; + this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); + if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); + + return result.promise; + }, + + "catch": function(callback) { + return this.then(null, callback); + }, + + "finally": function(callback, progressBack) { + return this.then(function(value) { + return handleCallback(value, true, callback); + }, function(error) { + return handleCallback(error, false, callback); + }, progressBack); + } + }); + + //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native + function simpleBind(context, fn) { + return function(value) { + fn.call(context, value); + }; + } + + function processQueue(state) { + var fn, deferred, pending; + + pending = state.pending; + state.processScheduled = false; + state.pending = undefined; + for (var i = 0, ii = pending.length; i < ii; ++i) { + deferred = pending[i][0]; + fn = pending[i][state.status]; + try { + if (isFunction(fn)) { + deferred.resolve(fn(state.value)); + } else if (state.status === 1) { + deferred.resolve(state.value); + } else { + deferred.reject(state.value); + } + } catch (e) { + deferred.reject(e); + exceptionHandler(e); + } + } + } + + function scheduleProcessQueue(state) { + if (state.processScheduled || !state.pending) return; + state.processScheduled = true; + nextTick(function() { processQueue(state); }); + } + + function Deferred() { + this.promise = new Promise(); + } + + extend(Deferred.prototype, { + resolve: function(val) { + if (this.promise.$$state.status) return; + if (val === this.promise) { + this.$$reject($qMinErr( + 'qcycle', + "Expected promise to be resolved with value other than itself '{0}'", + val)); + } else { + this.$$resolve(val); + } + + }, + + $$resolve: function(val) { + var then; + var that = this; + var done = false; + try { + if ((isObject(val) || isFunction(val))) then = val && val.then; + if (isFunction(then)) { + this.promise.$$state.status = -1; + then.call(val, resolvePromise, rejectPromise, simpleBind(this, this.notify)); + } else { + this.promise.$$state.value = val; + this.promise.$$state.status = 1; + scheduleProcessQueue(this.promise.$$state); + } + } catch (e) { + rejectPromise(e); + exceptionHandler(e); + } + + function resolvePromise(val) { + if (done) return; + done = true; + that.$$resolve(val); + } + function rejectPromise(val) { + if (done) return; + done = true; + that.$$reject(val); + } + }, + + reject: function(reason) { + if (this.promise.$$state.status) return; + this.$$reject(reason); + }, + + $$reject: function(reason) { + this.promise.$$state.value = reason; + this.promise.$$state.status = 2; + scheduleProcessQueue(this.promise.$$state); + }, + + notify: function(progress) { + var callbacks = this.promise.$$state.pending; + + if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { + nextTick(function() { + var callback, result; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + result = callbacks[i][0]; + callback = callbacks[i][3]; + try { + result.notify(isFunction(callback) ? callback(progress) : progress); + } catch (e) { + exceptionHandler(e); + } + } + }); + } + } + }); + + /** + * @ngdoc method + * @name $q#reject + * @kind function + * + * @description + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be + * used to forward rejection in a chain of promises. If you are dealing with the last promise in + * a promise chain, you don't need to worry about it. + * + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via + * a promise error callback and you want to forward the error to the promise derived from the + * current promise, you have to "rethrow" the error by returning a rejection constructed via + * `reject`. + * + * ```js + * promiseB = promiseA.then(function(result) { + * // success: do something and resolve promiseB + * // with the old or a new result + * return result; + * }, function(reason) { + * // error: handle the error if possible and + * // resolve promiseB with newPromiseOrValue, + * // otherwise forward the rejection to promiseB + * if (canHandle(reason)) { + * // handle the error and recover + * return newPromiseOrValue; + * } + * return $q.reject(reason); + * }); + * ``` + * + * @param {*} reason Constant, message, exception or an object representing the rejection reason. + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. + */ + var reject = function(reason) { + var result = new Deferred(); + result.reject(reason); + return result.promise; + }; + + var makePromise = function makePromise(value, resolved) { + var result = new Deferred(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + }; + + var handleCallback = function handleCallback(value, isResolved, callback) { + var callbackOutput = null; + try { + if (isFunction(callback)) callbackOutput = callback(); + } catch (e) { + return makePromise(e, false); + } + if (isPromiseLike(callbackOutput)) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + }; + + /** + * @ngdoc method + * @name $q#when + * @kind function + * + * @description + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. + * This is useful when you are dealing with an object that might or might not be a promise, or if + * the promise comes from a source that can't be trusted. + * + * @param {*} value Value or a promise + * @param {Function=} successCallback + * @param {Function=} errorCallback + * @param {Function=} progressCallback + * @returns {Promise} Returns a promise of the passed value or promise + */ + + + var when = function(value, callback, errback, progressBack) { + var result = new Deferred(); + result.resolve(value); + return result.promise.then(callback, errback, progressBack); + }; + + /** + * @ngdoc method + * @name $q#resolve + * @kind function + * + * @description + * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6. + * + * @param {*} value Value or a promise + * @param {Function=} successCallback + * @param {Function=} errorCallback + * @param {Function=} progressCallback + * @returns {Promise} Returns a promise of the passed value or promise + */ + var resolve = when; + + /** + * @ngdoc method + * @name $q#all + * @kind function + * + * @description + * Combines multiple promises into a single promise that is resolved when all of the input + * promises are resolved. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. + * If any of the promises is resolved with a rejection, this resulting promise will be rejected + * with the same rejection value. + */ + + function all(promises) { + var deferred = new Deferred(), + counter = 0, + results = isArray(promises) ? [] : {}; + + forEach(promises, function(promise, key) { + counter++; + when(promise).then(function(value) { + if (results.hasOwnProperty(key)) return; + results[key] = value; + if (!(--counter)) deferred.resolve(results); + }, function(reason) { + if (results.hasOwnProperty(key)) return; + deferred.reject(reason); + }); + }); + + if (counter === 0) { + deferred.resolve(results); + } + + return deferred.promise; + } + + /** + * @ngdoc method + * @name $q#race + * @kind function + * + * @description + * Returns a promise that resolves or rejects as soon as one of those promises + * resolves or rejects, with the value or reason from that promise. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} a promise that resolves or rejects as soon as one of the `promises` + * resolves or rejects, with the value or reason from that promise. + */ + + function race(promises) { + var deferred = defer(); + + forEach(promises, function(promise) { + when(promise).then(deferred.resolve, deferred.reject); + }); + + return deferred.promise; + } + + var $Q = function Q(resolver) { + if (!isFunction(resolver)) { + throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); + } + + var deferred = new Deferred(); + + function resolveFn(value) { + deferred.resolve(value); + } + + function rejectFn(reason) { + deferred.reject(reason); + } + + resolver(resolveFn, rejectFn); + + return deferred.promise; + }; + + // Let's make the instanceof operator work for promises, so that + // `new $q(fn) instanceof $q` would evaluate to true. + $Q.prototype = Promise.prototype; + + $Q.defer = defer; + $Q.reject = reject; + $Q.when = when; + $Q.resolve = resolve; + $Q.all = all; + $Q.race = race; + + return $Q; +} + +function $$RAFProvider() { //rAF + this.$get = ['$window', '$timeout', function($window, $timeout) { + var requestAnimationFrame = $window.requestAnimationFrame || + $window.webkitRequestAnimationFrame; + + var cancelAnimationFrame = $window.cancelAnimationFrame || + $window.webkitCancelAnimationFrame || + $window.webkitCancelRequestAnimationFrame; + + var rafSupported = !!requestAnimationFrame; + var raf = rafSupported + ? function(fn) { + var id = requestAnimationFrame(fn); + return function() { + cancelAnimationFrame(id); + }; + } + : function(fn) { + var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 + return function() { + $timeout.cancel(timer); + }; + }; + + raf.supported = rafSupported; + + return raf; + }]; +} + +/** + * DESIGN NOTES + * + * The design decisions behind the scope are heavily favored for speed and memory consumption. + * + * The typical use of scope is to watch the expressions, which most of the time return the same + * value as last time so we optimize the operation. + * + * Closures construction is expensive in terms of speed as well as memory: + * - No closures, instead use prototypical inheritance for API + * - Internal state needs to be stored on scope directly, which means that private state is + * exposed as $$____ properties + * + * Loop operations are optimized by using while(count--) { ... } + * - This means that in order to keep the same order of execution as addition we have to add + * items to the array at the beginning (unshift) instead of at the end (push) + * + * Child scopes are created and removed often + * - Using an array would be slow since inserts in the middle are expensive; so we use linked lists + * + * There are fewer watches than observers. This is why you don't want the observer to be implemented + * in the same way as watch. Watch requires return of the initialization function which is expensive + * to construct. + */ + + +/** + * @ngdoc provider + * @name $rootScopeProvider + * @description + * + * Provider for the $rootScope service. + */ + +/** + * @ngdoc method + * @name $rootScopeProvider#digestTtl + * @description + * + * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that the dependencies between `$watch`s will result in + * several digest iterations. However if an application needs more than the default 10 digest + * iterations for its model to stabilize then you should investigate what is causing the model to + * continuously change during the digest. + * + * Increasing the TTL could have performance implications, so you should not change it without + * proper justification. + * + * @param {number} limit The number of digest iterations. + */ + + +/** + * @ngdoc service + * @name $rootScope + * @description + * + * Every application has a single root {@link ng.$rootScope.Scope scope}. + * All other scopes are descendant scopes of the root scope. Scopes provide separation + * between the model and the view, via a mechanism for watching the model for changes. + * They also provide event emission/broadcast and subscription facility. See the + * {@link guide/scope developer guide on scopes}. + */ +function $RootScopeProvider() { + var TTL = 10; + var $rootScopeMinErr = minErr('$rootScope'); + var lastDirtyWatch = null; + var applyAsyncId = null; + + this.digestTtl = function(value) { + if (arguments.length) { + TTL = value; + } + return TTL; + }; + + function createChildScopeClass(parent) { + function ChildScope() { + this.$$watchers = this.$$nextSibling = + this.$$childHead = this.$$childTail = null; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$id = nextUid(); + this.$$ChildScope = null; + } + ChildScope.prototype = parent; + return ChildScope; + } + + this.$get = ['$exceptionHandler', '$parse', '$browser', + function($exceptionHandler, $parse, $browser) { + + function destroyChildScope($event) { + $event.currentScope.$$destroyed = true; + } + + function cleanUpScope($scope) { + + if (msie === 9) { + // There is a memory leak in IE9 if all child scopes are not disconnected + // completely when a scope is destroyed. So this code will recurse up through + // all this scopes children + // + // See issue https://github.com/angular/angular.js/issues/10706 + $scope.$$childHead && cleanUpScope($scope.$$childHead); + $scope.$$nextSibling && cleanUpScope($scope.$$nextSibling); + } + + // The code below works around IE9 and V8's memory leaks + // + // See: + // - https://code.google.com/p/v8/issues/detail?id=2073#c26 + // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 + // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + + $scope.$parent = $scope.$$nextSibling = $scope.$$prevSibling = $scope.$$childHead = + $scope.$$childTail = $scope.$root = $scope.$$watchers = null; + } + + /** + * @ngdoc type + * @name $rootScope.Scope + * + * @description + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the + * {@link auto.$injector $injector}. Child scopes are created using the + * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when + * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for + * an in-depth introduction and usage examples. + * + * + * # Inheritance + * A scope can inherit from a parent scope, as in this example: + * ```js + var parent = $rootScope; + var child = parent.$new(); + + parent.salutation = "Hello"; + expect(child.salutation).toEqual('Hello'); + + child.salutation = "Welcome"; + expect(child.salutation).toEqual('Welcome'); + expect(parent.salutation).toEqual('Hello'); + * ``` + * + * When interacting with `Scope` in tests, additional helper methods are available on the + * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional + * details. + * + * + * @param {Object.=} providers Map of service factory which need to be + * provided for the current scope. Defaults to {@link ng}. + * @param {Object.=} instanceCache Provides pre-instantiated services which should + * append/override services provided by `providers`. This is handy + * when unit-testing and having the need to override a default + * service. + * @returns {Object} Newly created scope. + * + */ + function Scope() { + this.$id = nextUid(); + this.$$phase = this.$parent = this.$$watchers = + this.$$nextSibling = this.$$prevSibling = + this.$$childHead = this.$$childTail = null; + this.$root = this; + this.$$destroyed = false; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$$isolateBindings = null; + } + + /** + * @ngdoc property + * @name $rootScope.Scope#$id + * + * @description + * Unique scope ID (monotonically increasing) useful for debugging. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$parent + * + * @description + * Reference to the parent scope. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$root + * + * @description + * Reference to the root scope. + */ + + Scope.prototype = { + constructor: Scope, + /** + * @ngdoc method + * @name $rootScope.Scope#$new + * @kind function + * + * @description + * Creates a new child {@link ng.$rootScope.Scope scope}. + * + * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. + * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. + * + * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is + * desired for the scope and its child scopes to be permanently detached from the parent and + * thus stop participating in model change detection and listener notification by invoking. + * + * @param {boolean} isolate If true, then the scope does not prototypically inherit from the + * parent scope. The scope is isolated, as it can not see parent scope properties. + * When creating widgets, it is useful for the widget to not accidentally read parent + * state. + * + * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` + * of the newly created scope. Defaults to `this` scope if not provided. + * This is used when creating a transclude scope to correctly place it + * in the scope hierarchy while maintaining the correct prototypical + * inheritance. + * + * @returns {Object} The newly created child scope. + * + */ + $new: function(isolate, parent) { + var child; + + parent = parent || this; + + if (isolate) { + child = new Scope(); + child.$root = this.$root; + } else { + // Only create a child scope class if somebody asks for one, + // but cache it to allow the VM to optimize lookups. + if (!this.$$ChildScope) { + this.$$ChildScope = createChildScopeClass(this); + } + child = new this.$$ChildScope(); + } + child.$parent = parent; + child.$$prevSibling = parent.$$childTail; + if (parent.$$childHead) { + parent.$$childTail.$$nextSibling = child; + parent.$$childTail = child; + } else { + parent.$$childHead = parent.$$childTail = child; + } + + // When the new scope is not isolated or we inherit from `this`, and + // the parent scope is destroyed, the property `$$destroyed` is inherited + // prototypically. In all other cases, this property needs to be set + // when the parent scope is destroyed. + // The listener needs to be added after the parent is set + if (isolate || parent != this) child.$on('$destroy', destroyChildScope); + + return child; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watch + * @kind function + * + * @description + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. + * + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest + * $digest()} and should return the value that will be watched. (`watchExpression` should not change + * its value when executed multiple times with the same input because it may be executed multiple + * times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be + * [idempotent](http://en.wikipedia.org/wiki/Idempotence). + * - The `listener` is called only when the value from the current `watchExpression` and the + * previous call to `watchExpression` are not equal (with the exception of the initial run, + * see below). Inequality is determined according to reference inequality, + * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) + * via the `!==` Javascript operator, unless `objectEquality == true` + * (see next point) + * - When `objectEquality == true`, inequality of the `watchExpression` is determined + * according to the {@link angular.equals} function. To save the value of the object for + * later comparison, the {@link angular.copy} function is used. This therefore means that + * watching complex objects will have adverse memory and performance implications. + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. + * This is achieved by rerunning the watchers until no changes are detected. The rerun + * iteration limit is 10 to prevent an infinite loop deadlock. + * + * + * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, + * you can register a `watchExpression` function with no `listener`. (Be prepared for + * multiple calls to your `watchExpression` because it will execute multiple times in a + * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.) + * + * After a watcher is registered with the scope, the `listener` fn is called asynchronously + * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the + * watcher. In rare cases, this is undesirable because the listener is called when the result + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the + * listener was called due to initialization. + * + * + * + * # Example + * ```js + // let's assume that scope was dependency injected as the $rootScope + var scope = $rootScope; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + + + + // Using a function as a watchExpression + var food; + scope.foodCounter = 0; + expect(scope.foodCounter).toEqual(0); + scope.$watch( + // This function returns the value being watched. It is called for each turn of the $digest loop + function() { return food; }, + // This is the change listener, called when the value returned from the above function changes + function(newValue, oldValue) { + if ( newValue !== oldValue ) { + // Only increment the counter if the value changed + scope.foodCounter = scope.foodCounter + 1; + } + } + ); + // No digest has been run so the counter will be zero + expect(scope.foodCounter).toEqual(0); + + // Run the digest but since food has not changed count will still be zero + scope.$digest(); + expect(scope.foodCounter).toEqual(0); + + // Update food and run digest. Now the counter will increment + food = 'cheeseburger'; + scope.$digest(); + expect(scope.foodCounter).toEqual(1); + + * ``` + * + * + * + * @param {(function()|string)} watchExpression Expression that is evaluated on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers + * a call to the `listener`. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(scope)`: called with current `scope` as a parameter. + * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value + * of `watchExpression` changes. + * + * - `newVal` contains the current value of the `watchExpression` + * - `oldVal` contains the previous value of the `watchExpression` + * - `scope` refers to the current scope + * @param {boolean=} [objectEquality=false] Compare for object equality using {@link angular.equals} instead of + * comparing for reference equality. + * @returns {function()} Returns a deregistration function for this listener. + */ + $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) { + var get = $parse(watchExp); + + if (get.$$watchDelegate) { + return get.$$watchDelegate(this, listener, objectEquality, get, watchExp); + } + var scope = this, + array = scope.$$watchers, + watcher = { + fn: listener, + last: initWatchVal, + get: get, + exp: prettyPrintExpression || watchExp, + eq: !!objectEquality + }; + + lastDirtyWatch = null; + + if (!isFunction(listener)) { + watcher.fn = noop; + } + + if (!array) { + array = scope.$$watchers = []; + } + // we use unshift since we use a while loop in $digest for speed. + // the while loop reads in reverse order. + array.unshift(watcher); + incrementWatchersCount(this, 1); + + return function deregisterWatch() { + if (arrayRemove(array, watcher) >= 0) { + incrementWatchersCount(scope, -1); + } + lastDirtyWatch = null; + }; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchGroup + * @kind function + * + * @description + * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. + * If any one expression in the collection changes the `listener` is executed. + * + * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every + * call to $digest() to see if any items changes. + * - The `listener` is called whenever any expression in the `watchExpressions` array changes. + * + * @param {Array.} watchExpressions Array of expressions that will be individually + * watched using {@link ng.$rootScope.Scope#$watch $watch()} + * + * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any + * expression in `watchExpressions` changes + * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * The `scope` refers to the current scope. + * @returns {function()} Returns a de-registration function for all listeners. + */ + $watchGroup: function(watchExpressions, listener) { + var oldValues = new Array(watchExpressions.length); + var newValues = new Array(watchExpressions.length); + var deregisterFns = []; + var self = this; + var changeReactionScheduled = false; + var firstRun = true; + + if (!watchExpressions.length) { + // No expressions means we call the listener ASAP + var shouldCall = true; + self.$evalAsync(function() { + if (shouldCall) listener(newValues, newValues, self); + }); + return function deregisterWatchGroup() { + shouldCall = false; + }; + } + + if (watchExpressions.length === 1) { + // Special case size of one + return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { + newValues[0] = value; + oldValues[0] = oldValue; + listener(newValues, (value === oldValue) ? newValues : oldValues, scope); + }); + } + + forEach(watchExpressions, function(expr, i) { + var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { + newValues[i] = value; + oldValues[i] = oldValue; + if (!changeReactionScheduled) { + changeReactionScheduled = true; + self.$evalAsync(watchGroupAction); + } + }); + deregisterFns.push(unwatchFn); + }); + + function watchGroupAction() { + changeReactionScheduled = false; + + if (firstRun) { + firstRun = false; + listener(newValues, newValues, self); + } else { + listener(newValues, oldValues, self); + } + } + + return function deregisterWatchGroup() { + while (deregisterFns.length) { + deregisterFns.shift()(); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchCollection + * @kind function + * + * @description + * Shallow watches the properties of an object and fires whenever any of the properties change + * (for arrays, this implies watching the array items; for object maps, this implies watching + * the properties). If a change is detected, the `listener` callback is fired. + * + * - The `obj` collection is observed via standard $watch operation and is examined on every + * call to $digest() to see if any items have been added, removed, or moved. + * - The `listener` is called whenever anything within the `obj` has changed. Examples include + * adding, removing, and moving items belonging to an object or array. + * + * + * # Example + * ```js + $scope.names = ['igor', 'matias', 'misko', 'james']; + $scope.dataCount = 4; + + $scope.$watchCollection('names', function(newNames, oldNames) { + $scope.dataCount = newNames.length; + }); + + expect($scope.dataCount).toEqual(4); + $scope.$digest(); + + //still at 4 ... no changes + expect($scope.dataCount).toEqual(4); + + $scope.names.pop(); + $scope.$digest(); + + //now there's been a change + expect($scope.dataCount).toEqual(3); + * ``` + * + * + * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The + * expression value should evaluate to an object or an array which is observed on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the + * collection will trigger a call to the `listener`. + * + * @param {function(newCollection, oldCollection, scope)} listener a callback function called + * when a change is detected. + * - The `newCollection` object is the newly modified data obtained from the `obj` expression + * - The `oldCollection` object is a copy of the former collection data. + * Due to performance considerations, the`oldCollection` value is computed only if the + * `listener` function declares two or more arguments. + * - The `scope` argument refers to the current scope. + * + * @returns {function()} Returns a de-registration function for this listener. When the + * de-registration function is executed, the internal watch operation is terminated. + */ + $watchCollection: function(obj, listener) { + $watchCollectionInterceptor.$stateful = true; + + var self = this; + // the current value, updated on each dirty-check run + var newValue; + // a shallow copy of the newValue from the last dirty-check run, + // updated to match newValue during dirty-check run + var oldValue; + // a shallow copy of the newValue from when the last change happened + var veryOldValue; + // only track veryOldValue if the listener is asking for it + var trackVeryOldValue = (listener.length > 1); + var changeDetected = 0; + var changeDetector = $parse(obj, $watchCollectionInterceptor); + var internalArray = []; + var internalObject = {}; + var initRun = true; + var oldLength = 0; + + function $watchCollectionInterceptor(_value) { + newValue = _value; + var newLength, key, bothNaN, newItem, oldItem; + + // If the new value is undefined, then return undefined as the watch may be a one-time watch + if (isUndefined(newValue)) return; + + if (!isObject(newValue)) { // if primitive + if (oldValue !== newValue) { + oldValue = newValue; + changeDetected++; + } + } else if (isArrayLike(newValue)) { + if (oldValue !== internalArray) { + // we are transitioning from something which was not an array into array. + oldValue = internalArray; + oldLength = oldValue.length = 0; + changeDetected++; + } + + newLength = newValue.length; + + if (oldLength !== newLength) { + // if lengths do not match we need to trigger change notification + changeDetected++; + oldValue.length = oldLength = newLength; + } + // copy the items to oldValue and look for changes. + for (var i = 0; i < newLength; i++) { + oldItem = oldValue[i]; + newItem = newValue[i]; + + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[i] = newItem; + } + } + } else { + if (oldValue !== internalObject) { + // we are transitioning from something which was not an object into object. + oldValue = internalObject = {}; + oldLength = 0; + changeDetected++; + } + // copy the items to oldValue and look for changes. + newLength = 0; + for (key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + newLength++; + newItem = newValue[key]; + oldItem = oldValue[key]; + + if (key in oldValue) { + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[key] = newItem; + } + } else { + oldLength++; + oldValue[key] = newItem; + changeDetected++; + } + } + } + if (oldLength > newLength) { + // we used to have more keys, need to find them and destroy them. + changeDetected++; + for (key in oldValue) { + if (!hasOwnProperty.call(newValue, key)) { + oldLength--; + delete oldValue[key]; + } + } + } + } + return changeDetected; + } + + function $watchCollectionAction() { + if (initRun) { + initRun = false; + listener(newValue, newValue, self); + } else { + listener(newValue, veryOldValue, self); + } + + // make a copy for the next time a collection is changed + if (trackVeryOldValue) { + if (!isObject(newValue)) { + //primitive + veryOldValue = newValue; + } else if (isArrayLike(newValue)) { + veryOldValue = new Array(newValue.length); + for (var i = 0; i < newValue.length; i++) { + veryOldValue[i] = newValue[i]; + } + } else { // if object + veryOldValue = {}; + for (var key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + veryOldValue[key] = newValue[key]; + } + } + } + } + } + + return this.$watch(changeDetector, $watchCollectionAction); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$digest + * @kind function + * + * @description + * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and + * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change + * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} + * until no more listeners are firing. This means that it is possible to get into an infinite + * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of + * iterations exceeds 10. + * + * Usually, you don't call `$digest()` directly in + * {@link ng.directive:ngController controllers} or in + * {@link ng.$compileProvider#directive directives}. + * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within + * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. + * + * If you want to be notified whenever `$digest()` is called, + * you can register a `watchExpression` function with + * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. + * + * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. + * + * # Example + * ```js + var scope = ...; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + * ``` + * + */ + $digest: function() { + var watch, value, last, fn, get, + watchers, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, asyncTask; + + beginPhase('$digest'); + // Check for changes to browser url that happened in sync before the call to $digest + $browser.$$checkUrlChange(); + + if (this === $rootScope && applyAsyncId !== null) { + // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then + // cancel the scheduled $apply and flush the queue of expressions to be evaluated. + $browser.defer.cancel(applyAsyncId); + flushApplyAsync(); + } + + lastDirtyWatch = null; + + do { // "while dirty" loop + dirty = false; + current = target; + + // It's safe for asyncQueuePosition to be a local variable here because this loop can't + // be reentered recursively. Calling $digest from a function passed to $applyAsync would + // lead to a '$digest already in progress' error. + for (var asyncQueuePosition = 0; asyncQueuePosition < asyncQueue.length; asyncQueuePosition++) { + try { + asyncTask = asyncQueue[asyncQueuePosition]; + asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); + } catch (e) { + $exceptionHandler(e); + } + lastDirtyWatch = null; + } + asyncQueue.length = 0; + + traverseScopesLoop: + do { // "traverse the scopes" loop + if ((watchers = current.$$watchers)) { + // process our watches + length = watchers.length; + while (length--) { + try { + watch = watchers[length]; + // Most common watches are on primitives, in which case we can short + // circuit it with === operator, only when === fails do we use .equals + if (watch) { + get = watch.get; + if ((value = get(current)) !== (last = watch.last) && + !(watch.eq + ? equals(value, last) + : (typeof value === 'number' && typeof last === 'number' + && isNaN(value) && isNaN(last)))) { + dirty = true; + lastDirtyWatch = watch; + watch.last = watch.eq ? copy(value, null) : value; + fn = watch.fn; + fn(value, ((last === initWatchVal) ? value : last), current); + if (ttl < 5) { + logIdx = 4 - ttl; + if (!watchLog[logIdx]) watchLog[logIdx] = []; + watchLog[logIdx].push({ + msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, + newVal: value, + oldVal: last + }); + } + } else if (watch === lastDirtyWatch) { + // If the most recently dirty watcher is now clean, short circuit since the remaining watchers + // have already been tested. + dirty = false; + break traverseScopesLoop; + } + } + } catch (e) { + $exceptionHandler(e); + } + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $broadcast + if (!(next = ((current.$$watchersCount && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } while ((current = next)); + + // `break traverseScopesLoop;` takes us to here + + if ((dirty || asyncQueue.length) && !(ttl--)) { + clearPhase(); + throw $rootScopeMinErr('infdig', + '{0} $digest() iterations reached. Aborting!\n' + + 'Watchers fired in the last 5 iterations: {1}', + TTL, watchLog); + } + + } while (dirty || asyncQueue.length); + + clearPhase(); + + // postDigestQueuePosition isn't local here because this loop can be reentered recursively. + while (postDigestQueuePosition < postDigestQueue.length) { + try { + postDigestQueue[postDigestQueuePosition++](); + } catch (e) { + $exceptionHandler(e); + } + } + postDigestQueue.length = postDigestQueuePosition = 0; + }, + + + /** + * @ngdoc event + * @name $rootScope.Scope#$destroy + * @eventType broadcast on scope being destroyed + * + * @description + * Broadcasted when a scope and its children are being destroyed. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + + /** + * @ngdoc method + * @name $rootScope.Scope#$destroy + * @kind function + * + * @description + * Removes the current scope (and all of its children) from the parent scope. Removal implies + * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer + * propagate to the current scope and its children. Removal also implies that the current + * scope is eligible for garbage collection. + * + * The `$destroy()` is usually used by directives such as + * {@link ng.directive:ngRepeat ngRepeat} for managing the + * unrolling of the loop. + * + * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. + * Application code can register a `$destroy` event handler that will give it a chance to + * perform any necessary cleanup. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + $destroy: function() { + // We can't destroy a scope that has been already destroyed. + if (this.$$destroyed) return; + var parent = this.$parent; + + this.$broadcast('$destroy'); + this.$$destroyed = true; + + if (this === $rootScope) { + //Remove handlers attached to window when $rootScope is removed + $browser.$$applicationDestroyed(); + } + + incrementWatchersCount(this, -this.$$watchersCount); + for (var eventName in this.$$listenerCount) { + decrementListenerCount(this, this.$$listenerCount[eventName], eventName); + } + + // sever all the references to parent scopes (after this cleanup, the current scope should + // not be retained by any of our references and should be eligible for garbage collection) + if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; + if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; + + // Disable listeners, watchers and apply/digest methods + this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; + this.$on = this.$watch = this.$watchGroup = function() { return noop; }; + this.$$listeners = {}; + + // Disconnect the next sibling to prevent `cleanUpScope` destroying those too + this.$$nextSibling = null; + cleanUpScope(this); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$eval + * @kind function + * + * @description + * Executes the `expression` on the current scope and returns the result. Any exceptions in + * the expression are propagated (uncaught). This is useful when evaluating Angular + * expressions. + * + * # Example + * ```js + var scope = ng.$rootScope.Scope(); + scope.a = 1; + scope.b = 2; + + expect(scope.$eval('a+b')).toEqual(3); + expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); + * ``` + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + * @returns {*} The result of evaluating the expression. + */ + $eval: function(expr, locals) { + return $parse(expr)(this, locals); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$evalAsync + * @kind function + * + * @description + * Executes the expression on the current scope at a later point in time. + * + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only + * that: + * + * - it will execute after the function that scheduled the evaluation (preferably before DOM + * rendering). + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after + * `expression` execution. + * + * Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle + * will be scheduled. However, it is encouraged to always call code that changes the model + * from within an `$apply` call. That includes code evaluated via `$evalAsync`. + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + */ + $evalAsync: function(expr, locals) { + // if we are outside of an $digest loop and this is the first time we are scheduling async + // task also schedule async auto-flush + if (!$rootScope.$$phase && !asyncQueue.length) { + $browser.defer(function() { + if (asyncQueue.length) { + $rootScope.$digest(); + } + }); + } + + asyncQueue.push({scope: this, expression: $parse(expr), locals: locals}); + }, + + $$postDigest: function(fn) { + postDigestQueue.push(fn); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$apply + * @kind function + * + * @description + * `$apply()` is used to execute an expression in angular from outside of the angular + * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). + * Because we are calling into the angular framework we need to perform proper scope life + * cycle of {@link ng.$exceptionHandler exception handling}, + * {@link ng.$rootScope.Scope#$digest executing watches}. + * + * ## Life cycle + * + * # Pseudo-Code of `$apply()` + * ```js + function $apply(expr) { + try { + return $eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + $root.$digest(); + } + } + * ``` + * + * + * Scope's `$apply()` method transitions through the following stages: + * + * 1. The {@link guide/expression expression} is executed using the + * {@link ng.$rootScope.Scope#$eval $eval()} method. + * 2. Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the + * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. + * + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $apply: function(expr) { + try { + beginPhase('$apply'); + try { + return this.$eval(expr); + } finally { + clearPhase(); + } + } catch (e) { + $exceptionHandler(e); + } finally { + try { + $rootScope.$digest(); + } catch (e) { + $exceptionHandler(e); + throw e; + } + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$applyAsync + * @kind function + * + * @description + * Schedule the invocation of $apply to occur at a later time. The actual time difference + * varies across browsers, but is typically around ~10 milliseconds. + * + * This can be used to queue up multiple expressions which need to be evaluated in the same + * digest. + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + */ + $applyAsync: function(expr) { + var scope = this; + expr && applyAsyncQueue.push($applyAsyncExpression); + expr = $parse(expr); + scheduleApplyAsync(); + + function $applyAsyncExpression() { + scope.$eval(expr); + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$on + * @kind function + * + * @description + * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for + * discussion of event life cycle. + * + * The event listener function format is: `function(event, args...)`. The `event` object + * passed into the listener has the following attributes: + * + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or + * `$broadcast`-ed. + * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the + * event propagates through the scope hierarchy, this property is set to null. + * - `name` - `{string}`: name of the event. + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel + * further event propagation (available only for events that were `$emit`-ed). + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag + * to true. + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. + * + * @param {string} name Event name to listen on. + * @param {function(event, ...args)} listener Function to call when the event is emitted. + * @returns {function()} Returns a deregistration function for this listener. + */ + $on: function(name, listener) { + var namedListeners = this.$$listeners[name]; + if (!namedListeners) { + this.$$listeners[name] = namedListeners = []; + } + namedListeners.push(listener); + + var current = this; + do { + if (!current.$$listenerCount[name]) { + current.$$listenerCount[name] = 0; + } + current.$$listenerCount[name]++; + } while ((current = current.$parent)); + + var self = this; + return function() { + var indexOfListener = namedListeners.indexOf(listener); + if (indexOfListener !== -1) { + namedListeners[indexOfListener] = null; + decrementListenerCount(self, 1, name); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$emit + * @kind function + * + * @description + * Dispatches an event `name` upwards through the scope hierarchy notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$emit` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event traverses upwards toward the root scope and calls all + * registered listeners along the way. The event will stop propagating if one of the listeners + * cancels it. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to emit. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). + */ + $emit: function(name, args) { + var empty = [], + namedListeners, + scope = this, + stopPropagation = false, + event = { + name: name, + targetScope: scope, + stopPropagation: function() {stopPropagation = true;}, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }, + listenerArgs = concat([event], arguments, 1), + i, length; + + do { + namedListeners = scope.$$listeners[name] || empty; + event.currentScope = scope; + for (i = 0, length = namedListeners.length; i < length; i++) { + + // if listeners were deregistered, defragment the array + if (!namedListeners[i]) { + namedListeners.splice(i, 1); + i--; + length--; + continue; + } + try { + //allow all listeners attached to the current scope to run + namedListeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + //if any listener on the current scope stops propagation, prevent bubbling + if (stopPropagation) { + event.currentScope = null; + return event; + } + //traverse upwards + scope = scope.$parent; + } while (scope); + + event.currentScope = null; + + return event; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$broadcast + * @kind function + * + * @description + * Dispatches an event `name` downwards to all child scopes (and their children) notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$broadcast` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event propagates to all direct and indirect scopes of the current + * scope and calls all registered listeners along the way. The event cannot be canceled. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to broadcast. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} + */ + $broadcast: function(name, args) { + var target = this, + current = target, + next = target, + event = { + name: name, + targetScope: target, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }; + + if (!target.$$listenerCount[name]) return event; + + var listenerArgs = concat([event], arguments, 1), + listeners, i, length; + + //down while you can, then up and next sibling or up and next sibling until back at root + while ((current = next)) { + event.currentScope = current; + listeners = current.$$listeners[name] || []; + for (i = 0, length = listeners.length; i < length; i++) { + // if listeners were deregistered, defragment the array + if (!listeners[i]) { + listeners.splice(i, 1); + i--; + length--; + continue; + } + + try { + listeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $digest + // (though it differs due to having the extra check for $$listenerCount) + if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } + + event.currentScope = null; + return event; + } + }; + + var $rootScope = new Scope(); + + //The internal queues. Expose them on the $rootScope for debugging/testing purposes. + var asyncQueue = $rootScope.$$asyncQueue = []; + var postDigestQueue = $rootScope.$$postDigestQueue = []; + var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; + + var postDigestQueuePosition = 0; + + return $rootScope; + + + function beginPhase(phase) { + if ($rootScope.$$phase) { + throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); + } + + $rootScope.$$phase = phase; + } + + function clearPhase() { + $rootScope.$$phase = null; + } + + function incrementWatchersCount(current, count) { + do { + current.$$watchersCount += count; + } while ((current = current.$parent)); + } + + function decrementListenerCount(current, count, name) { + do { + current.$$listenerCount[name] -= count; + + if (current.$$listenerCount[name] === 0) { + delete current.$$listenerCount[name]; + } + } while ((current = current.$parent)); + } + + /** + * function used as an initial value for watchers. + * because it's unique we can easily tell it apart from other values + */ + function initWatchVal() {} + + function flushApplyAsync() { + while (applyAsyncQueue.length) { + try { + applyAsyncQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + applyAsyncId = null; + } + + function scheduleApplyAsync() { + if (applyAsyncId === null) { + applyAsyncId = $browser.defer(function() { + $rootScope.$apply(flushApplyAsync); + }); + } + } + }]; +} + +/** + * @ngdoc service + * @name $rootElement + * + * @description + * The root element of Angular application. This is either the element where {@link + * ng.directive:ngApp ngApp} was declared or the element passed into + * {@link angular.bootstrap}. The element represents the root element of application. It is also the + * location where the application's {@link auto.$injector $injector} service gets + * published, and can be retrieved using `$rootElement.injector()`. + */ + + +// the implementation is in angular.bootstrap + +/** + * @description + * Private service to sanitize uris for links and images. Used by $compile and $sanitize. + */ +function $$SanitizeUriProvider() { + var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, + imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + aHrefSanitizationWhitelist = regexp; + return this; + } + return aHrefSanitizationWhitelist; + }; + + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + imgSrcSanitizationWhitelist = regexp; + return this; + } + return imgSrcSanitizationWhitelist; + }; + + this.$get = function() { + return function sanitizeUri(uri, isImage) { + var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; + var normalizedVal; + normalizedVal = urlResolve(uri).href; + if (normalizedVal !== '' && !normalizedVal.match(regex)) { + return 'unsafe:' + normalizedVal; + } + return uri; + }; + }; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $sceMinErr = minErr('$sce'); + +var SCE_CONTEXTS = { + HTML: 'html', + CSS: 'css', + URL: 'url', + // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a + // url. (e.g. ng-include, script src, templateUrl) + RESOURCE_URL: 'resourceUrl', + JS: 'js' +}; + +// Helper functions follow. + +function adjustMatcher(matcher) { + if (matcher === 'self') { + return matcher; + } else if (isString(matcher)) { + // Strings match exactly except for 2 wildcards - '*' and '**'. + // '*' matches any character except those from the set ':/.?&'. + // '**' matches any character (like .* in a RegExp). + // More than 2 *'s raises an error as it's ill defined. + if (matcher.indexOf('***') > -1) { + throw $sceMinErr('iwcard', + 'Illegal sequence *** in string matcher. String: {0}', matcher); + } + matcher = escapeForRegexp(matcher). + replace('\\*\\*', '.*'). + replace('\\*', '[^:/.?&;]*'); + return new RegExp('^' + matcher + '$'); + } else if (isRegExp(matcher)) { + // The only other type of matcher allowed is a Regexp. + // Match entire URL / disallow partial matches. + // Flags are reset (i.e. no global, ignoreCase or multiline) + return new RegExp('^' + matcher.source + '$'); + } else { + throw $sceMinErr('imatcher', + 'Matchers may only be "self", string patterns or RegExp objects'); + } +} + + +function adjustMatchers(matchers) { + var adjustedMatchers = []; + if (isDefined(matchers)) { + forEach(matchers, function(matcher) { + adjustedMatchers.push(adjustMatcher(matcher)); + }); + } + return adjustedMatchers; +} + + +/** + * @ngdoc service + * @name $sceDelegate + * @kind function + * + * @description + * + * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict + * Contextual Escaping (SCE)} services to AngularJS. + * + * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of + * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is + * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to + * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things + * work because `$sce` delegates to `$sceDelegate` for these operations. + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. + * + * The default instance of `$sceDelegate` should work out of the box with little pain. While you + * can override it completely to change the behavior of `$sce`, the common case would + * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting + * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as + * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist + * $sceDelegateProvider.resourceUrlWhitelist} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + */ + +/** + * @ngdoc provider + * @name $sceDelegateProvider + * @description + * + * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate + * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure + * that the URLs used for sourcing Angular templates are safe. Refer {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and + * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + * + * For the general details about this service in Angular, read the main page for {@link ng.$sce + * Strict Contextual Escaping (SCE)}. + * + * **Example**: Consider the following case. + * + * - your app is hosted at url `http://myapp.example.com/` + * - but some of your templates are hosted on other domains you control such as + * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. + * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. + * + * Here is what a secure configuration for this scenario might look like: + * + * ``` + * angular.module('myApp', []).config(function($sceDelegateProvider) { + * $sceDelegateProvider.resourceUrlWhitelist([ + * // Allow same origin resource loads. + * 'self', + * // Allow loading from our assets domain. Notice the difference between * and **. + * 'http://srv*.assets.example.com/**' + * ]); + * + * // The blacklist overrides the whitelist so the open redirect here is blocked. + * $sceDelegateProvider.resourceUrlBlacklist([ + * 'http://myapp.example.com/clickThru**' + * ]); + * }); + * ``` + */ + +function $SceDelegateProvider() { + this.SCE_CONTEXTS = SCE_CONTEXTS; + + // Resource URLs can also be trusted by policy. + var resourceUrlWhitelist = ['self'], + resourceUrlBlacklist = []; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlWhitelist + * @kind function + * + * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + *
+ * **Note:** an empty whitelist array will block all URLs! + *
+ * + * @return {Array} the currently set whitelist array. + * + * The **default value** when no whitelist has been explicitly set is `['self']` allowing only + * same origin resource requests. + * + * @description + * Sets/Gets the whitelist of trusted resource URLs. + */ + this.resourceUrlWhitelist = function(value) { + if (arguments.length) { + resourceUrlWhitelist = adjustMatchers(value); + } + return resourceUrlWhitelist; + }; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlBlacklist + * @kind function + * + * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * The typical usage for the blacklist is to **block + * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as + * these would otherwise be trusted but actually return content from the redirected domain. + * + * Finally, **the blacklist overrides the whitelist** and has the final say. + * + * @return {Array} the currently set blacklist array. + * + * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there + * is no blacklist.) + * + * @description + * Sets/Gets the blacklist of trusted resource URLs. + */ + + this.resourceUrlBlacklist = function(value) { + if (arguments.length) { + resourceUrlBlacklist = adjustMatchers(value); + } + return resourceUrlBlacklist; + }; + + this.$get = ['$injector', function($injector) { + + var htmlSanitizer = function htmlSanitizer(html) { + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + }; + + if ($injector.has('$sanitize')) { + htmlSanitizer = $injector.get('$sanitize'); + } + + + function matchUrl(matcher, parsedUrl) { + if (matcher === 'self') { + return urlIsSameOrigin(parsedUrl); + } else { + // definitely a regex. See adjustMatchers() + return !!matcher.exec(parsedUrl.href); + } + } + + function isResourceUrlAllowedByPolicy(url) { + var parsedUrl = urlResolve(url.toString()); + var i, n, allowed = false; + // Ensure that at least one item from the whitelist allows this url. + for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { + if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { + allowed = true; + break; + } + } + if (allowed) { + // Ensure that no item from the blacklist blocked this url. + for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { + if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { + allowed = false; + break; + } + } + } + return allowed; + } + + function generateHolderType(Base) { + var holderType = function TrustedValueHolderType(trustedValue) { + this.$$unwrapTrustedValue = function() { + return trustedValue; + }; + }; + if (Base) { + holderType.prototype = new Base(); + } + holderType.prototype.valueOf = function sceValueOf() { + return this.$$unwrapTrustedValue(); + }; + holderType.prototype.toString = function sceToString() { + return this.$$unwrapTrustedValue().toString(); + }; + return holderType; + } + + var trustedValueHolderBase = generateHolderType(), + byType = {}; + + byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); + + /** + * @ngdoc method + * @name $sceDelegate#trustAs + * + * @description + * Returns an object that is trusted by angular for use in specified strict + * contextual escaping contexts (such as ng-bind-html, ng-include, any src + * attribute interpolation, any dom event binding attribute interpolation + * such as for onclick, etc.) that uses the provided value. + * See {@link ng.$sce $sce} for enabling strict contextual escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + function trustAs(type, trustedValue) { + var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (!Constructor) { + throw $sceMinErr('icontext', + 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', + type, trustedValue); + } + if (trustedValue === null || isUndefined(trustedValue) || trustedValue === '') { + return trustedValue; + } + // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting + // mutable objects, we ensure here that the value passed in is actually a string. + if (typeof trustedValue !== 'string') { + throw $sceMinErr('itype', + 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', + type); + } + return new Constructor(trustedValue); + } + + /** + * @ngdoc method + * @name $sceDelegate#valueOf + * + * @description + * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. + * + * If the passed parameter is not a value that had been returned by {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. + * + * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} + * call or anything else. + * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns + * `value` unchanged. + */ + function valueOf(maybeTrusted) { + if (maybeTrusted instanceof trustedValueHolderBase) { + return maybeTrusted.$$unwrapTrustedValue(); + } else { + return maybeTrusted; + } + } + + /** + * @ngdoc method + * @name $sceDelegate#getTrusted + * + * @description + * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and + * returns the originally supplied value if the queried context type is a supertype of the + * created type. If this condition isn't satisfied, throws an exception. + * + *
+ * Disabling auto-escaping is extremely dangerous, it usually creates a Cross Site Scripting + * (XSS) vulnerability in your application. + *
+ * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} call. + * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. + */ + function getTrusted(type, maybeTrusted) { + if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') { + return maybeTrusted; + } + var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (constructor && maybeTrusted instanceof constructor) { + return maybeTrusted.$$unwrapTrustedValue(); + } + // If we get here, then we may only take one of two actions. + // 1. sanitize the value for the requested type, or + // 2. throw an exception. + if (type === SCE_CONTEXTS.RESOURCE_URL) { + if (isResourceUrlAllowedByPolicy(maybeTrusted)) { + return maybeTrusted; + } else { + throw $sceMinErr('insecurl', + 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', + maybeTrusted.toString()); + } + } else if (type === SCE_CONTEXTS.HTML) { + return htmlSanitizer(maybeTrusted); + } + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + } + + return { trustAs: trustAs, + getTrusted: getTrusted, + valueOf: valueOf }; + }]; +} + + +/** + * @ngdoc provider + * @name $sceProvider + * @description + * + * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. + * - enable/disable Strict Contextual Escaping (SCE) in a module + * - override the default implementation with a custom delegate + * + * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. + */ + +/* jshint maxlen: false*/ + +/** + * @ngdoc service + * @name $sce + * @kind function + * + * @description + * + * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. + * + * # Strict Contextual Escaping + * + * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain + * contexts to result in a value that is marked as safe to use for that context. One example of + * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer + * to these contexts as privileged or SCE contexts. + * + * As of version 1.2, Angular ships with SCE enabled by default. + * + * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow + * one to execute arbitrary javascript by the use of the expression() syntax. Refer + * to learn more about them. + * You can ensure your document is in standards mode and not quirks mode by adding `` + * to the top of your HTML document. + * + * SCE assists in writing code in a way that (a) is secure by default and (b) makes auditing for + * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. + * + * Here's an example of a binding in a privileged context: + * + * ``` + * + *
+ * ``` + * + * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE + * disabled, this application allows the user to render arbitrary HTML into the DIV. + * In a more realistic example, one may be rendering user comments, blog articles, etc. via + * bindings. (HTML is just one example of a context where rendering user controlled input creates + * security vulnerabilities.) + * + * For the case of HTML, you might use a library, either on the client side, or on the server side, + * to sanitize unsafe HTML before binding to the value and rendering it in the document. + * + * How would you ensure that every place that used these types of bindings was bound to a value that + * was sanitized by your library (or returned as safe for rendering by your server?) How can you + * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some + * properties/fields and forgot to update the binding to the sanitized value? + * + * To be secure by default, you want to ensure that any such bindings are disallowed unless you can + * determine that something explicitly says it's safe to use a value for binding in that + * context. You can then audit your code (a simple grep would do) to ensure that this is only done + * for those values that you can easily tell are safe - because they were received from your server, + * sanitized by your library, etc. You can organize your codebase to help with this - perhaps + * allowing only the files in a specific directory to do this. Ensuring that the internal API + * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. + * + * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} + * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to + * obtain values that will be accepted by SCE / privileged contexts. + * + * + * ## How does it work? + * + * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted + * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link + * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the + * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. + * + * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link + * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly + * simplified): + * + * ``` + * var ngBindHtmlDirective = ['$sce', function($sce) { + * return function(scope, element, attr) { + * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { + * element.html(value || ''); + * }); + * }; + * }]; + * ``` + * + * ## Impact on loading templates + * + * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as + * `templateUrl`'s specified by {@link guide/directive directives}. + * + * By default, Angular only loads templates from the same domain and protocol as the application + * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or + * protocols, you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist + * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. + * + * *Please note*: + * The browser's + * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) + * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) + * policy apply in addition to this and may further restrict whether the template is successfully + * loaded. This means that without the right CORS policy, loading templates from a different domain + * won't work on all browsers. Also, loading templates from `file://` URL does not work on some + * browsers. + * + * ## This feels like too much overhead + * + * It's important to remember that SCE only applies to interpolation expressions. + * + * If your expressions are constant literals, they're automatically trusted and you don't need to + * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. + * `
`) just works. + * + * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them + * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. + * + * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load + * templates in `ng-include` from your application's domain without having to even know about SCE. + * It blocks loading templates from other domains or loading templates over http from an https + * served document. You can change these by setting your own custom {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. + * + * This significantly reduces the overhead. It is far easier to pay the small overhead and have an + * application that's secure and can be audited to verify that with much more ease than bolting + * security onto an application later. + * + * + * ## What trusted context types are supported? + * + * | Context | Notes | + * |---------------------|----------------| + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | + * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | + * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | + * + * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
+ * + * Each element in these arrays must be one of the following: + * + * - **'self'** + * - The special **string**, `'self'`, can be used to match against all URLs of the **same + * domain** as the application document using the **same protocol**. + * - **String** (except the special value `'self'`) + * - The string is matched against the full *normalized / absolute URL* of the resource + * being tested (substring matches are not good enough.) + * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters + * match themselves. + * - `*`: matches zero or more occurrences of any character other than one of the following 6 + * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and '`;`'. It's a useful wildcard for use + * in a whitelist. + * - `**`: matches zero or more occurrences of *any* character. As such, it's not + * appropriate for use in a scheme, domain, etc. as it would match too much. (e.g. + * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might + * not have been the intention.) Its usage at the very end of the path is ok. (e.g. + * http://foo.example.com/templates/**). + * - **RegExp** (*see caveat below*) + * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax + * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to + * accidentally introduce a bug when one updates a complex expression (imho, all regexes should + * have good test coverage). For instance, the use of `.` in the regex is correct only in a + * small number of cases. A `.` character in the regex used when matching the scheme or a + * subdomain could be matched against a `:` or literal `.` that was likely not intended. It + * is highly recommended to use the string patterns and only fall back to regular expressions + * as a last resort. + * - The regular expression must be an instance of RegExp (i.e. not a string.) It is + * matched against the **entire** *normalized / absolute URL* of the resource being tested + * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags + * present on the RegExp (such as multiline, global, ignoreCase) are ignored. + * - If you are generating your JavaScript from some other templating engine (not + * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), + * remember to escape your regular expression (and be aware that you might need more than + * one level of escaping depending on your templating engine and the way you interpolated + * the value.) Do make use of your platform's escaping mechanism as it might be good + * enough before coding your own. E.g. Ruby has + * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) + * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). + * Javascript lacks a similar built in function for escaping. Take a look at Google + * Closure library's [goog.string.regExpEscape(s)]( + * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. + * + * ## Show me an example using SCE. + * + * + * + *
+ *

+ * User comments
+ * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when + * $sanitize is available. If $sanitize isn't available, this results in an error instead of an + * exploit. + *
+ *
+ * {{userComment.name}}: + * + *
+ *
+ *
+ *
+ *
+ * + * + * angular.module('mySceApp', ['ngSanitize']) + * .controller('AppController', ['$http', '$templateCache', '$sce', + * function($http, $templateCache, $sce) { + * var self = this; + * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { + * self.userComments = userComments; + * }); + * self.explicitlyTrustedHtml = $sce.trustAsHtml( + * 'Hover over this text.'); + * }]); + * + * + * + * [ + * { "name": "Alice", + * "htmlComment": + * "Is anyone reading this?" + * }, + * { "name": "Bob", + * "htmlComment": "Yes! Am I the only other one?" + * } + * ] + * + * + * + * describe('SCE doc demo', function() { + * it('should sanitize untrusted values', function() { + * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) + * .toBe('Is anyone reading this?'); + * }); + * + * it('should NOT sanitize explicitly trusted values', function() { + * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( + * 'Hover over this text.'); + * }); + * }); + * + *
+ * + * + * + * ## Can I disable SCE completely? + * + * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits + * for little coding overhead. It will be much harder to take an SCE disabled application and + * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE + * for cases where you have a lot of existing code that was written before SCE was introduced and + * you're migrating them a module at a time. + * + * That said, here's how you can completely disable SCE: + * + * ``` + * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { + * // Completely disable SCE. For demonstration purposes only! + * // Do not use in new projects. + * $sceProvider.enabled(false); + * }); + * ``` + * + */ +/* jshint maxlen: 100 */ + +function $SceProvider() { + var enabled = true; + + /** + * @ngdoc method + * @name $sceProvider#enabled + * @kind function + * + * @param {boolean=} value If provided, then enables/disables SCE. + * @return {boolean} true if SCE is enabled, false otherwise. + * + * @description + * Enables/disables SCE and returns the current value. + */ + this.enabled = function(value) { + if (arguments.length) { + enabled = !!value; + } + return enabled; + }; + + + /* Design notes on the default implementation for SCE. + * + * The API contract for the SCE delegate + * ------------------------------------- + * The SCE delegate object must provide the following 3 methods: + * + * - trustAs(contextEnum, value) + * This method is used to tell the SCE service that the provided value is OK to use in the + * contexts specified by contextEnum. It must return an object that will be accepted by + * getTrusted() for a compatible contextEnum and return this value. + * + * - valueOf(value) + * For values that were not produced by trustAs(), return them as is. For values that were + * produced by trustAs(), return the corresponding input value to trustAs. Basically, if + * trustAs is wrapping the given values into some type, this operation unwraps it when given + * such a value. + * + * - getTrusted(contextEnum, value) + * This function should return the a value that is safe to use in the context specified by + * contextEnum or throw and exception otherwise. + * + * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be + * opaque or wrapped in some holder object. That happens to be an implementation detail. For + * instance, an implementation could maintain a registry of all trusted objects by context. In + * such a case, trustAs() would return the same object that was passed in. getTrusted() would + * return the same object passed in if it was found in the registry under a compatible context or + * throw an exception otherwise. An implementation might only wrap values some of the time based + * on some criteria. getTrusted() might return a value and not throw an exception for special + * constants or objects even if not wrapped. All such implementations fulfill this contract. + * + * + * A note on the inheritance model for SCE contexts + * ------------------------------------------------ + * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This + * is purely an implementation details. + * + * The contract is simply this: + * + * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) + * will also succeed. + * + * Inheritance happens to capture this in a natural way. In some future, we + * may not use inheritance anymore. That is OK because no code outside of + * sce.js and sceSpecs.js would need to be aware of this detail. + */ + + this.$get = ['$parse', '$sceDelegate', function( + $parse, $sceDelegate) { + // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow + // the "expression(javascript expression)" syntax which is insecure. + if (enabled && msie < 8) { + throw $sceMinErr('iequirks', + 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + + 'mode. You can fix this by adding the text to the top of your HTML ' + + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); + } + + var sce = shallowCopy(SCE_CONTEXTS); + + /** + * @ngdoc method + * @name $sce#isEnabled + * @kind function + * + * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you + * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. + * + * @description + * Returns a boolean indicating if SCE is enabled. + */ + sce.isEnabled = function() { + return enabled; + }; + sce.trustAs = $sceDelegate.trustAs; + sce.getTrusted = $sceDelegate.getTrusted; + sce.valueOf = $sceDelegate.valueOf; + + if (!enabled) { + sce.trustAs = sce.getTrusted = function(type, value) { return value; }; + sce.valueOf = identity; + } + + /** + * @ngdoc method + * @name $sce#parseAs + * + * @description + * Converts Angular {@link guide/expression expression} into a function. This is like {@link + * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it + * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, + * *result*)} + * + * @param {string} type The kind of SCE context in which this result will be used. + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + sce.parseAs = function sceParseAs(type, expr) { + var parsed = $parse(expr); + if (parsed.literal && parsed.constant) { + return parsed; + } else { + return $parse(expr, function(value) { + return sce.getTrusted(type, value); + }); + } + }; + + /** + * @ngdoc method + * @name $sce#trustAs + * + * @description + * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, + * returns an object that is trusted by angular for use in specified strict contextual + * escaping contexts (such as ng-bind-html, ng-include, any src attribute + * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) + * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual + * escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + + /** + * @ngdoc method + * @name $sce#trustAsHtml + * + * @description + * Shorthand method. `$sce.trustAsHtml(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml + * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsUrl + * + * @description + * Shorthand method. `$sce.trustAsUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl + * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsResourceUrl + * + * @description + * Shorthand method. `$sce.trustAsResourceUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the return + * value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsJs + * + * @description + * Shorthand method. `$sce.trustAsJs(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs + * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#getTrusted + * + * @description + * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, + * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the + * originally supplied value if the queried context type is a supertype of the created type. + * If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} + * call. + * @returns {*} The value the was originally provided to + * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. + * Otherwise, throws an exception. + */ + + /** + * @ngdoc method + * @name $sce#getTrustedHtml + * + * @description + * Shorthand method. `$sce.getTrustedHtml(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedCss + * + * @description + * Shorthand method. `$sce.getTrustedCss(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedUrl + * + * @description + * Shorthand method. `$sce.getTrustedUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedResourceUrl + * + * @description + * Shorthand method. `$sce.getTrustedResourceUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to pass to `$sceDelegate.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedJs + * + * @description + * Shorthand method. `$sce.getTrustedJs(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` + */ + + /** + * @ngdoc method + * @name $sce#parseAsHtml + * + * @description + * Shorthand method. `$sce.parseAsHtml(expression string)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsCss + * + * @description + * Shorthand method. `$sce.parseAsCss(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsUrl + * + * @description + * Shorthand method. `$sce.parseAsUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsResourceUrl + * + * @description + * Shorthand method. `$sce.parseAsResourceUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsJs + * + * @description + * Shorthand method. `$sce.parseAsJs(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + // Shorthand delegations. + var parse = sce.parseAs, + getTrusted = sce.getTrusted, + trustAs = sce.trustAs; + + forEach(SCE_CONTEXTS, function(enumValue, name) { + var lName = lowercase(name); + sce[camelCase("parse_as_" + lName)] = function(expr) { + return parse(enumValue, expr); + }; + sce[camelCase("get_trusted_" + lName)] = function(value) { + return getTrusted(enumValue, value); + }; + sce[camelCase("trust_as_" + lName)] = function(value) { + return trustAs(enumValue, value); + }; + }); + + return sce; + }]; +} + +/** + * !!! This is an undocumented "private" service !!! + * + * @name $sniffer + * @requires $window + * @requires $document + * + * @property {boolean} history Does the browser support html5 history api ? + * @property {boolean} transitions Does the browser support CSS transition events ? + * @property {boolean} animations Does the browser support CSS animation events ? + * + * @description + * This is very simple implementation of testing browser's features. + */ +function $SnifferProvider() { + this.$get = ['$window', '$document', function($window, $document) { + var eventSupport = {}, + // Chrome Packaged Apps are not allowed to access `history.pushState`. They can be detected by + // the presence of `chrome.app.runtime` (see https://developer.chrome.com/apps/api_index) + isChromePackagedApp = $window.chrome && $window.chrome.app && $window.chrome.app.runtime, + hasHistoryPushState = !isChromePackagedApp && $window.history && $window.history.pushState, + android = + toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), + boxee = /Boxee/i.test(($window.navigator || {}).userAgent), + document = $document[0] || {}, + vendorPrefix, + vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, + bodyStyle = document.body && document.body.style, + transitions = false, + animations = false, + match; + + if (bodyStyle) { + for (var prop in bodyStyle) { + if (match = vendorRegex.exec(prop)) { + vendorPrefix = match[0]; + vendorPrefix = vendorPrefix[0].toUpperCase() + vendorPrefix.substr(1); + break; + } + } + + if (!vendorPrefix) { + vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; + } + + transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); + animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); + + if (android && (!transitions || !animations)) { + transitions = isString(bodyStyle.webkitTransition); + animations = isString(bodyStyle.webkitAnimation); + } + } + + + return { + // Android has history.pushState, but it does not update location correctly + // so let's not use the history API at all. + // http://code.google.com/p/android/issues/detail?id=17471 + // https://github.com/angular/angular.js/issues/904 + + // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has + // so let's not use the history API also + // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined + // jshint -W018 + history: !!(hasHistoryPushState && !(android < 4) && !boxee), + // jshint +W018 + hasEvent: function(event) { + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have + // it. In particular the event is not fired when backspace or delete key are pressed or + // when cut operation is performed. + // IE10+ implements 'input' event but it erroneously fires under various situations, + // e.g. when placeholder changes, or a form is focused. + if (event === 'input' && msie <= 11) return false; + + if (isUndefined(eventSupport[event])) { + var divElm = document.createElement('div'); + eventSupport[event] = 'on' + event in divElm; + } + + return eventSupport[event]; + }, + csp: csp(), + vendorPrefix: vendorPrefix, + transitions: transitions, + animations: animations, + android: android + }; + }]; +} + +var $templateRequestMinErr = minErr('$compile'); + +/** + * @ngdoc provider + * @name $templateRequestProvider + * @description + * Used to configure the options passed to the {@link $http} service when making a template request. + * + * For example, it can be used for specifying the "Accept" header that is sent to the server, when + * requesting a template. + */ +function $TemplateRequestProvider() { + + var httpOptions; + + /** + * @ngdoc method + * @name $templateRequestProvider#httpOptions + * @description + * The options to be passed to the {@link $http} service when making the request. + * You can use this to override options such as the "Accept" header for template requests. + * + * The {@link $templateRequest} will set the `cache` and the `transformResponse` properties of the + * options if not overridden here. + * + * @param {string=} value new value for the {@link $http} options. + * @returns {string|self} Returns the {@link $http} options when used as getter and self if used as setter. + */ + this.httpOptions = function(val) { + if (val) { + httpOptions = val; + return this; + } + return httpOptions; + }; + + /** + * @ngdoc service + * @name $templateRequest + * + * @description + * The `$templateRequest` service runs security checks then downloads the provided template using + * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request + * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the + * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the + * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted + * when `tpl` is of type string and `$templateCache` has the matching entry. + * + * If you want to pass custom options to the `$http` service, such as setting the Accept header you + * can configure this via {@link $templateRequestProvider#httpOptions}. + * + * @param {string|TrustedResourceUrl} tpl The HTTP request template URL + * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty + * + * @return {Promise} a promise for the HTTP response data of the given URL. + * + * @property {number} totalPendingRequests total amount of pending template requests being downloaded. + */ + this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) { + + function handleRequestFn(tpl, ignoreRequestError) { + handleRequestFn.totalPendingRequests++; + + // We consider the template cache holds only trusted templates, so + // there's no need to go through whitelisting again for keys that already + // are included in there. This also makes Angular accept any script + // directive, no matter its name. However, we still need to unwrap trusted + // types. + if (!isString(tpl) || isUndefined($templateCache.get(tpl))) { + tpl = $sce.getTrustedResourceUrl(tpl); + } + + var transformResponse = $http.defaults && $http.defaults.transformResponse; + + if (isArray(transformResponse)) { + transformResponse = transformResponse.filter(function(transformer) { + return transformer !== defaultHttpResponseTransform; + }); + } else if (transformResponse === defaultHttpResponseTransform) { + transformResponse = null; + } + + return $http.get(tpl, extend({ + cache: $templateCache, + transformResponse: transformResponse + }, httpOptions)) + ['finally'](function() { + handleRequestFn.totalPendingRequests--; + }) + .then(function(response) { + $templateCache.put(tpl, response.data); + return response.data; + }, handleError); + + function handleError(resp) { + if (!ignoreRequestError) { + throw $templateRequestMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})', + tpl, resp.status, resp.statusText); + } + return $q.reject(resp); + } + } + + handleRequestFn.totalPendingRequests = 0; + + return handleRequestFn; + }]; +} + +function $$TestabilityProvider() { + this.$get = ['$rootScope', '$browser', '$location', + function($rootScope, $browser, $location) { + + /** + * @name $testability + * + * @description + * The private $$testability service provides a collection of methods for use when debugging + * or by automated test and debugging tools. + */ + var testability = {}; + + /** + * @name $$testability#findBindings + * + * @description + * Returns an array of elements that are bound (via ng-bind or {{}}) + * to expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The binding expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. Filters and whitespace are ignored. + */ + testability.findBindings = function(element, expression, opt_exactMatch) { + var bindings = element.getElementsByClassName('ng-binding'); + var matches = []; + forEach(bindings, function(binding) { + var dataBinding = angular.element(binding).data('$binding'); + if (dataBinding) { + forEach(dataBinding, function(bindingName) { + if (opt_exactMatch) { + var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); + if (matcher.test(bindingName)) { + matches.push(binding); + } + } else { + if (bindingName.indexOf(expression) != -1) { + matches.push(binding); + } + } + }); + } + }); + return matches; + }; + + /** + * @name $$testability#findModels + * + * @description + * Returns an array of elements that are two-way found via ng-model to + * expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The model expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. + */ + testability.findModels = function(element, expression, opt_exactMatch) { + var prefixes = ['ng-', 'data-ng-', 'ng\\:']; + for (var p = 0; p < prefixes.length; ++p) { + var attributeEquals = opt_exactMatch ? '=' : '*='; + var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; + var elements = element.querySelectorAll(selector); + if (elements.length) { + return elements; + } + } + }; + + /** + * @name $$testability#getLocation + * + * @description + * Shortcut for getting the location in a browser agnostic way. Returns + * the path, search, and hash. (e.g. /path?a=b#hash) + */ + testability.getLocation = function() { + return $location.url(); + }; + + /** + * @name $$testability#setLocation + * + * @description + * Shortcut for navigating to a location without doing a full page reload. + * + * @param {string} url The location url (path, search and hash, + * e.g. /path?a=b#hash) to go to. + */ + testability.setLocation = function(url) { + if (url !== $location.url()) { + $location.url(url); + $rootScope.$digest(); + } + }; + + /** + * @name $$testability#whenStable + * + * @description + * Calls the callback when $timeout and $http requests are completed. + * + * @param {function} callback + */ + testability.whenStable = function(callback) { + $browser.notifyWhenNoOutstandingRequests(callback); + }; + + return testability; + }]; +} + +function $TimeoutProvider() { + this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', + function($rootScope, $browser, $q, $$q, $exceptionHandler) { + + var deferreds = {}; + + + /** + * @ngdoc service + * @name $timeout + * + * @description + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch + * block and delegates any exceptions to + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * The return value of calling `$timeout` is a promise, which will be resolved when + * the delay has passed and the timeout function, if provided, is executed. + * + * To cancel a timeout request, call `$timeout.cancel(promise)`. + * + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to + * synchronously flush the queue of deferred functions. + * + * If you only want a promise that will be resolved after some specified delay + * then you can call `$timeout` without the `fn` function. + * + * @param {function()=} fn A function, whose execution should be delayed. + * @param {number=} [delay=0] Delay in milliseconds. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise + * will be resolved with the return value of the `fn` function. + * + */ + function timeout(fn, delay, invokeApply) { + if (!isFunction(fn)) { + invokeApply = delay; + delay = fn; + fn = noop; + } + + var args = sliceArgs(arguments, 3), + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise, + timeoutId; + + timeoutId = $browser.defer(function() { + try { + deferred.resolve(fn.apply(null, args)); + } catch (e) { + deferred.reject(e); + $exceptionHandler(e); + } + finally { + delete deferreds[promise.$$timeoutId]; + } + + if (!skipApply) $rootScope.$apply(); + }, delay); + + promise.$$timeoutId = timeoutId; + deferreds[timeoutId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $timeout#cancel + * + * @description + * Cancels a task associated with the `promise`. As a result of this, the promise will be + * resolved with a rejection. + * + * @param {Promise=} promise Promise returned by the `$timeout` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + timeout.cancel = function(promise) { + if (promise && promise.$$timeoutId in deferreds) { + deferreds[promise.$$timeoutId].reject('canceled'); + delete deferreds[promise.$$timeoutId]; + return $browser.defer.cancel(promise.$$timeoutId); + } + return false; + }; + + return timeout; + }]; +} + +// NOTE: The usage of window and document instead of $window and $document here is +// deliberate. This service depends on the specific behavior of anchor nodes created by the +// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and +// cause us to break tests. In addition, when the browser resolves a URL for XHR, it +// doesn't know about mocked locations and resolves URLs to the real document - which is +// exactly the behavior needed here. There is little value is mocking these out for this +// service. +var urlParsingNode = window.document.createElement("a"); +var originUrl = urlResolve(window.location.href); + + +/** + * + * Implementation Notes for non-IE browsers + * ---------------------------------------- + * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, + * results both in the normalizing and parsing of the URL. Normalizing means that a relative + * URL will be resolved into an absolute URL in the context of the application document. + * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related + * properties are all populated to reflect the normalized URL. This approach has wide + * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * + * Implementation Notes for IE + * --------------------------- + * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other + * browsers. However, the parsed components will not be set if the URL assigned did not specify + * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We + * work around that by performing the parsing in a 2nd step by taking a previously normalized + * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the + * properties such as protocol, hostname, port, etc. + * + * References: + * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * http://url.spec.whatwg.org/#urlutils + * https://github.com/angular/angular.js/pull/2902 + * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ + * + * @kind function + * @param {string} url The URL to be parsed. + * @description Normalizes and parses a URL. + * @returns {object} Returns the normalized URL as a dictionary. + * + * | member name | Description | + * |---------------|----------------| + * | href | A normalized version of the provided URL if it was not an absolute URL | + * | protocol | The protocol including the trailing colon | + * | host | The host and port (if the port is non-default) of the normalizedUrl | + * | search | The search params, minus the question mark | + * | hash | The hash string, minus the hash symbol + * | hostname | The hostname + * | port | The port, without ":" + * | pathname | The pathname, beginning with "/" + * + */ +function urlResolve(url) { + var href = url; + + if (msie) { + // Normalize before parse. Refer Implementation Notes on why this is + // done in two steps on IE. + urlParsingNode.setAttribute("href", href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') + ? urlParsingNode.pathname + : '/' + urlParsingNode.pathname + }; +} + +/** + * Parse a request URL and determine whether this is a same-origin request as the application document. + * + * @param {string|object} requestUrl The url of the request as a string that will be resolved + * or a parsed URL object. + * @returns {boolean} Whether the request is for the same origin as the application document. + */ +function urlIsSameOrigin(requestUrl) { + var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; + return (parsed.protocol === originUrl.protocol && + parsed.host === originUrl.host); +} + +/** + * @ngdoc service + * @name $window + * + * @description + * A reference to the browser's `window` object. While `window` + * is globally available in JavaScript, it causes testability problems, because + * it is a global variable. In angular we always refer to it through the + * `$window` service, so it may be overridden, removed or mocked for testing. + * + * Expressions, like the one defined for the `ngClick` directive in the example + * below, are evaluated with respect to the current scope. Therefore, there is + * no risk of inadvertently coding in a dependency on a global value in such an + * expression. + * + * @example + + + +
+ + +
+
+ + it('should display the greeting in the input box', function() { + element(by.model('greeting')).sendKeys('Hello, E2E Tests'); + // If we click the button it will block the test runner + // element(':button').click(); + }); + +
+ */ +function $WindowProvider() { + this.$get = valueFn(window); +} + +/** + * @name $$cookieReader + * @requires $document + * + * @description + * This is a private service for reading cookies used by $http and ngCookies + * + * @return {Object} a key/value map of the current cookies + */ +function $$CookieReader($document) { + var rawDocument = $document[0] || {}; + var lastCookies = {}; + var lastCookieString = ''; + + function safeDecodeURIComponent(str) { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + } + + return function() { + var cookieArray, cookie, i, index, name; + var currentCookieString = rawDocument.cookie || ''; + + if (currentCookieString !== lastCookieString) { + lastCookieString = currentCookieString; + cookieArray = lastCookieString.split('; '); + lastCookies = {}; + + for (i = 0; i < cookieArray.length; i++) { + cookie = cookieArray[i]; + index = cookie.indexOf('='); + if (index > 0) { //ignore nameless cookies + name = safeDecodeURIComponent(cookie.substring(0, index)); + // the first value that is seen for a cookie is the most + // specific one. values for the same cookie name that + // follow are for less specific paths. + if (isUndefined(lastCookies[name])) { + lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); + } + } + } + } + return lastCookies; + }; +} + +$$CookieReader.$inject = ['$document']; + +function $$CookieReaderProvider() { + this.$get = $$CookieReader; +} + +/* global currencyFilter: true, + dateFilter: true, + filterFilter: true, + jsonFilter: true, + limitToFilter: true, + lowercaseFilter: true, + numberFilter: true, + orderByFilter: true, + uppercaseFilter: true, + */ + +/** + * @ngdoc provider + * @name $filterProvider + * @description + * + * Filters are just functions which transform input to an output. However filters need to be + * Dependency Injected. To achieve this a filter definition consists of a factory function which is + * annotated with dependencies and is responsible for creating a filter function. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ * + * ```js + * // Filter registration + * function MyModule($provide, $filterProvider) { + * // create a service to demonstrate injection (not always needed) + * $provide.value('greet', function(name){ + * return 'Hello ' + name + '!'; + * }); + * + * // register a filter factory which uses the + * // greet service to demonstrate DI. + * $filterProvider.register('greet', function(greet){ + * // return the filter function which uses the greet service + * // to generate salutation + * return function(text) { + * // filters need to be forgiving so check input validity + * return text && greet(text) || text; + * }; + * }); + * } + * ``` + * + * The filter function is registered with the `$injector` under the filter name suffix with + * `Filter`. + * + * ```js + * it('should be the same instance', inject( + * function($filterProvider) { + * $filterProvider.register('reverse', function(){ + * return ...; + * }); + * }, + * function($filter, reverseFilter) { + * expect($filter('reverse')).toBe(reverseFilter); + * }); + * ``` + * + * + * For more information about how angular filters work, and how to create your own filters, see + * {@link guide/filter Filters} in the Angular Developer Guide. + */ + +/** + * @ngdoc service + * @name $filter + * @kind function + * @description + * Filters are used for formatting data displayed to the user. + * + * The general syntax in templates is as follows: + * + * {{ expression [| filter_name[:parameter_value] ... ] }} + * + * @param {String} name Name of the filter function to retrieve + * @return {Function} the filter function + * @example + + +
+

{{ originalText }}

+

{{ filteredText }}

+
+
+ + + angular.module('filterExample', []) + .controller('MainCtrl', function($scope, $filter) { + $scope.originalText = 'hello'; + $scope.filteredText = $filter('uppercase')($scope.originalText); + }); + +
+ */ +$FilterProvider.$inject = ['$provide']; +function $FilterProvider($provide) { + var suffix = 'Filter'; + + /** + * @ngdoc method + * @name $filterProvider#register + * @param {string|Object} name Name of the filter function, or an object map of filters where + * the keys are the filter names and the values are the filter factories. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ * @param {Function} factory If the first argument was a string, a factory function for the filter to be registered. + * @returns {Object} Registered filter instance, or if a map of filters was provided then a map + * of the registered filter instances. + */ + function register(name, factory) { + if (isObject(name)) { + var filters = {}; + forEach(name, function(filter, key) { + filters[key] = register(key, filter); + }); + return filters; + } else { + return $provide.factory(name + suffix, factory); + } + } + this.register = register; + + this.$get = ['$injector', function($injector) { + return function(name) { + return $injector.get(name + suffix); + }; + }]; + + //////////////////////////////////////// + + /* global + currencyFilter: false, + dateFilter: false, + filterFilter: false, + jsonFilter: false, + limitToFilter: false, + lowercaseFilter: false, + numberFilter: false, + orderByFilter: false, + uppercaseFilter: false, + */ + + register('currency', currencyFilter); + register('date', dateFilter); + register('filter', filterFilter); + register('json', jsonFilter); + register('limitTo', limitToFilter); + register('lowercase', lowercaseFilter); + register('number', numberFilter); + register('orderBy', orderByFilter); + register('uppercase', uppercaseFilter); +} + +/** + * @ngdoc filter + * @name filter + * @kind function + * + * @description + * Selects a subset of items from `array` and returns it as a new array. + * + * @param {Array} array The source array. + * @param {string|Object|function()} expression The predicate to be used for selecting items from + * `array`. + * + * Can be one of: + * + * - `string`: The string is used for matching against the contents of the `array`. All strings or + * objects with string properties in `array` that match this string will be returned. This also + * applies to nested object properties. + * The predicate can be negated by prefixing the string with `!`. + * + * - `Object`: A pattern object can be used to filter specific properties on objects contained + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items + * which have property `name` containing "M" and property `phone` containing "1". A special + * property name (`$` by default) can be used (e.g. as in `{$: "text"}`) to accept a match + * against any property of the object or its nested object properties. That's equivalent to the + * simple substring match with a `string` as described above. The special property name can be + * overwritten, using the `anyPropertyKey` parameter. + * The predicate can be negated by prefixing the string with `!`. + * For example `{name: "!M"}` predicate will return an array of items which have property `name` + * not containing "M". + * + * Note that a named property will match properties on the same level only, while the special + * `$` property will match properties on the same level or deeper. E.g. an array item like + * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but + * **will** be matched by `{$: 'John'}`. + * + * - `function(value, index, array)`: A predicate function can be used to write arbitrary filters. + * The function is called for each element of the array, with the element, its index, and + * the entire array itself as arguments. + * + * The final result is an array of those elements that the predicate returned true for. + * + * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in + * determining if the expected value (from the filter expression) and actual value (from + * the object in the array) should be considered a match. + * + * Can be one of: + * + * - `function(actual, expected)`: + * The function will be given the object value and the predicate value to compare and + * should return true if both values should be considered equal. + * + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. + * This is essentially strict comparison of expected and actual. + * + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. + * + * Primitive values are converted to strings. Objects are not compared against primitives, + * unless they have a custom `toString` method (e.g. `Date` objects). + * + * @param {string=} anyPropertyKey The special property name that matches against any property. + * By default `$`. + * + * @example + + +
+ + + + + + + + +
NamePhone
{{friend.name}}{{friend.phone}}
+
+
+
+
+
+ + + + + + +
NamePhone
{{friendObj.name}}{{friendObj.phone}}
+
+ + var expectFriendNames = function(expectedNames, key) { + element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { + arr.forEach(function(wd, i) { + expect(wd.getText()).toMatch(expectedNames[i]); + }); + }); + }; + + it('should search across all fields when filtering with a string', function() { + var searchText = element(by.model('searchText')); + searchText.clear(); + searchText.sendKeys('m'); + expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); + + searchText.clear(); + searchText.sendKeys('76'); + expectFriendNames(['John', 'Julie'], 'friend'); + }); + + it('should search in specific fields when filtering with a predicate object', function() { + var searchAny = element(by.model('search.$')); + searchAny.clear(); + searchAny.sendKeys('i'); + expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); + }); + it('should use a equal comparison when comparator is true', function() { + var searchName = element(by.model('search.name')); + var strict = element(by.model('strict')); + searchName.clear(); + searchName.sendKeys('Julie'); + strict.click(); + expectFriendNames(['Julie'], 'friendObj'); + }); + +
+ */ + +function filterFilter() { + return function(array, expression, comparator, anyPropertyKey) { + if (!isArrayLike(array)) { + if (array == null) { + return array; + } else { + throw minErr('filter')('notarray', 'Expected array but received: {0}', array); + } + } + + anyPropertyKey = anyPropertyKey || '$'; + var expressionType = getTypeForFilter(expression); + var predicateFn; + var matchAgainstAnyProp; + + switch (expressionType) { + case 'function': + predicateFn = expression; + break; + case 'boolean': + case 'null': + case 'number': + case 'string': + matchAgainstAnyProp = true; + //jshint -W086 + case 'object': + //jshint +W086 + predicateFn = createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp); + break; + default: + return array; + } + + return Array.prototype.filter.call(array, predicateFn); + }; +} + +// Helper functions for `filterFilter` +function createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp) { + var shouldMatchPrimitives = isObject(expression) && (anyPropertyKey in expression); + var predicateFn; + + if (comparator === true) { + comparator = equals; + } else if (!isFunction(comparator)) { + comparator = function(actual, expected) { + if (isUndefined(actual)) { + // No substring matching against `undefined` + return false; + } + if ((actual === null) || (expected === null)) { + // No substring matching against `null`; only match against `null` + return actual === expected; + } + if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) { + // Should not compare primitives against objects, unless they have custom `toString` method + return false; + } + + actual = lowercase('' + actual); + expected = lowercase('' + expected); + return actual.indexOf(expected) !== -1; + }; + } + + predicateFn = function(item) { + if (shouldMatchPrimitives && !isObject(item)) { + return deepCompare(item, expression[anyPropertyKey], comparator, anyPropertyKey, false); + } + return deepCompare(item, expression, comparator, anyPropertyKey, matchAgainstAnyProp); + }; + + return predicateFn; +} + +function deepCompare(actual, expected, comparator, anyPropertyKey, matchAgainstAnyProp, dontMatchWholeObject) { + var actualType = getTypeForFilter(actual); + var expectedType = getTypeForFilter(expected); + + if ((expectedType === 'string') && (expected.charAt(0) === '!')) { + return !deepCompare(actual, expected.substring(1), comparator, anyPropertyKey, matchAgainstAnyProp); + } else if (isArray(actual)) { + // In case `actual` is an array, consider it a match + // if ANY of it's items matches `expected` + return actual.some(function(item) { + return deepCompare(item, expected, comparator, anyPropertyKey, matchAgainstAnyProp); + }); + } + + switch (actualType) { + case 'object': + var key; + if (matchAgainstAnyProp) { + for (key in actual) { + if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, anyPropertyKey, true)) { + return true; + } + } + return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, anyPropertyKey, false); + } else if (expectedType === 'object') { + for (key in expected) { + var expectedVal = expected[key]; + if (isFunction(expectedVal) || isUndefined(expectedVal)) { + continue; + } + + var matchAnyProperty = key === anyPropertyKey; + var actualVal = matchAnyProperty ? actual : actual[key]; + if (!deepCompare(actualVal, expectedVal, comparator, anyPropertyKey, matchAnyProperty, matchAnyProperty)) { + return false; + } + } + return true; + } else { + return comparator(actual, expected); + } + break; + case 'function': + return false; + default: + return comparator(actual, expected); + } +} + +// Used for easily differentiating between `null` and actual `object` +function getTypeForFilter(val) { + return (val === null) ? 'null' : typeof val; +} + +var MAX_DIGITS = 22; +var DECIMAL_SEP = '.'; +var ZERO_CHAR = '0'; + +/** + * @ngdoc filter + * @name currency + * @kind function + * + * @description + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default + * symbol for current locale is used. + * + * @param {number} amount Input to filter. + * @param {string=} symbol Currency symbol or identifier to be displayed. + * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale + * @returns {string} Formatted number. + * + * + * @example + + + +
+
+ default currency symbol ($): {{amount | currency}}
+ custom currency identifier (USD$): {{amount | currency:"USD$"}} + no fractions (0): {{amount | currency:"USD$":0}} +
+
+ + it('should init with 1234.56', function() { + expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); + expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); + }); + it('should update', function() { + if (browser.params.browser == 'safari') { + // Safari does not understand the minus key. See + // https://github.com/angular/protractor/issues/481 + return; + } + element(by.model('amount')).clear(); + element(by.model('amount')).sendKeys('-1234'); + expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00'); + expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234'); + }); + +
+ */ +currencyFilter.$inject = ['$locale']; +function currencyFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(amount, currencySymbol, fractionSize) { + if (isUndefined(currencySymbol)) { + currencySymbol = formats.CURRENCY_SYM; + } + + if (isUndefined(fractionSize)) { + fractionSize = formats.PATTERNS[1].maxFrac; + } + + // if null or undefined pass it through + return (amount == null) + ? amount + : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). + replace(/\u00A4/g, currencySymbol); + }; +} + +/** + * @ngdoc filter + * @name number + * @kind function + * + * @description + * Formats a number as text. + * + * If the input is null or undefined, it will just be returned. + * If the input is infinite (Infinity or -Infinity), the Infinity symbol '∞' or '-∞' is returned, respectively. + * If the input is not a number an empty string is returned. + * + * + * @param {number|string} number Number to format. + * @param {(number|string)=} fractionSize Number of decimal places to round the number to. + * If this is not provided then the fraction size is computed from the current locale's number + * formatting pattern. In the case of the default locale, it will be 3. + * @returns {string} Number rounded to `fractionSize` appropriately formatted based on the current + * locale (e.g., in the en_US locale it will have "." as the decimal separator and + * include "," group separators after each third digit). + * + * @example + + + +
+
+ Default formatting: {{val | number}}
+ No fractions: {{val | number:0}}
+ Negative number: {{-val | number:4}} +
+
+ + it('should format numbers', function() { + expect(element(by.id('number-default')).getText()).toBe('1,234.568'); + expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); + }); + + it('should update', function() { + element(by.model('val')).clear(); + element(by.model('val')).sendKeys('3374.333'); + expect(element(by.id('number-default')).getText()).toBe('3,374.333'); + expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); + }); + +
+ */ +numberFilter.$inject = ['$locale']; +function numberFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(number, fractionSize) { + + // if null or undefined pass it through + return (number == null) + ? number + : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); + }; +} + +/** + * Parse a number (as a string) into three components that can be used + * for formatting the number. + * + * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/) + * + * @param {string} numStr The number to parse + * @return {object} An object describing this number, containing the following keys: + * - d : an array of digits containing leading zeros as necessary + * - i : the number of the digits in `d` that are to the left of the decimal point + * - e : the exponent for numbers that would need more than `MAX_DIGITS` digits in `d` + * + */ +function parse(numStr) { + var exponent = 0, digits, numberOfIntegerDigits; + var i, j, zeros; + + // Decimal point? + if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) { + numStr = numStr.replace(DECIMAL_SEP, ''); + } + + // Exponential form? + if ((i = numStr.search(/e/i)) > 0) { + // Work out the exponent. + if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i; + numberOfIntegerDigits += +numStr.slice(i + 1); + numStr = numStr.substring(0, i); + } else if (numberOfIntegerDigits < 0) { + // There was no decimal point or exponent so it is an integer. + numberOfIntegerDigits = numStr.length; + } + + // Count the number of leading zeros. + for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++) {/* jshint noempty: false */} + + if (i == (zeros = numStr.length)) { + // The digits are all zero. + digits = [0]; + numberOfIntegerDigits = 1; + } else { + // Count the number of trailing zeros + zeros--; + while (numStr.charAt(zeros) == ZERO_CHAR) zeros--; + + // Trailing zeros are insignificant so ignore them + numberOfIntegerDigits -= i; + digits = []; + // Convert string to array of digits without leading/trailing zeros. + for (j = 0; i <= zeros; i++, j++) { + digits[j] = +numStr.charAt(i); + } + } + + // If the number overflows the maximum allowed digits then use an exponent. + if (numberOfIntegerDigits > MAX_DIGITS) { + digits = digits.splice(0, MAX_DIGITS - 1); + exponent = numberOfIntegerDigits - 1; + numberOfIntegerDigits = 1; + } + + return { d: digits, e: exponent, i: numberOfIntegerDigits }; +} + +/** + * Round the parsed number to the specified number of decimal places + * This function changed the parsedNumber in-place + */ +function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) { + var digits = parsedNumber.d; + var fractionLen = digits.length - parsedNumber.i; + + // determine fractionSize if it is not specified; `+fractionSize` converts it to a number + fractionSize = (isUndefined(fractionSize)) ? Math.min(Math.max(minFrac, fractionLen), maxFrac) : +fractionSize; + + // The index of the digit to where rounding is to occur + var roundAt = fractionSize + parsedNumber.i; + var digit = digits[roundAt]; + + if (roundAt > 0) { + // Drop fractional digits beyond `roundAt` + digits.splice(Math.max(parsedNumber.i, roundAt)); + + // Set non-fractional digits beyond `roundAt` to 0 + for (var j = roundAt; j < digits.length; j++) { + digits[j] = 0; + } + } else { + // We rounded to zero so reset the parsedNumber + fractionLen = Math.max(0, fractionLen); + parsedNumber.i = 1; + digits.length = Math.max(1, roundAt = fractionSize + 1); + digits[0] = 0; + for (var i = 1; i < roundAt; i++) digits[i] = 0; + } + + if (digit >= 5) { + if (roundAt - 1 < 0) { + for (var k = 0; k > roundAt; k--) { + digits.unshift(0); + parsedNumber.i++; + } + digits.unshift(1); + parsedNumber.i++; + } else { + digits[roundAt - 1]++; + } + } + + // Pad out with zeros to get the required fraction length + for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0); + + + // Do any carrying, e.g. a digit was rounded up to 10 + var carry = digits.reduceRight(function(carry, d, i, digits) { + d = d + carry; + digits[i] = d % 10; + return Math.floor(d / 10); + }, 0); + if (carry) { + digits.unshift(carry); + parsedNumber.i++; + } +} + +/** + * Format a number into a string + * @param {number} number The number to format + * @param {{ + * minFrac, // the minimum number of digits required in the fraction part of the number + * maxFrac, // the maximum number of digits required in the fraction part of the number + * gSize, // number of digits in each group of separated digits + * lgSize, // number of digits in the last group of digits before the decimal separator + * negPre, // the string to go in front of a negative number (e.g. `-` or `(`)) + * posPre, // the string to go in front of a positive number + * negSuf, // the string to go after a negative number (e.g. `)`) + * posSuf // the string to go after a positive number + * }} pattern + * @param {string} groupSep The string to separate groups of number (e.g. `,`) + * @param {string} decimalSep The string to act as the decimal separator (e.g. `.`) + * @param {[type]} fractionSize The size of the fractional part of the number + * @return {string} The number formatted as a string + */ +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + + if (!(isString(number) || isNumber(number)) || isNaN(number)) return ''; + + var isInfinity = !isFinite(number); + var isZero = false; + var numStr = Math.abs(number) + '', + formattedText = '', + parsedNumber; + + if (isInfinity) { + formattedText = '\u221e'; + } else { + parsedNumber = parse(numStr); + + roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac); + + var digits = parsedNumber.d; + var integerLen = parsedNumber.i; + var exponent = parsedNumber.e; + var decimals = []; + isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true); + + // pad zeros for small numbers + while (integerLen < 0) { + digits.unshift(0); + integerLen++; + } + + // extract decimals digits + if (integerLen > 0) { + decimals = digits.splice(integerLen, digits.length); + } else { + decimals = digits; + digits = [0]; + } + + // format the integer digits with grouping separators + var groups = []; + if (digits.length >= pattern.lgSize) { + groups.unshift(digits.splice(-pattern.lgSize, digits.length).join('')); + } + while (digits.length > pattern.gSize) { + groups.unshift(digits.splice(-pattern.gSize, digits.length).join('')); + } + if (digits.length) { + groups.unshift(digits.join('')); + } + formattedText = groups.join(groupSep); + + // append the decimal digits + if (decimals.length) { + formattedText += decimalSep + decimals.join(''); + } + + if (exponent) { + formattedText += 'e+' + exponent; + } + } + if (number < 0 && !isZero) { + return pattern.negPre + formattedText + pattern.negSuf; + } else { + return pattern.posPre + formattedText + pattern.posSuf; + } +} + +function padNumber(num, digits, trim, negWrap) { + var neg = ''; + if (num < 0 || (negWrap && num <= 0)) { + if (negWrap) { + num = -num + 1; + } else { + num = -num; + neg = '-'; + } + } + num = '' + num; + while (num.length < digits) num = ZERO_CHAR + num; + if (trim) { + num = num.substr(num.length - digits); + } + return neg + num; +} + + +function dateGetter(name, size, offset, trim, negWrap) { + offset = offset || 0; + return function(date) { + var value = date['get' + name](); + if (offset > 0 || value > -offset) { + value += offset; + } + if (value === 0 && offset == -12) value = 12; + return padNumber(value, size, trim, negWrap); + }; +} + +function dateStrGetter(name, shortForm, standAlone) { + return function(date, formats) { + var value = date['get' + name](); + var propPrefix = (standAlone ? 'STANDALONE' : '') + (shortForm ? 'SHORT' : ''); + var get = uppercase(propPrefix + name); + + return formats[get][value]; + }; +} + +function timeZoneGetter(date, formats, offset) { + var zone = -1 * offset; + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; +} + +function getFirstThursdayOfYear(year) { + // 0 = index of January + var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); + // 4 = index of Thursday (+1 to account for 1st = 5) + // 11 = index of *next* Thursday (+1 account for 1st = 12) + return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); +} + +function getThursdayThisWeek(datetime) { + return new Date(datetime.getFullYear(), datetime.getMonth(), + // 4 = index of Thursday + datetime.getDate() + (4 - datetime.getDay())); +} + +function weekGetter(size) { + return function(date) { + var firstThurs = getFirstThursdayOfYear(date.getFullYear()), + thisThurs = getThursdayThisWeek(date); + + var diff = +thisThurs - +firstThurs, + result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week + + return padNumber(result, size); + }; +} + +function ampmGetter(date, formats) { + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; +} + +function eraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1]; +} + +function longEraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1]; +} + +var DATE_FORMATS = { + yyyy: dateGetter('FullYear', 4, 0, false, true), + yy: dateGetter('FullYear', 2, 0, true, true), + y: dateGetter('FullYear', 1, 0, false, true), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + LLLL: dateStrGetter('Month', false, true), + dd: dateGetter('Date', 2), + d: dateGetter('Date', 1), + HH: dateGetter('Hours', 2), + H: dateGetter('Hours', 1), + hh: dateGetter('Hours', 2, -12), + h: dateGetter('Hours', 1, -12), + mm: dateGetter('Minutes', 2), + m: dateGetter('Minutes', 1), + ss: dateGetter('Seconds', 2), + s: dateGetter('Seconds', 1), + // while ISO 8601 requires fractions to be prefixed with `.` or `,` + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions + sss: dateGetter('Milliseconds', 3), + EEEE: dateStrGetter('Day'), + EEE: dateStrGetter('Day', true), + a: ampmGetter, + Z: timeZoneGetter, + ww: weekGetter(2), + w: weekGetter(1), + G: eraGetter, + GG: eraGetter, + GGG: eraGetter, + GGGG: longEraGetter +}; + +var DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, + NUMBER_STRING = /^\-?\d+$/; + +/** + * @ngdoc filter + * @name date + * @kind function + * + * @description + * Formats `date` to a string based on the requested `format`. + * + * `format` string can be composed of the following elements: + * + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) + * * `'MMMM'`: Month in year (January-December) + * * `'MMM'`: Month in year (Jan-Dec) + * * `'MM'`: Month in year, padded (01-12) + * * `'M'`: Month in year (1-12) + * * `'LLLL'`: Stand-alone month in year (January-December) + * * `'dd'`: Day in month, padded (01-31) + * * `'d'`: Day in month (1-31) + * * `'EEEE'`: Day in Week,(Sunday-Saturday) + * * `'EEE'`: Day in Week, (Sun-Sat) + * * `'HH'`: Hour in day, padded (00-23) + * * `'H'`: Hour in day (0-23) + * * `'hh'`: Hour in AM/PM, padded (01-12) + * * `'h'`: Hour in AM/PM, (1-12) + * * `'mm'`: Minute in hour, padded (00-59) + * * `'m'`: Minute in hour (0-59) + * * `'ss'`: Second in minute, padded (00-59) + * * `'s'`: Second in minute (0-59) + * * `'sss'`: Millisecond in second, padded (000-999) + * * `'a'`: AM/PM marker + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) + * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year + * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year + * * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD') + * * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini') + * + * `format` string can also be one of the following predefined + * {@link guide/i18n localizable formats}: + * + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale + * (e.g. Sep 3, 2010 12:05:08 PM) + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) + * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale + * (e.g. Friday, September 3, 2010) + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) + * + * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. + * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence + * (e.g. `"h 'o''clock'"`). + * + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is + * specified in the string input, the time is considered to be in the local timezone. + * @param {string=} format Formatting rules (see Description). If not specified, + * `mediumDate` is used. + * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the + * continental US time zone abbreviations, but for general use, use a time zone offset, for + * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) + * If not specified, the timezone of the browser will be used. + * @returns {string} Formatted string or the input if input is not recognized as date/millis. + * + * @example + + + {{1288323623006 | date:'medium'}}: + {{1288323623006 | date:'medium'}}
+ {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
+ {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: + {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
+ {{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: + {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
+
+ + it('should format date', function() { + expect(element(by.binding("1288323623006 | date:'medium'")).getText()). + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); + expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); + expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); + expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). + toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); + }); + +
+ */ +dateFilter.$inject = ['$locale']; +function dateFilter($locale) { + + + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; + // 1 2 3 4 5 6 7 8 9 10 11 + function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8601_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0, + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, + timeSetter = match[8] ? date.setUTCHours : date.setHours; + + if (match[9]) { + tzHour = toInt(match[9] + match[10]); + tzMin = toInt(match[9] + match[11]); + } + dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); + var h = toInt(match[4] || 0) - tzHour; + var m = toInt(match[5] || 0) - tzMin; + var s = toInt(match[6] || 0); + var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); + timeSetter.call(date, h, m, s, ms); + return date; + } + return string; + } + + + return function(date, format, timezone) { + var text = '', + parts = [], + fn, match; + + format = format || 'mediumDate'; + format = $locale.DATETIME_FORMATS[format] || format; + if (isString(date)) { + date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date); + } + + if (isNumber(date)) { + date = new Date(date); + } + + if (!isDate(date) || !isFinite(date.getTime())) { + return date; + } + + while (format) { + match = DATE_FORMATS_SPLIT.exec(format); + if (match) { + parts = concat(parts, match, 1); + format = parts.pop(); + } else { + parts.push(format); + format = null; + } + } + + var dateTimezoneOffset = date.getTimezoneOffset(); + if (timezone) { + dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); + date = convertTimezoneToLocal(date, timezone, true); + } + forEach(parts, function(value) { + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) + : value === "''" ? "'" : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + }); + + return text; + }; +} + + +/** + * @ngdoc filter + * @name json + * @kind function + * + * @description + * Allows you to convert a JavaScript object into JSON string. + * + * This filter is mostly useful for debugging. When using the double curly {{value}} notation + * the binding is automatically converted to JSON. + * + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. + * @returns {string} JSON string. + * + * + * @example + + +
{{ {'name':'value'} | json }}
+
{{ {'name':'value'} | json:4 }}
+
+ + it('should jsonify filtered objects', function() { + expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + }); + +
+ * + */ +function jsonFilter() { + return function(object, spacing) { + if (isUndefined(spacing)) { + spacing = 2; + } + return toJson(object, spacing); + }; +} + + +/** + * @ngdoc filter + * @name lowercase + * @kind function + * @description + * Converts string to lowercase. + * @see angular.lowercase + */ +var lowercaseFilter = valueFn(lowercase); + + +/** + * @ngdoc filter + * @name uppercase + * @kind function + * @description + * Converts string to uppercase. + * @see angular.uppercase + */ +var uppercaseFilter = valueFn(uppercase); + +/** + * @ngdoc filter + * @name limitTo + * @kind function + * + * @description + * Creates a new array or string containing only a specified number of elements. The elements are + * taken from either the beginning or the end of the source array, string or number, as specified by + * the value and sign (positive or negative) of `limit`. Other array-like objects are also supported + * (e.g. array subclasses, NodeLists, jqLite/jQuery collections etc). If a number is used as input, + * it is converted to a string. + * + * @param {Array|ArrayLike|string|number} input - Array/array-like, string or number to be limited. + * @param {string|number} limit - The length of the returned array or string. If the `limit` number + * is positive, `limit` number of items from the beginning of the source array/string are copied. + * If the number is negative, `limit` number of items from the end of the source array/string + * are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined, + * the input will be returned unchanged. + * @param {(string|number)=} begin - Index at which to begin limitation. As a negative index, + * `begin` indicates an offset from the end of `input`. Defaults to `0`. + * @returns {Array|string} A new sub-array or substring of length `limit` or less if the input had + * less than `limit` elements. + * + * @example + + + +
+ +

Output numbers: {{ numbers | limitTo:numLimit }}

+ +

Output letters: {{ letters | limitTo:letterLimit }}

+ +

Output long number: {{ longNumber | limitTo:longNumberLimit }}

+
+
+ + var numLimitInput = element(by.model('numLimit')); + var letterLimitInput = element(by.model('letterLimit')); + var longNumberLimitInput = element(by.model('longNumberLimit')); + var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); + var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); + var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); + + it('should limit the number array to first three items', function() { + expect(numLimitInput.getAttribute('value')).toBe('3'); + expect(letterLimitInput.getAttribute('value')).toBe('3'); + expect(longNumberLimitInput.getAttribute('value')).toBe('3'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); + expect(limitedLetters.getText()).toEqual('Output letters: abc'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); + }); + + // There is a bug in safari and protractor that doesn't like the minus key + // it('should update the output when -3 is entered', function() { + // numLimitInput.clear(); + // numLimitInput.sendKeys('-3'); + // letterLimitInput.clear(); + // letterLimitInput.sendKeys('-3'); + // longNumberLimitInput.clear(); + // longNumberLimitInput.sendKeys('-3'); + // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); + // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); + // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); + // }); + + it('should not exceed the maximum size of input array', function() { + numLimitInput.clear(); + numLimitInput.sendKeys('100'); + letterLimitInput.clear(); + letterLimitInput.sendKeys('100'); + longNumberLimitInput.clear(); + longNumberLimitInput.sendKeys('100'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); + expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); + }); + +
+*/ +function limitToFilter() { + return function(input, limit, begin) { + if (Math.abs(Number(limit)) === Infinity) { + limit = Number(limit); + } else { + limit = toInt(limit); + } + if (isNaN(limit)) return input; + + if (isNumber(input)) input = input.toString(); + if (!isArrayLike(input)) return input; + + begin = (!begin || isNaN(begin)) ? 0 : toInt(begin); + begin = (begin < 0) ? Math.max(0, input.length + begin) : begin; + + if (limit >= 0) { + return sliceFn(input, begin, begin + limit); + } else { + if (begin === 0) { + return sliceFn(input, limit, input.length); + } else { + return sliceFn(input, Math.max(0, begin + limit), begin); + } + } + }; +} + +function sliceFn(input, begin, end) { + if (isString(input)) return input.slice(begin, end); + + return slice.call(input, begin, end); +} + +/** + * @ngdoc filter + * @name orderBy + * @kind function + * + * @description + * Returns an array containing the items from the specified `collection`, ordered by a `comparator` + * function based on the values computed using the `expression` predicate. + * + * For example, `[{id: 'foo'}, {id: 'bar'}] | orderBy:'id'` would result in + * `[{id: 'bar'}, {id: 'foo'}]`. + * + * The `collection` can be an Array or array-like object (e.g. NodeList, jQuery object, TypedArray, + * String, etc). + * + * The `expression` can be a single predicate, or a list of predicates each serving as a tie-breaker + * for the preceeding one. The `expression` is evaluated against each item and the output is used + * for comparing with other items. + * + * You can change the sorting order by setting `reverse` to `true`. By default, items are sorted in + * ascending order. + * + * The comparison is done using the `comparator` function. If none is specified, a default, built-in + * comparator is used (see below for details - in a nutshell, it compares numbers numerically and + * strings alphabetically). + * + * ### Under the hood + * + * Ordering the specified `collection` happens in two phases: + * + * 1. All items are passed through the predicate (or predicates), and the returned values are saved + * along with their type (`string`, `number` etc). For example, an item `{label: 'foo'}`, passed + * through a predicate that extracts the value of the `label` property, would be transformed to: + * ``` + * { + * value: 'foo', + * type: 'string', + * index: ... + * } + * ``` + * 2. The comparator function is used to sort the items, based on the derived values, types and + * indices. + * + * If you use a custom comparator, it will be called with pairs of objects of the form + * `{value: ..., type: '...', index: ...}` and is expected to return `0` if the objects are equal + * (as far as the comparator is concerned), `-1` if the 1st one should be ranked higher than the + * second, or `1` otherwise. + * + * In order to ensure that the sorting will be deterministic across platforms, if none of the + * specified predicates can distinguish between two items, `orderBy` will automatically introduce a + * dummy predicate that returns the item's index as `value`. + * (If you are using a custom comparator, make sure it can handle this predicate as well.) + * + * Finally, in an attempt to simplify things, if a predicate returns an object as the extracted + * value for an item, `orderBy` will try to convert that object to a primitive value, before passing + * it to the comparator. The following rules govern the conversion: + * + * 1. If the object has a `valueOf()` method that returns a primitive, its return value will be + * used instead.
+ * (If the object has a `valueOf()` method that returns another object, then the returned object + * will be used in subsequent steps.) + * 2. If the object has a custom `toString()` method (i.e. not the one inherited from `Object`) that + * returns a primitive, its return value will be used instead.
+ * (If the object has a `toString()` method that returns another object, then the returned object + * will be used in subsequent steps.) + * 3. No conversion; the object itself is used. + * + * ### The default comparator + * + * The default, built-in comparator should be sufficient for most usecases. In short, it compares + * numbers numerically, strings alphabetically (and case-insensitively), for objects falls back to + * using their index in the original collection, and sorts values of different types by type. + * + * More specifically, it follows these steps to determine the relative order of items: + * + * 1. If the compared values are of different types, compare the types themselves alphabetically. + * 2. If both values are of type `string`, compare them alphabetically in a case- and + * locale-insensitive way. + * 3. If both values are objects, compare their indices instead. + * 4. Otherwise, return: + * - `0`, if the values are equal (by strict equality comparison, i.e. using `===`). + * - `-1`, if the 1st value is "less than" the 2nd value (compared using the `<` operator). + * - `1`, otherwise. + * + * **Note:** If you notice numbers not being sorted as expected, make sure they are actually being + * saved as numbers and not strings. + * + * @param {Array|ArrayLike} collection - The collection (array or array-like object) to sort. + * @param {(Function|string|Array.)=} expression - A predicate (or list of + * predicates) to be used by the comparator to determine the order of elements. + * + * Can be one of: + * + * - `Function`: A getter function. This function will be called with each item as argument and + * the return value will be used for sorting. + * - `string`: An Angular expression. This expression will be evaluated against each item and the + * result will be used for sorting. For example, use `'label'` to sort by a property called + * `label` or `'label.substring(0, 3)'` to sort by the first 3 characters of the `label` + * property.
+ * (The result of a constant expression is interpreted as a property name to be used for + * comparison. For example, use `'"special name"'` (note the extra pair of quotes) to sort by a + * property called `special name`.)
+ * An expression can be optionally prefixed with `+` or `-` to control the sorting direction, + * ascending or descending. For example, `'+label'` or `'-label'`. If no property is provided, + * (e.g. `'+'` or `'-'`), the collection element itself is used in comparisons. + * - `Array`: An array of function and/or string predicates. If a predicate cannot determine the + * relative order of two items, the next predicate is used as a tie-breaker. + * + * **Note:** If the predicate is missing or empty then it defaults to `'+'`. + * + * @param {boolean=} reverse - If `true`, reverse the sorting order. + * @param {(Function)=} comparator - The comparator function used to determine the relative order of + * value pairs. If omitted, the built-in comparator will be used. + * + * @returns {Array} - The sorted array. + * + * + * @example + * ### Ordering a table with `ngRepeat` + * + * The example below demonstrates a simple {@link ngRepeat ngRepeat}, where the data is sorted by + * age in descending order (expression is set to `'-age'`). The `comparator` is not set, which means + * it defaults to the built-in comparator. + * + + +
+ + + + + + + + + + + +
NamePhone NumberAge
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+ + angular.module('orderByExample1', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.friends = [ + {name: 'John', phone: '555-1212', age: 10}, + {name: 'Mary', phone: '555-9876', age: 19}, + {name: 'Mike', phone: '555-4321', age: 21}, + {name: 'Adam', phone: '555-5678', age: 35}, + {name: 'Julie', phone: '555-8765', age: 29} + ]; + }]); + + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + + // Element locators + var names = element.all(by.repeater('friends').column('friend.name')); + + it('should sort friends by age in reverse order', function() { + expect(names.get(0).getText()).toBe('Adam'); + expect(names.get(1).getText()).toBe('Julie'); + expect(names.get(2).getText()).toBe('Mike'); + expect(names.get(3).getText()).toBe('Mary'); + expect(names.get(4).getText()).toBe('John'); + }); + +
+ *
+ * + * @example + * ### Changing parameters dynamically + * + * All parameters can be changed dynamically. The next example shows how you can make the columns of + * a table sortable, by binding the `expression` and `reverse` parameters to scope properties. + * + + +
+
Sort by = {{propertyName}}; reverse = {{reverse}}
+
+ +
+ + + + + + + + + + + +
+ + + + + + + + +
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+ + angular.module('orderByExample2', []) + .controller('ExampleController', ['$scope', function($scope) { + var friends = [ + {name: 'John', phone: '555-1212', age: 10}, + {name: 'Mary', phone: '555-9876', age: 19}, + {name: 'Mike', phone: '555-4321', age: 21}, + {name: 'Adam', phone: '555-5678', age: 35}, + {name: 'Julie', phone: '555-8765', age: 29} + ]; + + $scope.propertyName = 'age'; + $scope.reverse = true; + $scope.friends = friends; + + $scope.sortBy = function(propertyName) { + $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false; + $scope.propertyName = propertyName; + }; + }]); + + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + .sortorder:after { + content: '\25b2'; // BLACK UP-POINTING TRIANGLE + } + .sortorder.reverse:after { + content: '\25bc'; // BLACK DOWN-POINTING TRIANGLE + } + + + // Element locators + var unsortButton = element(by.partialButtonText('unsorted')); + var nameHeader = element(by.partialButtonText('Name')); + var phoneHeader = element(by.partialButtonText('Phone')); + var ageHeader = element(by.partialButtonText('Age')); + var firstName = element(by.repeater('friends').column('friend.name').row(0)); + var lastName = element(by.repeater('friends').column('friend.name').row(4)); + + it('should sort friends by some property, when clicking on the column header', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + phoneHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Mary'); + + nameHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('Mike'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + }); + + it('should sort friends in reverse order, when clicking on the same column', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + + ageHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + }); + + it('should restore the original order, when clicking "Set to unsorted"', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + unsortButton.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Julie'); + }); + +
+ *
+ * + * @example + * ### Using `orderBy` inside a controller + * + * It is also possible to call the `orderBy` filter manually, by injecting `orderByFilter`, and + * calling it with the desired parameters. (Alternatively, you could inject the `$filter` factory + * and retrieve the `orderBy` filter with `$filter('orderBy')`.) + * + + +
+
Sort by = {{propertyName}}; reverse = {{reverse}}
+
+ +
+ + + + + + + + + + + +
+ + + + + + + + +
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+ + angular.module('orderByExample3', []) + .controller('ExampleController', ['$scope', 'orderByFilter', function($scope, orderBy) { + var friends = [ + {name: 'John', phone: '555-1212', age: 10}, + {name: 'Mary', phone: '555-9876', age: 19}, + {name: 'Mike', phone: '555-4321', age: 21}, + {name: 'Adam', phone: '555-5678', age: 35}, + {name: 'Julie', phone: '555-8765', age: 29} + ]; + + $scope.propertyName = 'age'; + $scope.reverse = true; + $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse); + + $scope.sortBy = function(propertyName) { + $scope.reverse = (propertyName !== null && $scope.propertyName === propertyName) + ? !$scope.reverse : false; + $scope.propertyName = propertyName; + $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse); + }; + }]); + + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + .sortorder:after { + content: '\25b2'; // BLACK UP-POINTING TRIANGLE + } + .sortorder.reverse:after { + content: '\25bc'; // BLACK DOWN-POINTING TRIANGLE + } + + + // Element locators + var unsortButton = element(by.partialButtonText('unsorted')); + var nameHeader = element(by.partialButtonText('Name')); + var phoneHeader = element(by.partialButtonText('Phone')); + var ageHeader = element(by.partialButtonText('Age')); + var firstName = element(by.repeater('friends').column('friend.name').row(0)); + var lastName = element(by.repeater('friends').column('friend.name').row(4)); + + it('should sort friends by some property, when clicking on the column header', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + phoneHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Mary'); + + nameHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('Mike'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + }); + + it('should sort friends in reverse order, when clicking on the same column', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + + ageHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + }); + + it('should restore the original order, when clicking "Set to unsorted"', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + unsortButton.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Julie'); + }); + +
+ *
+ * + * @example + * ### Using a custom comparator + * + * If you have very specific requirements about the way items are sorted, you can pass your own + * comparator function. For example, you might need to compare some strings in a locale-sensitive + * way. (When specifying a custom comparator, you also need to pass a value for the `reverse` + * argument - passing `false` retains the default sorting order, i.e. ascending.) + * + + +
+
+

Locale-sensitive Comparator

+ + + + + + + + + +
NameFavorite Letter
{{friend.name}}{{friend.favoriteLetter}}
+
+
+

Default Comparator

+ + + + + + + + + +
NameFavorite Letter
{{friend.name}}{{friend.favoriteLetter}}
+
+
+
+ + angular.module('orderByExample4', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.friends = [ + {name: 'John', favoriteLetter: 'Ä'}, + {name: 'Mary', favoriteLetter: 'Ü'}, + {name: 'Mike', favoriteLetter: 'Ö'}, + {name: 'Adam', favoriteLetter: 'H'}, + {name: 'Julie', favoriteLetter: 'Z'} + ]; + + $scope.localeSensitiveComparator = function(v1, v2) { + // If we don't get strings, just compare by index + if (v1.type !== 'string' || v2.type !== 'string') { + return (v1.index < v2.index) ? -1 : 1; + } + + // Compare strings alphabetically, taking locale into account + return v1.value.localeCompare(v2.value); + }; + }]); + + + .friends-container { + display: inline-block; + margin: 0 30px; + } + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + + // Element locators + var container = element(by.css('.custom-comparator')); + var names = container.all(by.repeater('friends').column('friend.name')); + + it('should sort friends by favorite letter (in correct alphabetical order)', function() { + expect(names.get(0).getText()).toBe('John'); + expect(names.get(1).getText()).toBe('Adam'); + expect(names.get(2).getText()).toBe('Mike'); + expect(names.get(3).getText()).toBe('Mary'); + expect(names.get(4).getText()).toBe('Julie'); + }); + +
+ * + */ +orderByFilter.$inject = ['$parse']; +function orderByFilter($parse) { + return function(array, sortPredicate, reverseOrder, compareFn) { + + if (array == null) return array; + if (!isArrayLike(array)) { + throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array); + } + + if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } + if (sortPredicate.length === 0) { sortPredicate = ['+']; } + + var predicates = processPredicates(sortPredicate); + + var descending = reverseOrder ? -1 : 1; + + // Define the `compare()` function. Use a default comparator if none is specified. + var compare = isFunction(compareFn) ? compareFn : defaultCompare; + + // The next three lines are a version of a Swartzian Transform idiom from Perl + // (sometimes called the Decorate-Sort-Undecorate idiom) + // See https://en.wikipedia.org/wiki/Schwartzian_transform + var compareValues = Array.prototype.map.call(array, getComparisonObject); + compareValues.sort(doComparison); + array = compareValues.map(function(item) { return item.value; }); + + return array; + + function getComparisonObject(value, index) { + // NOTE: We are adding an extra `tieBreaker` value based on the element's index. + // This will be used to keep the sort stable when none of the input predicates can + // distinguish between two elements. + return { + value: value, + tieBreaker: {value: index, type: 'number', index: index}, + predicateValues: predicates.map(function(predicate) { + return getPredicateValue(predicate.get(value), index); + }) + }; + } + + function doComparison(v1, v2) { + for (var i = 0, ii = predicates.length; i < ii; i++) { + var result = compare(v1.predicateValues[i], v2.predicateValues[i]); + if (result) { + return result * predicates[i].descending * descending; + } + } + + return compare(v1.tieBreaker, v2.tieBreaker) * descending; + } + }; + + function processPredicates(sortPredicates) { + return sortPredicates.map(function(predicate) { + var descending = 1, get = identity; + + if (isFunction(predicate)) { + get = predicate; + } else if (isString(predicate)) { + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { + descending = predicate.charAt(0) == '-' ? -1 : 1; + predicate = predicate.substring(1); + } + if (predicate !== '') { + get = $parse(predicate); + if (get.constant) { + var key = get(); + get = function(value) { return value[key]; }; + } + } + } + return {get: get, descending: descending}; + }); + } + + function isPrimitive(value) { + switch (typeof value) { + case 'number': /* falls through */ + case 'boolean': /* falls through */ + case 'string': + return true; + default: + return false; + } + } + + function objectValue(value) { + // If `valueOf` is a valid function use that + if (isFunction(value.valueOf)) { + value = value.valueOf(); + if (isPrimitive(value)) return value; + } + // If `toString` is a valid function and not the one from `Object.prototype` use that + if (hasCustomToString(value)) { + value = value.toString(); + if (isPrimitive(value)) return value; + } + + return value; + } + + function getPredicateValue(value, index) { + var type = typeof value; + if (value === null) { + type = 'string'; + value = 'null'; + } else if (type === 'object') { + value = objectValue(value); + } + return {value: value, type: type, index: index}; + } + + function defaultCompare(v1, v2) { + var result = 0; + var type1 = v1.type; + var type2 = v2.type; + + if (type1 === type2) { + var value1 = v1.value; + var value2 = v2.value; + + if (type1 === 'string') { + // Compare strings case-insensitively + value1 = value1.toLowerCase(); + value2 = value2.toLowerCase(); + } else if (type1 === 'object') { + // For basic objects, use the position of the object + // in the collection instead of the value + if (isObject(value1)) value1 = v1.index; + if (isObject(value2)) value2 = v2.index; + } + + if (value1 !== value2) { + result = value1 < value2 ? -1 : 1; + } + } else { + result = type1 < type2 ? -1 : 1; + } + + return result; + } +} + +function ngDirective(directive) { + if (isFunction(directive)) { + directive = { + link: directive + }; + } + directive.restrict = directive.restrict || 'AC'; + return valueFn(directive); +} + +/** + * @ngdoc directive + * @name a + * @restrict E + * + * @description + * Modifies the default behavior of the html A tag so that the default action is prevented when + * the href attribute is empty. + * + * This change permits the easy creation of action links with the `ngClick` directive + * without changing the location or causing page reloads, e.g.: + * `Add Item` + */ +var htmlAnchorDirective = valueFn({ + restrict: 'E', + compile: function(element, attr) { + if (!attr.href && !attr.xlinkHref) { + return function(scope, element) { + // If the linked element is not an anchor tag anymore, do nothing + if (element[0].nodeName.toLowerCase() !== 'a') return; + + // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. + var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? + 'xlink:href' : 'href'; + element.on('click', function(event) { + // if we have no href url, then don't navigate anywhere. + if (!element.attr(href)) { + event.preventDefault(); + } + }); + }; + } + } +}); + +/** + * @ngdoc directive + * @name ngHref + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in an href attribute will + * make the link go to the wrong URL if the user clicks it before + * Angular has a chance to replace the `{{hash}}` markup with its + * value. Until Angular replaces the markup the link will be broken + * and will most likely return a 404 error. The `ngHref` directive + * solves this problem. + * + * The wrong way to write it: + * ```html + * link1 + * ``` + * + * The correct way to write it: + * ```html + * link1 + * ``` + * + * @element A + * @param {template} ngHref any string which can contain `{{}}` markup. + * + * @example + * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes + * in links and their different behaviors: + + +
+ link 1 (link, don't reload)
+ link 2 (link, don't reload)
+ link 3 (link, reload!)
+ anchor (link, don't reload)
+ anchor (no link)
+ link (link, change location) +
+ + it('should execute ng-click but not reload when href without value', function() { + element(by.id('link-1')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('1'); + expect(element(by.id('link-1')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when href empty string', function() { + element(by.id('link-2')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('2'); + expect(element(by.id('link-2')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click and change url when ng-href specified', function() { + expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); + + element(by.id('link-3')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/123$/); + }); + }, 5000, 'page should navigate to /123'); + }); + + it('should execute ng-click but not reload when href empty string and name specified', function() { + element(by.id('link-4')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('4'); + expect(element(by.id('link-4')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when no href but name specified', function() { + element(by.id('link-5')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('5'); + expect(element(by.id('link-5')).getAttribute('href')).toBe(null); + }); + + it('should only change url when only ng-href', function() { + element(by.model('value')).clear(); + element(by.model('value')).sendKeys('6'); + expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); + + element(by.id('link-6')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/6$/); + }); + }, 5000, 'page should navigate to /6'); + }); + +
+ */ + +/** + * @ngdoc directive + * @name ngSrc + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrc` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrc any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngSrcset + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngDisabled + * @restrict A + * @priority 100 + * + * @description + * + * This directive sets the `disabled` attribute on the element if the + * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `disabled` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+ +
+ + it('should toggle button', function() { + expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, + * then the `disabled` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngChecked + * @restrict A + * @priority 100 + * + * @description + * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy. + * + * Note that this directive should not be used together with {@link ngModel `ngModel`}, + * as this can lead to unexpected behavior. + * + * A special directive is necessary because we cannot use interpolation inside the `checked` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+ +
+ + it('should check both checkBoxes', function() { + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); + element(by.model('master')).click(); + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, + * then the `checked` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngReadonly + * @restrict A + * @priority 100 + * + * @description + * + * Sets the `readonly` attribute on the element, if the expression inside `ngReadonly` is truthy. + * Note that `readonly` applies only to `input` elements with specific types. [See the input docs on + * MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) for more information. + * + * A special directive is necessary because we cannot use interpolation inside the `readonly` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+ +
+ + it('should toggle readonly attr', function() { + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, + * then special attribute "readonly" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngSelected + * @restrict A + * @priority 100 + * + * @description + * + * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `selected` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + *
+ * **Note:** `ngSelected` does not interact with the `select` and `ngModel` directives, it only + * sets the `selected` attribute on the element. If you are using `ngModel` on the select, you + * should not use `ngSelected` on the options, as `ngModel` will set the select value and + * selected options. + *
+ * + * @example + + +
+ +
+ + it('should select Greetings!', function() { + expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); + element(by.model('selected')).click(); + expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); + }); + +
+ * + * @element OPTION + * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, + * then special attribute "selected" will be set on the element + */ + +/** + * @ngdoc directive + * @name ngOpen + * @restrict A + * @priority 100 + * + * @description + * + * Sets the `open` attribute on the element, if the expression inside `ngOpen` is truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `open` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * ## A note about browser compatibility + * + * Edge, Firefox, and Internet Explorer do not support the `details` element, it is + * recommended to use {@link ng.ngShow} and {@link ng.ngHide} instead. + * + * @example + + +
+
+ Show/Hide me +
+
+ + it('should toggle open', function() { + expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); + element(by.model('open')).click(); + expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); + }); + +
+ * + * @element DETAILS + * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, + * then special attribute "open" will be set on the element + */ + +var ngAttributeAliasDirectives = {}; + +// boolean attrs are evaluated +forEach(BOOLEAN_ATTR, function(propName, attrName) { + // binding to multiple is not supported + if (propName == "multiple") return; + + function defaultLinkFn(scope, element, attr) { + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { + attr.$set(attrName, !!value); + }); + } + + var normalized = directiveNormalize('ng-' + attrName); + var linkFn = defaultLinkFn; + + if (propName === 'checked') { + linkFn = function(scope, element, attr) { + // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input + if (attr.ngModel !== attr[normalized]) { + defaultLinkFn(scope, element, attr); + } + }; + } + + ngAttributeAliasDirectives[normalized] = function() { + return { + restrict: 'A', + priority: 100, + link: linkFn + }; + }; +}); + +// aliased input attrs are evaluated +forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { + ngAttributeAliasDirectives[ngAttr] = function() { + return { + priority: 100, + link: function(scope, element, attr) { + //special case ngPattern when a literal regular expression value + //is used as the expression (this way we don't have to watch anything). + if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { + var match = attr.ngPattern.match(REGEX_STRING_REGEXP); + if (match) { + attr.$set("ngPattern", new RegExp(match[1], match[2])); + return; + } + } + + scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { + attr.$set(ngAttr, value); + }); + } + }; + }; +}); + +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 99, // it needs to run after the attributes are interpolated + link: function(scope, element, attr) { + var propName = attrName, + name = attrName; + + if (attrName === 'href' && + toString.call(element.prop('href')) === '[object SVGAnimatedString]') { + name = 'xlinkHref'; + attr.$attr[name] = 'xlink:href'; + propName = null; + } + + attr.$observe(normalized, function(value) { + if (!value) { + if (attrName === 'href') { + attr.$set(name, null); + } + return; + } + + attr.$set(name, value); + + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need + // to set the property as well to achieve the desired effect. + // we use attr[attrName] value since $set can sanitize the url. + if (msie && propName) element.prop(propName, attr[name]); + }); + } + }; + }; +}); + +/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true + */ +var nullFormCtrl = { + $addControl: noop, + $$renameControl: nullFormRenameControl, + $removeControl: noop, + $setValidity: noop, + $setDirty: noop, + $setPristine: noop, + $setSubmitted: noop +}, +SUBMITTED_CLASS = 'ng-submitted'; + +function nullFormRenameControl(control, name) { + control.$name = name; +} + +/** + * @ngdoc type + * @name form.FormController + * + * @property {boolean} $pristine True if user has not interacted with the form yet. + * @property {boolean} $dirty True if user has already interacted with the form. + * @property {boolean} $valid True if all of the containing forms and controls are valid. + * @property {boolean} $invalid True if at least one containing control or form is invalid. + * @property {boolean} $pending True if at least one containing control or form is pending. + * @property {boolean} $submitted True if user has submitted the form even if its invalid. + * + * @property {Object} $error Is an object hash, containing references to controls or + * forms with failing validators, where: + * + * - keys are validation tokens (error names), + * - values are arrays of controls or forms that have a failing validator for given error name. + * + * Built-in validation tokens: + * + * - `email` + * - `max` + * - `maxlength` + * - `min` + * - `minlength` + * - `number` + * - `pattern` + * - `required` + * - `url` + * - `date` + * - `datetimelocal` + * - `time` + * - `week` + * - `month` + * + * @description + * `FormController` keeps track of all its controls and nested forms as well as the state of them, + * such as being valid/invalid or dirty/pristine. + * + * Each {@link ng.directive:form form} directive creates an instance + * of `FormController`. + * + */ +//asks for $scope to fool the BC controller module +FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; +function FormController(element, attrs, $scope, $animate, $interpolate) { + var form = this, + controls = []; + + // init state + form.$error = {}; + form.$$success = {}; + form.$pending = undefined; + form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); + form.$dirty = false; + form.$pristine = true; + form.$valid = true; + form.$invalid = false; + form.$submitted = false; + form.$$parentForm = nullFormCtrl; + + /** + * @ngdoc method + * @name form.FormController#$rollbackViewValue + * + * @description + * Rollback all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is typically needed by the reset button of + * a form that uses `ng-model-options` to pend updates. + */ + form.$rollbackViewValue = function() { + forEach(controls, function(control) { + control.$rollbackViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$commitViewValue + * + * @description + * Commit all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` + * usually handles calling this in response to input events. + */ + form.$commitViewValue = function() { + forEach(controls, function(control) { + control.$commitViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$addControl + * @param {object} control control object, either a {@link form.FormController} or an + * {@link ngModel.NgModelController} + * + * @description + * Register a control with the form. Input elements using ngModelController do this automatically + * when they are linked. + * + * Note that the current state of the control will not be reflected on the new parent form. This + * is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine` + * state. + * + * However, if the method is used programmatically, for example by adding dynamically created controls, + * or controls that have been previously removed without destroying their corresponding DOM element, + * it's the developers responsibility to make sure the current state propagates to the parent form. + * + * For example, if an input control is added that is already `$dirty` and has `$error` properties, + * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form. + */ + form.$addControl = function(control) { + // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored + // and not added to the scope. Now we throw an error. + assertNotHasOwnProperty(control.$name, 'input'); + controls.push(control); + + if (control.$name) { + form[control.$name] = control; + } + + control.$$parentForm = form; + }; + + // Private API: rename a form control + form.$$renameControl = function(control, newName) { + var oldName = control.$name; + + if (form[oldName] === control) { + delete form[oldName]; + } + form[newName] = control; + control.$name = newName; + }; + + /** + * @ngdoc method + * @name form.FormController#$removeControl + * @param {object} control control object, either a {@link form.FormController} or an + * {@link ngModel.NgModelController} + * + * @description + * Deregister a control from the form. + * + * Input elements using ngModelController do this automatically when they are destroyed. + * + * Note that only the removed control's validation state (`$errors`etc.) will be removed from the + * form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be + * different from case to case. For example, removing the only `$dirty` control from a form may or + * may not mean that the form is still `$dirty`. + */ + form.$removeControl = function(control) { + if (control.$name && form[control.$name] === control) { + delete form[control.$name]; + } + forEach(form.$pending, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$error, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$$success, function(value, name) { + form.$setValidity(name, null, control); + }); + + arrayRemove(controls, control); + control.$$parentForm = nullFormCtrl; + }; + + + /** + * @ngdoc method + * @name form.FormController#$setValidity + * + * @description + * Sets the validity of a form control. + * + * This method will also propagate to parent forms. + */ + addSetValidityMethod({ + ctrl: this, + $element: element, + set: function(object, property, controller) { + var list = object[property]; + if (!list) { + object[property] = [controller]; + } else { + var index = list.indexOf(controller); + if (index === -1) { + list.push(controller); + } + } + }, + unset: function(object, property, controller) { + var list = object[property]; + if (!list) { + return; + } + arrayRemove(list, controller); + if (list.length === 0) { + delete object[property]; + } + }, + $animate: $animate + }); + + /** + * @ngdoc method + * @name form.FormController#$setDirty + * + * @description + * Sets the form to a dirty state. + * + * This method can be called to add the 'ng-dirty' class and set the form to a dirty + * state (ng-dirty class). This method will also propagate to parent forms. + */ + form.$setDirty = function() { + $animate.removeClass(element, PRISTINE_CLASS); + $animate.addClass(element, DIRTY_CLASS); + form.$dirty = true; + form.$pristine = false; + form.$$parentForm.$setDirty(); + }; + + /** + * @ngdoc method + * @name form.FormController#$setPristine + * + * @description + * Sets the form to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the form to its pristine + * state (ng-pristine class). This method will also propagate to all the controls contained + * in this form. + * + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after + * saving or resetting it. + */ + form.$setPristine = function() { + $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); + form.$dirty = false; + form.$pristine = true; + form.$submitted = false; + forEach(controls, function(control) { + control.$setPristine(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setUntouched + * + * @description + * Sets the form to its untouched state. + * + * This method can be called to remove the 'ng-touched' class and set the form controls to their + * untouched state (ng-untouched class). + * + * Setting a form controls back to their untouched state is often useful when setting the form + * back to its pristine state. + */ + form.$setUntouched = function() { + forEach(controls, function(control) { + control.$setUntouched(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setSubmitted + * + * @description + * Sets the form to its submitted state. + */ + form.$setSubmitted = function() { + $animate.addClass(element, SUBMITTED_CLASS); + form.$submitted = true; + form.$$parentForm.$setSubmitted(); + }; +} + +/** + * @ngdoc directive + * @name ngForm + * @restrict EAC + * + * @description + * Nestable alias of {@link ng.directive:form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * Note: the purpose of `ngForm` is to group controls, + * but not to be a replacement for the `
` tag with all of its capabilities + * (e.g. posting to the server, ...). + * + * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive + * @name form + * @restrict E + * + * @description + * Directive that instantiates + * {@link form.FormController FormController}. + * + * If the `name` attribute is specified, the form controller is published onto the current scope under + * this name. + * + * # Alias: {@link ng.directive:ngForm `ngForm`} + * + * In Angular, forms can be nested. This means that the outer form is valid when all of the child + * forms are valid as well. However, browsers do not allow nesting of `` elements, so + * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to + * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group + * of controls needs to be determined. + * + * # CSS classes + * - `ng-valid` is set if the form is valid. + * - `ng-invalid` is set if the form is invalid. + * - `ng-pending` is set if the form is pending. + * - `ng-pristine` is set if the form is pristine. + * - `ng-dirty` is set if the form is dirty. + * - `ng-submitted` is set if the form was submitted. + * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + * + * + * # Submitting a form and preventing the default action + * + * Since the role of forms in client-side Angular applications is different than in classical + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full + * page reload that sends the data to the server. Instead some javascript logic should be triggered + * to handle the form submission in an application-specific way. + * + * For this reason, Angular prevents the default action (form submission to the server) unless the + * `` element has an `action` attribute specified. + * + * You can use one of the following two ways to specify what javascript method should be called when + * a form is submitted: + * + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element + * - {@link ng.directive:ngClick ngClick} directive on the first + * button or input field of type submit (input[type=submit]) + * + * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} + * or {@link ng.directive:ngClick ngClick} directives. + * This is because of the following form submission rules in the HTML specification: + * + * - If a form has only one input field then hitting enter in this field triggers form submit + * (`ngSubmit`) + * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter + * doesn't trigger submit + * - if a form has one or more input fields and one or more buttons or input[type=submit] then + * hitting enter in any of the input fields will trigger the click handler on the *first* button or + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) + * + * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is + * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` + * to have access to the updated model. + * + * ## Animation Hooks + * + * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. + * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any + * other validations that are performed within the form. Animations in ngForm are similar to how + * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well + * as JS animations. + * + * The following example shows a simple way to utilize CSS transitions to style a form element + * that has been rendered as invalid after it has been validated: + * + *
+ * //be sure to include ngAnimate as a module to hook into more
+ * //advanced animations
+ * .my-form {
+ *   transition:0.5s linear all;
+ *   background: white;
+ * }
+ * .my-form.ng-invalid {
+ *   background: red;
+ *   color:white;
+ * }
+ * 
+ * + * @example + + + + + + userType: + Required!
+ userType = {{userType}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ +
+ + it('should initialize to model', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + + expect(userType.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + var userInput = element(by.model('userType')); + + userInput.clear(); + userInput.sendKeys(''); + + expect(userType.getText()).toEqual('userType ='); + expect(valid.getText()).toContain('false'); + }); + +
+ * + * @param {string=} name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + */ +var formDirectiveFactory = function(isNgForm) { + return ['$timeout', '$parse', function($timeout, $parse) { + var formDirective = { + name: 'form', + restrict: isNgForm ? 'EAC' : 'E', + require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form + controller: FormController, + compile: function ngFormCompile(formElement, attr) { + // Setup initial state of the control + formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); + + var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false); + + return { + pre: function ngFormPreLink(scope, formElement, attr, ctrls) { + var controller = ctrls[0]; + + // if `action` attr is not present on the form, prevent the default action (submission) + if (!('action' in attr)) { + // we can't use jq events because if a form is destroyed during submission the default + // action is not prevented. see #1238 + // + // IE 9 is not affected because it doesn't fire a submit event and try to do a full + // page reload if the form was destroyed by submission of the form via a click handler + // on a button in the form. Looks like an IE9 specific bug. + var handleFormSubmission = function(event) { + scope.$apply(function() { + controller.$commitViewValue(); + controller.$setSubmitted(); + }); + + event.preventDefault(); + }; + + addEventListenerFn(formElement[0], 'submit', handleFormSubmission); + + // unregister the preventDefault listener so that we don't not leak memory but in a + // way that will achieve the prevention of the default action. + formElement.on('$destroy', function() { + $timeout(function() { + removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); + }, 0, false); + }); + } + + var parentFormCtrl = ctrls[1] || controller.$$parentForm; + parentFormCtrl.$addControl(controller); + + var setter = nameAttr ? getSetter(controller.$name) : noop; + + if (nameAttr) { + setter(scope, controller); + attr.$observe(nameAttr, function(newValue) { + if (controller.$name === newValue) return; + setter(scope, undefined); + controller.$$parentForm.$$renameControl(controller, newValue); + setter = getSetter(controller.$name); + setter(scope, controller); + }); + } + formElement.on('$destroy', function() { + controller.$$parentForm.$removeControl(controller); + setter(scope, undefined); + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards + }); + } + }; + } + }; + + return formDirective; + + function getSetter(expression) { + if (expression === '') { + //create an assignable expression, so forms with an empty name can be renamed later + return $parse('this[""]').assign; + } + return $parse(expression).assign || noop; + } + }]; +}; + +var formDirective = formDirectiveFactory(); +var ngFormDirective = formDirectiveFactory(true); + +/* global VALID_CLASS: false, + INVALID_CLASS: false, + PRISTINE_CLASS: false, + DIRTY_CLASS: false, + UNTOUCHED_CLASS: false, + TOUCHED_CLASS: false, + ngModelMinErr: false, +*/ + +// Regex code was initially obtained from SO prior to modification: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 +var ISO_DATE_REGEXP = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/; +// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987) +// Note: We are being more lenient, because browsers are too. +// 1. Scheme +// 2. Slashes +// 3. Username +// 4. Password +// 5. Hostname +// 6. Port +// 7. Path +// 8. Query +// 9. Fragment +// 1111111111111111 222 333333 44444 555555555555555555555555 666 77777777 8888888 999 +var URL_REGEXP = /^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i; +/* jshint maxlen:220 */ +var EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/; +/* jshint maxlen:200 */ +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; +var DATE_REGEXP = /^(\d{4,})-(\d{2})-(\d{2})$/; +var DATETIMELOCAL_REGEXP = /^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; +var WEEK_REGEXP = /^(\d{4,})-W(\d\d)$/; +var MONTH_REGEXP = /^(\d{4,})-(\d\d)$/; +var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; + +var PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown'; +var PARTIAL_VALIDATION_TYPES = createMap(); +forEach('date,datetime-local,month,time,week'.split(','), function(type) { + PARTIAL_VALIDATION_TYPES[type] = true; +}); + +var inputType = { + + /** + * @ngdoc input + * @name input[text] + * + * @description + * Standard HTML text input with angular data binding, inherited by most of the `input` elements. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Adds `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
+ +
+ + Required! + + Single word only! +
+ text = {{example.text}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var text = element(by.binding('example.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if multi word', function() { + input.clear(); + input.sendKeys('hello world'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'text': textInputType, + + /** + * @ngdoc input + * @name input[date] + * + * @description + * Input with date validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 + * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many + * modern browsers do not yet support this input type, it is important to provide cues to users on the + * expected input format via a placeholder or label. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute + * (e.g. `min="{{minDate | date:'yyyy-MM-dd'}}"`). Note that `min` will also add native HTML5 + * constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute + * (e.g. `max="{{maxDate | date:'yyyy-MM-dd'}}"`). Note that `max` will also add native HTML5 + * constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-MM-dd"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (see https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10-22'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'date': createDateInputType('date', DATE_REGEXP, + createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), + 'yyyy-MM-dd'), + + /** + * @ngdoc input + * @name input[datetime-local] + * + * @description + * Input with datetime validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation + * inside this attribute (e.g. `min="{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). + * Note that `min` will also add native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation + * inside this attribute (e.g. `max="{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). + * Note that `max` will also add native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2010-12-28T14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01T23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, + createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), + 'yyyy-MM-ddTHH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[time] + * + * @description + * Input with time validation and transformation. In browsers that do not yet support + * the HTML5 time input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a + * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this + * attribute (e.g. `min="{{minTime | date:'HH:mm:ss'}}"`). Note that `min` will also add + * native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this + * attribute (e.g. `max="{{maxTime | date:'HH:mm:ss'}}"`). Note that `max` will also add + * native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the + * `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the + * `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "HH:mm:ss"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "HH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'time': createDateInputType('time', TIME_REGEXP, + createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), + 'HH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[week] + * + * @description + * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support + * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * week format (yyyy-W##), for example: `2013-W02`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this + * attribute (e.g. `min="{{minWeek | date:'yyyy-Www'}}"`). Note that `min` will also add + * native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this + * attribute (e.g. `max="{{maxWeek | date:'yyyy-Www'}}"`). Note that `max` will also add + * native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-Www"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-Www"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-W01'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-W01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), + + /** + * @ngdoc input + * @name input[month] + * + * @description + * Input with month validation and transformation. In browsers that do not yet support + * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * month format (yyyy-MM), for example: `2009-01`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * If the model is not set to the first of the month, the next view to model update will set it + * to the first of the month. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this + * attribute (e.g. `min="{{minMonth | date:'yyyy-MM'}}"`). Note that `min` will also add + * native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this + * attribute (e.g. `max="{{maxMonth | date:'yyyy-MM'}}"`). Note that `max` will also add + * native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid month! +
+ value = {{example.value | date: "yyyy-MM"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'month': createDateInputType('month', MONTH_REGEXP, + createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), + 'yyyy-MM'), + + /** + * @ngdoc input + * @name input[number] + * + * @description + * Text input with number validation and transformation. Sets the `number` validation + * error if not a valid number. + * + *
+ * The model must always be of type `number` otherwise Angular will throw an error. + * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt} + * error docs for more information and an example of how to convert your model if necessary. + *
+ * + * ## Issues with HTML5 constraint validation + * + * In browsers that follow the + * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29), + * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}. + * If a non-number is entered in the input, the browser will report the value as an empty string, + * which means the view / model values in `ngModel` and subsequently the scope value + * will also be an empty string. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not valid number! +
+ value = {{example.value}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + it('should initialize to model', function() { + expect(value.getText()).toContain('12'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if over max', function() { + input.clear(); + input.sendKeys('123'); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'number': numberInputType, + + + /** + * @ngdoc input + * @name input[url] + * + * @description + * Text input with URL validation. Sets the `url` validation error key if the content is not a + * valid URL. + * + *
+ * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex + * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify + * the built-in validators (see the {@link guide/forms Forms guide}) + *
+ * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+
+ + var text = element(by.binding('url.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('url.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('http://google.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not url', function() { + input.clear(); + input.sendKeys('box'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'url': urlInputType, + + + /** + * @ngdoc input + * @name input[email] + * + * @description + * Text input with email validation. Sets the `email` validation error key if not a valid email + * address. + * + *
+ * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex + * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can + * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) + *
+ * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not valid email! +
+ text = {{email.text}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ myForm.$error.email = {{!!myForm.$error.email}}
+
+
+ + var text = element(by.binding('email.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('email.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('me@example.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not email', function() { + input.clear(); + input.sendKeys('xxx'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'email': emailInputType, + + + /** + * @ngdoc input + * @name input[radio] + * + * @description + * HTML radio button. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string} value The value to which the `ngModel` expression should be set when selected. + * Note that `value` only supports `string` values, i.e. the scope model needs to be a string, + * too. Use `ngValue` if you need complex models (`number`, `object`, ...). + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio + * is selected. Should be used instead of the `value` attribute if you need + * a non-string `ngModel` (`boolean`, `array`, ...). + * + * @example + + + +
+
+
+
+ color = {{color.name | json}}
+
+ Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. +
+ + it('should change state', function() { + var color = element(by.binding('color.name')); + + expect(color.getText()).toContain('blue'); + + element.all(by.model('color.name')).get(0).click(); + + expect(color.getText()).toContain('red'); + }); + +
+ */ + 'radio': radioInputType, + + + /** + * @ngdoc input + * @name input[checkbox] + * + * @description + * HTML checkbox. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {expression=} ngTrueValue The value to which the expression should be set when selected. + * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+
+
+ value1 = {{checkboxModel.value1}}
+ value2 = {{checkboxModel.value2}}
+
+
+ + it('should change state', function() { + var value1 = element(by.binding('checkboxModel.value1')); + var value2 = element(by.binding('checkboxModel.value2')); + + expect(value1.getText()).toContain('true'); + expect(value2.getText()).toContain('YES'); + + element(by.model('checkboxModel.value1')).click(); + element(by.model('checkboxModel.value2')).click(); + + expect(value1.getText()).toContain('false'); + expect(value2.getText()).toContain('NO'); + }); + +
+ */ + 'checkbox': checkboxInputType, + + 'hidden': noop, + 'button': noop, + 'submit': noop, + 'reset': noop, + 'file': noop +}; + +function stringBasedInputType(ctrl) { + ctrl.$formatters.push(function(value) { + return ctrl.$isEmpty(value) ? value : value.toString(); + }); +} + +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); +} + +function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { + var type = lowercase(element[0].type); + + // In composition mode, users are still inputing intermediate text buffer, + // hold the listener until composition is done. + // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent + if (!$sniffer.android) { + var composing = false; + + element.on('compositionstart', function() { + composing = true; + }); + + element.on('compositionend', function() { + composing = false; + listener(); + }); + } + + var timeout; + + var listener = function(ev) { + if (timeout) { + $browser.defer.cancel(timeout); + timeout = null; + } + if (composing) return; + var value = element.val(), + event = ev && ev.type; + + // By default we will trim the value + // If the attribute ng-trim exists we will avoid trimming + // If input type is 'password', the value is never trimmed + if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { + value = trim(value); + } + + // If a control is suffering from bad input (due to native validators), browsers discard its + // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the + // control's value is the same empty value twice in a row. + if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { + ctrl.$setViewValue(value, event); + } + }; + + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the + // input event on backspace, delete or cut + if ($sniffer.hasEvent('input')) { + element.on('input', listener); + } else { + var deferListener = function(ev, input, origValue) { + if (!timeout) { + timeout = $browser.defer(function() { + timeout = null; + if (!input || input.value !== origValue) { + listener(ev); + } + }); + } + }; + + element.on('keydown', function(event) { + var key = event.keyCode; + + // ignore + // command modifiers arrows + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; + + deferListener(event, this, this.value); + }); + + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it + if ($sniffer.hasEvent('paste')) { + element.on('paste cut', deferListener); + } + } + + // if user paste into input using mouse on older browser + // or form autocomplete on newer browser, we need "change" event to catch it + element.on('change', listener); + + // Some native input types (date-family) have the ability to change validity without + // firing any input/change events. + // For these event types, when native validators are present and the browser supports the type, + // check for validity changes on various DOM events. + if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) { + element.on(PARTIAL_VALIDATION_EVENTS, function(ev) { + if (!timeout) { + var validity = this[VALIDITY_STATE_PROPERTY]; + var origBadInput = validity.badInput; + var origTypeMismatch = validity.typeMismatch; + timeout = $browser.defer(function() { + timeout = null; + if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) { + listener(ev); + } + }); + } + }); + } + + ctrl.$render = function() { + // Workaround for Firefox validation #12102. + var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue; + if (element.val() !== value) { + element.val(value); + } + }; +} + +function weekParser(isoWeek, existingDate) { + if (isDate(isoWeek)) { + return isoWeek; + } + + if (isString(isoWeek)) { + WEEK_REGEXP.lastIndex = 0; + var parts = WEEK_REGEXP.exec(isoWeek); + if (parts) { + var year = +parts[1], + week = +parts[2], + hours = 0, + minutes = 0, + seconds = 0, + milliseconds = 0, + firstThurs = getFirstThursdayOfYear(year), + addDays = (week - 1) * 7; + + if (existingDate) { + hours = existingDate.getHours(); + minutes = existingDate.getMinutes(); + seconds = existingDate.getSeconds(); + milliseconds = existingDate.getMilliseconds(); + } + + return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); + } + } + + return NaN; +} + +function createDateParser(regexp, mapping) { + return function(iso, date) { + var parts, map; + + if (isDate(iso)) { + return iso; + } + + if (isString(iso)) { + // When a date is JSON'ified to wraps itself inside of an extra + // set of double quotes. This makes the date parsing code unable + // to match the date string and parse it as a date. + if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { + iso = iso.substring(1, iso.length - 1); + } + if (ISO_DATE_REGEXP.test(iso)) { + return new Date(iso); + } + regexp.lastIndex = 0; + parts = regexp.exec(iso); + + if (parts) { + parts.shift(); + if (date) { + map = { + yyyy: date.getFullYear(), + MM: date.getMonth() + 1, + dd: date.getDate(), + HH: date.getHours(), + mm: date.getMinutes(), + ss: date.getSeconds(), + sss: date.getMilliseconds() / 1000 + }; + } else { + map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; + } + + forEach(parts, function(part, index) { + if (index < mapping.length) { + map[mapping[index]] = +part; + } + }); + return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); + } + } + + return NaN; + }; +} + +function createDateInputType(type, regexp, parseDate, format) { + return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; + var previousDate; + + ctrl.$$parserName = type; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (regexp.test(value)) { + // Note: We cannot read ctrl.$modelValue, as there might be a different + // parser/formatter in the processing chain so that the model + // contains some different data format! + var parsedDate = parseDate(value, previousDate); + if (timezone) { + parsedDate = convertTimezoneToLocal(parsedDate, timezone); + } + return parsedDate; + } + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (value && !isDate(value)) { + throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); + } + if (isValidDate(value)) { + previousDate = value; + if (previousDate && timezone) { + previousDate = convertTimezoneToLocal(previousDate, timezone, true); + } + return $filter('date')(value, format, timezone); + } else { + previousDate = null; + return ''; + } + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; + }; + attr.$observe('min', function(val) { + minVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; + }; + attr.$observe('max', function(val) { + maxVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + function isValidDate(value) { + // Invalid Date: getTime() returns NaN + return value && !(value.getTime && value.getTime() !== value.getTime()); + } + + function parseObservedDateValue(val) { + return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val; + } + }; +} + +function badInputChecker(scope, element, attr, ctrl) { + var node = element[0]; + var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); + if (nativeValidation) { + ctrl.$parsers.push(function(value) { + var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; + return validity.badInput || validity.typeMismatch ? undefined : value; + }); + } +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + + ctrl.$$parserName = 'number'; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (NUMBER_REGEXP.test(value)) return parseFloat(value); + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (!ctrl.$isEmpty(value)) { + if (!isNumber(value)) { + throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); + } + value = value.toString(); + } + return value; + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; + }; + + attr.$observe('min', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val); + } + minVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; + }; + + attr.$observe('max', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val); + } + maxVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } +} + +function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'url'; + ctrl.$validators.url = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || URL_REGEXP.test(value); + }; +} + +function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'email'; + ctrl.$validators.email = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); + }; +} + +function radioInputType(scope, element, attr, ctrl) { + // make the name unique, if not defined + if (isUndefined(attr.name)) { + element.attr('name', nextUid()); + } + + var listener = function(ev) { + if (element[0].checked) { + ctrl.$setViewValue(attr.value, ev && ev.type); + } + }; + + element.on('click', listener); + + ctrl.$render = function() { + var value = attr.value; + element[0].checked = (value == ctrl.$viewValue); + }; + + attr.$observe('value', ctrl.$render); +} + +function parseConstantExpr($parse, context, name, expression, fallback) { + var parseFn; + if (isDefined(expression)) { + parseFn = $parse(expression); + if (!parseFn.constant) { + throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' + + '`{1}`.', name, expression); + } + return parseFn(context); + } + return fallback; +} + +function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { + var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); + var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); + + var listener = function(ev) { + ctrl.$setViewValue(element[0].checked, ev && ev.type); + }; + + element.on('click', listener); + + ctrl.$render = function() { + element[0].checked = ctrl.$viewValue; + }; + + // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` + // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert + // it to a boolean. + ctrl.$isEmpty = function(value) { + return value === false; + }; + + ctrl.$formatters.push(function(value) { + return equals(value, trueValue); + }); + + ctrl.$parsers.push(function(value) { + return value ? trueValue : falseValue; + }); +} + + +/** + * @ngdoc directive + * @name textarea + * @restrict E + * + * @description + * HTML textarea element control with angular data-binding. The data-binding and validation + * properties of this element are exactly the same as those of the + * {@link ng.directive:input input element}. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + */ + + +/** + * @ngdoc directive + * @name input + * @restrict E + * + * @description + * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, + * input state control, and validation. + * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. + * + *
+ * **Note:** Not every feature offered is available for all input types. + * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. + *
+ * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {boolean=} ngRequired Sets `required` attribute if set to true + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * value does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
+
+ +
+ + Required! +
+ +
+ + Too short! + + Too long! +
+
+
+ user = {{user}}
+ myForm.userName.$valid = {{myForm.userName.$valid}}
+ myForm.userName.$error = {{myForm.userName.$error}}
+ myForm.lastName.$valid = {{myForm.lastName.$valid}}
+ myForm.lastName.$error = {{myForm.lastName.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ myForm.$error.minlength = {{!!myForm.$error.minlength}}
+ myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
+
+
+ + var user = element(by.exactBinding('user')); + var userNameValid = element(by.binding('myForm.userName.$valid')); + var lastNameValid = element(by.binding('myForm.lastName.$valid')); + var lastNameError = element(by.binding('myForm.lastName.$error')); + var formValid = element(by.binding('myForm.$valid')); + var userNameInput = element(by.model('user.name')); + var userLastInput = element(by.model('user.last')); + + it('should initialize to model', function() { + expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); + expect(userNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if empty when required', function() { + userNameInput.clear(); + userNameInput.sendKeys(''); + + expect(user.getText()).toContain('{"last":"visitor"}'); + expect(userNameValid.getText()).toContain('false'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be valid if empty when min length is set', function() { + userLastInput.clear(); + userLastInput.sendKeys(''); + + expect(user.getText()).toContain('{"name":"guest","last":""}'); + expect(lastNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if less than required min length', function() { + userLastInput.clear(); + userLastInput.sendKeys('xx'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('minlength'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be invalid if longer than max length', function() { + userLastInput.clear(); + userLastInput.sendKeys('some ridiculously long name'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('maxlength'); + expect(formValid.getText()).toContain('false'); + }); + +
+ */ +var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', + function($browser, $sniffer, $filter, $parse) { + return { + restrict: 'E', + require: ['?ngModel'], + link: { + pre: function(scope, element, attr, ctrls) { + if (ctrls[0]) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, + $browser, $filter, $parse); + } + } + } + }; +}]; + + + +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; +/** + * @ngdoc directive + * @name ngValue + * + * @description + * Binds the given expression to the value of `
+ + + it('should show correct pluralized string', function() { + var withoutOffset = element.all(by.css('ng-pluralize')).get(0); + var withOffset = element.all(by.css('ng-pluralize')).get(1); + var countInput = element(by.model('personCount')); + + expect(withoutOffset.getText()).toEqual('1 person is viewing.'); + expect(withOffset.getText()).toEqual('Igor is viewing.'); + + countInput.clear(); + countInput.sendKeys('0'); + + expect(withoutOffset.getText()).toEqual('Nobody is viewing.'); + expect(withOffset.getText()).toEqual('Nobody is viewing.'); + + countInput.clear(); + countInput.sendKeys('2'); + + expect(withoutOffset.getText()).toEqual('2 people are viewing.'); + expect(withOffset.getText()).toEqual('Igor and Misko are viewing.'); + + countInput.clear(); + countInput.sendKeys('3'); + + expect(withoutOffset.getText()).toEqual('3 people are viewing.'); + expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.'); + + countInput.clear(); + countInput.sendKeys('4'); + + expect(withoutOffset.getText()).toEqual('4 people are viewing.'); + expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.'); + }); + it('should show data-bound names', function() { + var withOffset = element.all(by.css('ng-pluralize')).get(1); + var personCount = element(by.model('personCount')); + var person1 = element(by.model('person1')); + var person2 = element(by.model('person2')); + personCount.clear(); + personCount.sendKeys('4'); + person1.clear(); + person1.sendKeys('Di'); + person2.clear(); + person2.sendKeys('Vojta'); + expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.'); + }); + + + */ +var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, $interpolate, $log) { + var BRACE = /{}/g, + IS_WHEN = /^when(Minus)?(.+)$/; + + return { + link: function(scope, element, attr) { + var numberExp = attr.count, + whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs + offset = attr.offset || 0, + whens = scope.$eval(whenExp) || {}, + whensExpFns = {}, + startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol, + watchRemover = angular.noop, + lastCount; + + forEach(attr, function(expression, attributeName) { + var tmpMatch = IS_WHEN.exec(attributeName); + if (tmpMatch) { + var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]); + whens[whenKey] = element.attr(attr.$attr[attributeName]); + } + }); + forEach(whens, function(expression, key) { + whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement)); + + }); + + scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) { + var count = parseFloat(newVal); + var countIsNaN = isNaN(count); + + if (!countIsNaN && !(count in whens)) { + // If an explicit number rule such as 1, 2, 3... is defined, just use it. + // Otherwise, check it against pluralization rules in $locale service. + count = $locale.pluralCat(count - offset); + } + + // If both `count` and `lastCount` are NaN, we don't need to re-register a watch. + // In JS `NaN !== NaN`, so we have to explicitly check. + if ((count !== lastCount) && !(countIsNaN && isNumber(lastCount) && isNaN(lastCount))) { + watchRemover(); + var whenExpFn = whensExpFns[count]; + if (isUndefined(whenExpFn)) { + if (newVal != null) { + $log.debug("ngPluralize: no rule defined for '" + count + "' in " + whenExp); + } + watchRemover = noop; + updateElementText(); + } else { + watchRemover = scope.$watch(whenExpFn, updateElementText); + } + lastCount = count; + } + }); + + function updateElementText(newText) { + element.text(newText || ''); + } + } + }; +}]; + +/** + * @ngdoc directive + * @name ngRepeat + * @multiElement + * + * @description + * The `ngRepeat` directive instantiates a template once per item from a collection. Each template + * instance gets its own scope, where the given loop variable is set to the current collection item, + * and `$index` is set to the item index or key. + * + * Special properties are exposed on the local scope of each template instance, including: + * + * | Variable | Type | Details | + * |-----------|-----------------|-----------------------------------------------------------------------------| + * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) | + * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. | + * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. | + * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. | + * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). | + * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). | + * + *
+ * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}. + * This may be useful when, for instance, nesting ngRepeats. + *
+ * + * + * # Iterating over object properties + * + * It is possible to get `ngRepeat` to iterate over the properties of an object using the following + * syntax: + * + * ```js + *
...
+ * ``` + * + * However, there are a limitations compared to array iteration: + * + * - The JavaScript specification does not define the order of keys + * returned for an object, so Angular relies on the order returned by the browser + * when running `for key in myObj`. Browsers generally follow the strategy of providing + * keys in the order in which they were defined, although there are exceptions when keys are deleted + * and reinstated. See the + * [MDN page on `delete` for more info](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Cross-browser_notes). + * + * - `ngRepeat` will silently *ignore* object keys starting with `$`, because + * it's a prefix used by Angular for public (`$`) and private (`$$`) properties. + * + * - The built-in filters {@link ng.orderBy orderBy} and {@link ng.filter filter} do not work with + * objects, and will throw an error if used with one. + * + * If you are hitting any of these limitations, the recommended workaround is to convert your object into an array + * that is sorted into the order that you prefer before providing it to `ngRepeat`. You could + * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter) + * or implement a `$watch` on the object yourself. + * + * + * # Tracking and Duplicates + * + * `ngRepeat` uses {@link $rootScope.Scope#$watchCollection $watchCollection} to detect changes in + * the collection. When a change happens, ngRepeat then makes the corresponding changes to the DOM: + * + * * When an item is added, a new instance of the template is added to the DOM. + * * When an item is removed, its template instance is removed from the DOM. + * * When items are reordered, their respective templates are reordered in the DOM. + * + * To minimize creation of DOM elements, `ngRepeat` uses a function + * to "keep track" of all items in the collection and their corresponding DOM elements. + * For example, if an item is added to the collection, ngRepeat will know that all other items + * already have DOM elements, and will not re-render them. + * + * The default tracking function (which tracks items by their identity) does not allow + * duplicate items in arrays. This is because when there are duplicates, it is not possible + * to maintain a one-to-one mapping between collection items and DOM elements. + * + * If you do need to repeat duplicate items, you can substitute the default tracking behavior + * with your own using the `track by` expression. + * + * For example, you may track items by the index of each item in the collection, using the + * special scope property `$index`: + * ```html + *
+ * {{n}} + *
+ * ``` + * + * You may also use arbitrary expressions in `track by`, including references to custom functions + * on the scope: + * ```html + *
+ * {{n}} + *
+ * ``` + * + *
+ * If you are working with objects that have an identifier property, you should track + * by the identifier instead of the whole object. Should you reload your data later, `ngRepeat` + * will not have to rebuild the DOM elements for items it has already rendered, even if the + * JavaScript objects in the collection have been substituted for new ones. For large collections, + * this significantly improves rendering performance. If you don't have a unique identifier, + * `track by $index` can also provide a performance boost. + *
+ * ```html + *
+ * {{model.name}} + *
+ * ``` + * + * When no `track by` expression is provided, it is equivalent to tracking by the built-in + * `$id` function, which tracks items by their identity: + * ```html + *
+ * {{obj.prop}} + *
+ * ``` + * + *
+ * **Note:** `track by` must always be the last expression: + *
+ * ``` + *
+ * {{model.name}} + *
+ * ``` + * + * # Special repeat start and end points + * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending + * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively. + * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on) + * up to and including the ending HTML tag where **ng-repeat-end** is placed. + * + * The example below makes use of this feature: + * ```html + *
+ * Header {{ item }} + *
+ *
+ * Body {{ item }} + *
+ *
+ * Footer {{ item }} + *
+ * ``` + * + * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to: + * ```html + *
+ * Header A + *
+ *
+ * Body A + *
+ *
+ * Footer A + *
+ *
+ * Header B + *
+ *
+ * Body B + *
+ *
+ * Footer B + *
+ * ``` + * + * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such + * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**). + * + * @animations + * | Animation | Occurs | + * |----------------------------------|-------------------------------------| + * | {@link ng.$animate#enter enter} | when a new item is added to the list or when an item is revealed after a filter | + * | {@link ng.$animate#leave leave} | when an item is removed from the list or when an item is filtered out | + * | {@link ng.$animate#move move } | when an adjacent item is filtered out causing a reorder or when the item contents are reordered | + * + * See the example below for defining CSS animations with ngRepeat. + * + * @element ANY + * @scope + * @priority 1000 + * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These + * formats are currently supported: + * + * * `variable in expression` – where variable is the user defined loop variable and `expression` + * is a scope expression giving the collection to enumerate. + * + * For example: `album in artist.albums`. + * + * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers, + * and `expression` is the scope expression giving the collection to enumerate. + * + * For example: `(name, age) in {'adam':10, 'amalie':12}`. + * + * * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression + * which can be used to associate the objects in the collection with the DOM elements. If no tracking expression + * is specified, ng-repeat associates elements by identity. It is an error to have + * more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are + * mapped to the same DOM element, which is not possible.) + * + * Note that the tracking expression must come last, after any filters, and the alias expression. + * + * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements + * will be associated by item identity in the array. + * + * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique + * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements + * with the corresponding item in the array by identity. Moving the same object in array would move the DOM + * element in the same way in the DOM. + * + * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this + * case the object identity does not matter. Two objects are considered equivalent as long as their `id` + * property is same. + * + * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter + * to items in conjunction with a tracking expression. + * + * * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the + * intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message + * when a filter is active on the repeater, but the filtered result set is empty. + * + * For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after + * the items have been processed through the filter. + * + * Please note that `as [variable name] is not an operator but rather a part of ngRepeat micro-syntax so it can be used only at the end + * (and not as operator, inside an expression). + * + * For example: `item in items | filter : x | orderBy : order | limitTo : limit as results` . + * + * @example + * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed + * results by name. New (entering) and removed (leaving) items are animated. + + +
+ I have {{friends.length}} friends. They are: + +
    +
  • + [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old. +
  • +
  • + No results found... +
  • +
+
+
+ + angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) { + $scope.friends = [ + {name:'John', age:25, gender:'boy'}, + {name:'Jessie', age:30, gender:'girl'}, + {name:'Johanna', age:28, gender:'girl'}, + {name:'Joy', age:15, gender:'girl'}, + {name:'Mary', age:28, gender:'girl'}, + {name:'Peter', age:95, gender:'boy'}, + {name:'Sebastian', age:50, gender:'boy'}, + {name:'Erika', age:27, gender:'girl'}, + {name:'Patrick', age:40, gender:'boy'}, + {name:'Samantha', age:60, gender:'girl'} + ]; + }); + + + .example-animate-container { + background:white; + border:1px solid black; + list-style:none; + margin:0; + padding:0 10px; + } + + .animate-repeat { + line-height:30px; + list-style:none; + box-sizing:border-box; + } + + .animate-repeat.ng-move, + .animate-repeat.ng-enter, + .animate-repeat.ng-leave { + transition:all linear 0.5s; + } + + .animate-repeat.ng-leave.ng-leave-active, + .animate-repeat.ng-move, + .animate-repeat.ng-enter { + opacity:0; + max-height:0; + } + + .animate-repeat.ng-leave, + .animate-repeat.ng-move.ng-move-active, + .animate-repeat.ng-enter.ng-enter-active { + opacity:1; + max-height:30px; + } + + + var friends = element.all(by.repeater('friend in friends')); + + it('should render initial data set', function() { + expect(friends.count()).toBe(10); + expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.'); + expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.'); + expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.'); + expect(element(by.binding('friends.length')).getText()) + .toMatch("I have 10 friends. They are:"); + }); + + it('should update repeater when filter predicate changes', function() { + expect(friends.count()).toBe(10); + + element(by.model('q')).sendKeys('ma'); + + expect(friends.count()).toBe(2); + expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.'); + expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.'); + }); + +
+ */ +var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $animate, $compile) { + var NG_REMOVED = '$$NG_REMOVED'; + var ngRepeatMinErr = minErr('ngRepeat'); + + var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) { + // TODO(perf): generate setters to shave off ~40ms or 1-1.5% + scope[valueIdentifier] = value; + if (keyIdentifier) scope[keyIdentifier] = key; + scope.$index = index; + scope.$first = (index === 0); + scope.$last = (index === (arrayLength - 1)); + scope.$middle = !(scope.$first || scope.$last); + // jshint bitwise: false + scope.$odd = !(scope.$even = (index&1) === 0); + // jshint bitwise: true + }; + + var getBlockStart = function(block) { + return block.clone[0]; + }; + + var getBlockEnd = function(block) { + return block.clone[block.clone.length - 1]; + }; + + + return { + restrict: 'A', + multiElement: true, + transclude: 'element', + priority: 1000, + terminal: true, + $$tlb: true, + compile: function ngRepeatCompile($element, $attr) { + var expression = $attr.ngRepeat; + var ngRepeatEndComment = $compile.$$createComment('end ngRepeat', expression); + + var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); + + if (!match) { + throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", + expression); + } + + var lhs = match[1]; + var rhs = match[2]; + var aliasAs = match[3]; + var trackByExp = match[4]; + + match = lhs.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/); + + if (!match) { + throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.", + lhs); + } + var valueIdentifier = match[3] || match[1]; + var keyIdentifier = match[2]; + + if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) || + /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(aliasAs))) { + throw ngRepeatMinErr('badident', "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.", + aliasAs); + } + + var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn; + var hashFnLocals = {$id: hashKey}; + + if (trackByExp) { + trackByExpGetter = $parse(trackByExp); + } else { + trackByIdArrayFn = function(key, value) { + return hashKey(value); + }; + trackByIdObjFn = function(key) { + return key; + }; + } + + return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) { + + if (trackByExpGetter) { + trackByIdExpFn = function(key, value, index) { + // assign key, value, and $index to the locals so that they can be used in hash functions + if (keyIdentifier) hashFnLocals[keyIdentifier] = key; + hashFnLocals[valueIdentifier] = value; + hashFnLocals.$index = index; + return trackByExpGetter($scope, hashFnLocals); + }; + } + + // Store a list of elements from previous run. This is a hash where key is the item from the + // iterator, and the value is objects with following properties. + // - scope: bound scope + // - element: previous element. + // - index: position + // + // We are using no-proto object so that we don't need to guard against inherited props via + // hasOwnProperty. + var lastBlockMap = createMap(); + + //watch props + $scope.$watchCollection(rhs, function ngRepeatAction(collection) { + var index, length, + previousNode = $element[0], // node that cloned nodes should be inserted after + // initialized to the comment node anchor + nextNode, + // Same as lastBlockMap but it has the current state. It will become the + // lastBlockMap on the next iteration. + nextBlockMap = createMap(), + collectionLength, + key, value, // key/value of iteration + trackById, + trackByIdFn, + collectionKeys, + block, // last object information {scope, element, id} + nextBlockOrder, + elementsToRemove; + + if (aliasAs) { + $scope[aliasAs] = collection; + } + + if (isArrayLike(collection)) { + collectionKeys = collection; + trackByIdFn = trackByIdExpFn || trackByIdArrayFn; + } else { + trackByIdFn = trackByIdExpFn || trackByIdObjFn; + // if object, extract keys, in enumeration order, unsorted + collectionKeys = []; + for (var itemKey in collection) { + if (hasOwnProperty.call(collection, itemKey) && itemKey.charAt(0) !== '$') { + collectionKeys.push(itemKey); + } + } + } + + collectionLength = collectionKeys.length; + nextBlockOrder = new Array(collectionLength); + + // locate existing items + for (index = 0; index < collectionLength; index++) { + key = (collection === collectionKeys) ? index : collectionKeys[index]; + value = collection[key]; + trackById = trackByIdFn(key, value, index); + if (lastBlockMap[trackById]) { + // found previously seen block + block = lastBlockMap[trackById]; + delete lastBlockMap[trackById]; + nextBlockMap[trackById] = block; + nextBlockOrder[index] = block; + } else if (nextBlockMap[trackById]) { + // if collision detected. restore lastBlockMap and throw an error + forEach(nextBlockOrder, function(block) { + if (block && block.scope) lastBlockMap[block.id] = block; + }); + throw ngRepeatMinErr('dupes', + "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}", + expression, trackById, value); + } else { + // new never before seen block + nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined}; + nextBlockMap[trackById] = true; + } + } + + // remove leftover items + for (var blockKey in lastBlockMap) { + block = lastBlockMap[blockKey]; + elementsToRemove = getBlockNodes(block.clone); + $animate.leave(elementsToRemove); + if (elementsToRemove[0].parentNode) { + // if the element was not removed yet because of pending animation, mark it as deleted + // so that we can ignore it later + for (index = 0, length = elementsToRemove.length; index < length; index++) { + elementsToRemove[index][NG_REMOVED] = true; + } + } + block.scope.$destroy(); + } + + // we are not using forEach for perf reasons (trying to avoid #call) + for (index = 0; index < collectionLength; index++) { + key = (collection === collectionKeys) ? index : collectionKeys[index]; + value = collection[key]; + block = nextBlockOrder[index]; + + if (block.scope) { + // if we have already seen this object, then we need to reuse the + // associated scope/element + + nextNode = previousNode; + + // skip nodes that are already pending removal via leave animation + do { + nextNode = nextNode.nextSibling; + } while (nextNode && nextNode[NG_REMOVED]); + + if (getBlockStart(block) != nextNode) { + // existing item which got moved + $animate.move(getBlockNodes(block.clone), null, previousNode); + } + previousNode = getBlockEnd(block); + updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength); + } else { + // new item which we don't know about + $transclude(function ngRepeatTransclude(clone, scope) { + block.scope = scope; + // http://jsperf.com/clone-vs-createcomment + var endNode = ngRepeatEndComment.cloneNode(false); + clone[clone.length++] = endNode; + + $animate.enter(clone, null, previousNode); + previousNode = endNode; + // Note: We only need the first/last node of the cloned nodes. + // However, we need to keep the reference to the jqlite wrapper as it might be changed later + // by a directive with templateUrl when its template arrives. + block.clone = clone; + nextBlockMap[block.id] = block; + updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength); + }); + } + } + lastBlockMap = nextBlockMap; + }); + }; + } + }; +}]; + +var NG_HIDE_CLASS = 'ng-hide'; +var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate'; +/** + * @ngdoc directive + * @name ngShow + * @multiElement + * + * @description + * The `ngShow` directive shows or hides the given HTML element based on the expression + * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding + * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined + * in AngularJS and sets the display style to none (using an !important flag). + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). + * + * ```html + * + *
+ * + * + *
+ * ``` + * + * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class + * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed + * from the element causing the element not to appear hidden. + * + * ## Why is !important used? + * + * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector + * can be easily overridden by heavier selectors. For example, something as simple + * as changing the display style on a HTML list item would make hidden elements appear visible. + * This also becomes a bigger issue when dealing with CSS frameworks. + * + * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector + * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the + * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. + * + * ### Overriding `.ng-hide` + * + * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change + * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` + * class CSS. Note that the selector that needs to be used is actually `.ng-hide:not(.ng-hide-animate)` to cope + * with extra animation classes that can be added. + * + * ```css + * .ng-hide:not(.ng-hide-animate) { + * /* this is just another form of hiding an element */ + * display: block!important; + * position: absolute; + * top: -9999px; + * left: -9999px; + * } + * ``` + * + * By default you don't need to override in CSS anything and the animations will work around the display style. + * + * ## A note about animations with `ngShow` + * + * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression + * is true and false. This system works like the animation system present with ngClass except that + * you must also include the !important flag to override the display property + * so that you can perform an animation when the element is hidden during the time of the animation. + * + * ```css + * // + * //a working example can be found at the bottom of this page + * // + * .my-element.ng-hide-add, .my-element.ng-hide-remove { + * /* this is required as of 1.3x to properly + * apply all styling in a show/hide animation */ + * transition: 0s linear all; + * } + * + * .my-element.ng-hide-add-active, + * .my-element.ng-hide-remove-active { + * /* the transition is defined in the active class */ + * transition: 1s linear all; + * } + * + * .my-element.ng-hide-add { ... } + * .my-element.ng-hide-add.ng-hide-add-active { ... } + * .my-element.ng-hide-remove { ... } + * .my-element.ng-hide-remove.ng-hide-remove-active { ... } + * ``` + * + * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display + * property to block during animation states--ngAnimate will handle the style toggling automatically for you. + * + * @animations + * | Animation | Occurs | + * |----------------------------------|-------------------------------------| + * | {@link $animate#addClass addClass} `.ng-hide` | after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden | + * | {@link $animate#removeClass removeClass} `.ng-hide` | after the `ngShow` expression evaluates to a truthy value and just before contents are set to visible | + * + * @element ANY + * @param {expression} ngShow If the {@link guide/expression expression} is truthy + * then the element is shown or hidden respectively. + * + * @example + + + Click me:
+
+ Show: +
+ I show up when your checkbox is checked. +
+
+
+ Hide: +
+ I hide when your checkbox is checked. +
+
+
+ + @import url(../../components/bootstrap-3.1.1/css/bootstrap.css); + + + .animate-show { + line-height: 20px; + opacity: 1; + padding: 10px; + border: 1px solid black; + background: white; + } + + .animate-show.ng-hide-add, .animate-show.ng-hide-remove { + transition: all linear 0.5s; + } + + .animate-show.ng-hide { + line-height: 0; + opacity: 0; + padding: 0 10px; + } + + .check-element { + padding: 10px; + border: 1px solid black; + background: white; + } + + + var thumbsUp = element(by.css('span.glyphicon-thumbs-up')); + var thumbsDown = element(by.css('span.glyphicon-thumbs-down')); + + it('should check ng-show / ng-hide', function() { + expect(thumbsUp.isDisplayed()).toBeFalsy(); + expect(thumbsDown.isDisplayed()).toBeTruthy(); + + element(by.model('checked')).click(); + + expect(thumbsUp.isDisplayed()).toBeTruthy(); + expect(thumbsDown.isDisplayed()).toBeFalsy(); + }); + +
+ */ +var ngShowDirective = ['$animate', function($animate) { + return { + restrict: 'A', + multiElement: true, + link: function(scope, element, attr) { + scope.$watch(attr.ngShow, function ngShowWatchAction(value) { + // we're adding a temporary, animation-specific class for ng-hide since this way + // we can control when the element is actually displayed on screen without having + // to have a global/greedy CSS selector that breaks when other animations are run. + // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845 + $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, { + tempClasses: NG_HIDE_IN_PROGRESS_CLASS + }); + }); + } + }; +}]; + + +/** + * @ngdoc directive + * @name ngHide + * @multiElement + * + * @description + * The `ngHide` directive shows or hides the given HTML element based on the expression + * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding + * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined + * in AngularJS and sets the display style to none (using an !important flag). + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). + * + * ```html + * + *
+ * + * + *
+ * ``` + * + * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class + * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed + * from the element causing the element not to appear hidden. + * + * ## Why is !important used? + * + * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector + * can be easily overridden by heavier selectors. For example, something as simple + * as changing the display style on a HTML list item would make hidden elements appear visible. + * This also becomes a bigger issue when dealing with CSS frameworks. + * + * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector + * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the + * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. + * + * ### Overriding `.ng-hide` + * + * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change + * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` + * class in CSS: + * + * ```css + * .ng-hide { + * /* this is just another form of hiding an element */ + * display: block!important; + * position: absolute; + * top: -9999px; + * left: -9999px; + * } + * ``` + * + * By default you don't need to override in CSS anything and the animations will work around the display style. + * + * ## A note about animations with `ngHide` + * + * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression + * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide` + * CSS class is added and removed for you instead of your own CSS class. + * + * ```css + * // + * //a working example can be found at the bottom of this page + * // + * .my-element.ng-hide-add, .my-element.ng-hide-remove { + * transition: 0.5s linear all; + * } + * + * .my-element.ng-hide-add { ... } + * .my-element.ng-hide-add.ng-hide-add-active { ... } + * .my-element.ng-hide-remove { ... } + * .my-element.ng-hide-remove.ng-hide-remove-active { ... } + * ``` + * + * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display + * property to block during animation states--ngAnimate will handle the style toggling automatically for you. + * + * @animations + * | Animation | Occurs | + * |----------------------------------|-------------------------------------| + * | {@link $animate#addClass addClass} `.ng-hide` | after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden | + * | {@link $animate#removeClass removeClass} `.ng-hide` | after the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible | + * + * + * @element ANY + * @param {expression} ngHide If the {@link guide/expression expression} is truthy then + * the element is shown or hidden respectively. + * + * @example + + + Click me:
+
+ Show: +
+ I show up when your checkbox is checked. +
+
+
+ Hide: +
+ I hide when your checkbox is checked. +
+
+
+ + @import url(../../components/bootstrap-3.1.1/css/bootstrap.css); + + + .animate-hide { + transition: all linear 0.5s; + line-height: 20px; + opacity: 1; + padding: 10px; + border: 1px solid black; + background: white; + } + + .animate-hide.ng-hide { + line-height: 0; + opacity: 0; + padding: 0 10px; + } + + .check-element { + padding: 10px; + border: 1px solid black; + background: white; + } + + + var thumbsUp = element(by.css('span.glyphicon-thumbs-up')); + var thumbsDown = element(by.css('span.glyphicon-thumbs-down')); + + it('should check ng-show / ng-hide', function() { + expect(thumbsUp.isDisplayed()).toBeFalsy(); + expect(thumbsDown.isDisplayed()).toBeTruthy(); + + element(by.model('checked')).click(); + + expect(thumbsUp.isDisplayed()).toBeTruthy(); + expect(thumbsDown.isDisplayed()).toBeFalsy(); + }); + +
+ */ +var ngHideDirective = ['$animate', function($animate) { + return { + restrict: 'A', + multiElement: true, + link: function(scope, element, attr) { + scope.$watch(attr.ngHide, function ngHideWatchAction(value) { + // The comment inside of the ngShowDirective explains why we add and + // remove a temporary class for the show/hide animation + $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, { + tempClasses: NG_HIDE_IN_PROGRESS_CLASS + }); + }); + } + }; +}]; + +/** + * @ngdoc directive + * @name ngStyle + * @restrict AC + * + * @description + * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally. + * + * @knownIssue + * You should not use {@link guide/interpolation interpolation} in the value of the `style` + * attribute, when using the `ngStyle` directive on the same element. + * See {@link guide/interpolation#known-issues here} for more info. + * + * @element ANY + * @param {expression} ngStyle + * + * {@link guide/expression Expression} which evals to an + * object whose keys are CSS style names and values are corresponding values for those CSS + * keys. + * + * Since some CSS style names are not valid keys for an object, they must be quoted. + * See the 'background-color' style in the example below. + * + * @example + + + + + +
+ Sample Text +
myStyle={{myStyle}}
+
+ + span { + color: black; + } + + + var colorSpan = element(by.css('span')); + + it('should check ng-style', function() { + expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); + element(by.css('input[value=\'set color\']')).click(); + expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)'); + element(by.css('input[value=clear]')).click(); + expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); + }); + +
+ */ +var ngStyleDirective = ngDirective(function(scope, element, attr) { + scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { + if (oldStyles && (newStyles !== oldStyles)) { + forEach(oldStyles, function(val, style) { element.css(style, '');}); + } + if (newStyles) element.css(newStyles); + }, true); +}); + +/** + * @ngdoc directive + * @name ngSwitch + * @restrict EA + * + * @description + * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression. + * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location + * as specified in the template. + * + * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it + * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element + * matches the value obtained from the evaluated expression. In other words, you define a container element + * (where you place the directive), place an expression on the **`on="..."` attribute** + * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place + * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on + * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default + * attribute is displayed. + * + *
+ * Be aware that the attribute values to match against cannot be expressions. They are interpreted + * as literal string values to match against. + * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the + * value of the expression `$scope.someVal`. + *
+ + * @animations + * | Animation | Occurs | + * |----------------------------------|-------------------------------------| + * | {@link ng.$animate#enter enter} | after the ngSwitch contents change and the matched child element is placed inside the container | + * | {@link ng.$animate#leave leave} | after the ngSwitch contents change and just before the former contents are removed from the DOM | + * + * @usage + * + * ``` + * + * ... + * ... + * ... + * + * ``` + * + * + * @scope + * @priority 1200 + * @param {*} ngSwitch|on expression to match against ng-switch-when. + * On child elements add: + * + * * `ngSwitchWhen`: the case statement to match against. If match then this + * case will be displayed. If the same match appears multiple times, all the + * elements will be displayed. + * * `ngSwitchDefault`: the default case when no other case match. If there + * are multiple default cases, all of them will be displayed when no other + * case match. + * + * + * @example + + +
+ + selection={{selection}} +
+
+
Settings Div
+
Home Span
+
default
+
+
+
+ + angular.module('switchExample', ['ngAnimate']) + .controller('ExampleController', ['$scope', function($scope) { + $scope.items = ['settings', 'home', 'other']; + $scope.selection = $scope.items[0]; + }]); + + + .animate-switch-container { + position:relative; + background:white; + border:1px solid black; + height:40px; + overflow:hidden; + } + + .animate-switch { + padding:10px; + } + + .animate-switch.ng-animate { + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + } + + .animate-switch.ng-leave.ng-leave-active, + .animate-switch.ng-enter { + top:-50px; + } + .animate-switch.ng-leave, + .animate-switch.ng-enter.ng-enter-active { + top:0; + } + + + var switchElem = element(by.css('[ng-switch]')); + var select = element(by.model('selection')); + + it('should start in settings', function() { + expect(switchElem.getText()).toMatch(/Settings Div/); + }); + it('should change to home', function() { + select.all(by.css('option')).get(1).click(); + expect(switchElem.getText()).toMatch(/Home Span/); + }); + it('should select default', function() { + select.all(by.css('option')).get(2).click(); + expect(switchElem.getText()).toMatch(/default/); + }); + +
+ */ +var ngSwitchDirective = ['$animate', '$compile', function($animate, $compile) { + return { + require: 'ngSwitch', + + // asks for $scope to fool the BC controller module + controller: ['$scope', function ngSwitchController() { + this.cases = {}; + }], + link: function(scope, element, attr, ngSwitchController) { + var watchExpr = attr.ngSwitch || attr.on, + selectedTranscludes = [], + selectedElements = [], + previousLeaveAnimations = [], + selectedScopes = []; + + var spliceFactory = function(array, index) { + return function() { array.splice(index, 1); }; + }; + + scope.$watch(watchExpr, function ngSwitchWatchAction(value) { + var i, ii; + for (i = 0, ii = previousLeaveAnimations.length; i < ii; ++i) { + $animate.cancel(previousLeaveAnimations[i]); + } + previousLeaveAnimations.length = 0; + + for (i = 0, ii = selectedScopes.length; i < ii; ++i) { + var selected = getBlockNodes(selectedElements[i].clone); + selectedScopes[i].$destroy(); + var promise = previousLeaveAnimations[i] = $animate.leave(selected); + promise.then(spliceFactory(previousLeaveAnimations, i)); + } + + selectedElements.length = 0; + selectedScopes.length = 0; + + if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) { + forEach(selectedTranscludes, function(selectedTransclude) { + selectedTransclude.transclude(function(caseElement, selectedScope) { + selectedScopes.push(selectedScope); + var anchor = selectedTransclude.element; + caseElement[caseElement.length++] = $compile.$$createComment('end ngSwitchWhen'); + var block = { clone: caseElement }; + + selectedElements.push(block); + $animate.enter(caseElement, anchor.parent(), anchor); + }); + }); + } + }); + } + }; +}]; + +var ngSwitchWhenDirective = ngDirective({ + transclude: 'element', + priority: 1200, + require: '^ngSwitch', + multiElement: true, + link: function(scope, element, attrs, ctrl, $transclude) { + ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []); + ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element }); + } +}); + +var ngSwitchDefaultDirective = ngDirective({ + transclude: 'element', + priority: 1200, + require: '^ngSwitch', + multiElement: true, + link: function(scope, element, attr, ctrl, $transclude) { + ctrl.cases['?'] = (ctrl.cases['?'] || []); + ctrl.cases['?'].push({ transclude: $transclude, element: element }); + } +}); + +/** + * @ngdoc directive + * @name ngTransclude + * @restrict EAC + * + * @description + * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion. + * + * You can specify that you want to insert a named transclusion slot, instead of the default slot, by providing the slot name + * as the value of the `ng-transclude` or `ng-transclude-slot` attribute. + * + * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing + * content of this element will be removed before the transcluded content is inserted. + * If the transcluded content is empty, the existing content is left intact. This lets you provide fallback content in the case + * that no transcluded content is provided. + * + * @element ANY + * + * @param {string} ngTransclude|ngTranscludeSlot the name of the slot to insert at this point. If this is not provided, is empty + * or its value is the same as the name of the attribute then the default slot is used. + * + * @example + * ### Basic transclusion + * This example demonstrates basic transclusion of content into a component directive. + * + * + * + *
+ *
+ *
+ * {{text}} + *
+ *
+ * + * it('should have transcluded', function() { + * var titleElement = element(by.model('title')); + * titleElement.clear(); + * titleElement.sendKeys('TITLE'); + * var textElement = element(by.model('text')); + * textElement.clear(); + * textElement.sendKeys('TEXT'); + * expect(element(by.binding('title')).getText()).toEqual('TITLE'); + * expect(element(by.binding('text')).getText()).toEqual('TEXT'); + * }); + * + *
+ * + * @example + * ### Transclude fallback content + * This example shows how to use `NgTransclude` with fallback content, that + * is displayed if no transcluded content is provided. + * + * + * + * + * + * + * + * + * Button2 + * + * + * + * it('should have different transclude element content', function() { + * expect(element(by.id('fallback')).getText()).toBe('Button1'); + * expect(element(by.id('modified')).getText()).toBe('Button2'); + * }); + * + * + * + * @example + * ### Multi-slot transclusion + * This example demonstrates using multi-slot transclusion in a component directive. + * + * + * + *
+ *
+ *
+ * + * {{title}} + *

{{text}}

+ *
+ *
+ *
+ * + * angular.module('multiSlotTranscludeExample', []) + * .directive('pane', function(){ + * return { + * restrict: 'E', + * transclude: { + * 'title': '?paneTitle', + * 'body': 'paneBody', + * 'footer': '?paneFooter' + * }, + * template: '
' + + * '
Fallback Title
' + + * '
' + + * '' + + * '
' + * }; + * }) + * .controller('ExampleController', ['$scope', function($scope) { + * $scope.title = 'Lorem Ipsum'; + * $scope.link = "https://google.com"; + * $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...'; + * }]); + *
+ * + * it('should have transcluded the title and the body', function() { + * var titleElement = element(by.model('title')); + * titleElement.clear(); + * titleElement.sendKeys('TITLE'); + * var textElement = element(by.model('text')); + * textElement.clear(); + * textElement.sendKeys('TEXT'); + * expect(element(by.css('.title')).getText()).toEqual('TITLE'); + * expect(element(by.binding('text')).getText()).toEqual('TEXT'); + * expect(element(by.css('.footer')).getText()).toEqual('Fallback Footer'); + * }); + * + *
+ */ +var ngTranscludeMinErr = minErr('ngTransclude'); +var ngTranscludeDirective = ['$compile', function($compile) { + return { + restrict: 'EAC', + terminal: true, + compile: function ngTranscludeCompile(tElement) { + + // Remove and cache any original content to act as a fallback + var fallbackLinkFn = $compile(tElement.contents()); + tElement.empty(); + + return function ngTranscludePostLink($scope, $element, $attrs, controller, $transclude) { + + if (!$transclude) { + throw ngTranscludeMinErr('orphan', + 'Illegal use of ngTransclude directive in the template! ' + + 'No parent directive that requires a transclusion found. ' + + 'Element: {0}', + startingTag($element)); + } + + + // If the attribute is of the form: `ng-transclude="ng-transclude"` then treat it like the default + if ($attrs.ngTransclude === $attrs.$attr.ngTransclude) { + $attrs.ngTransclude = ''; + } + var slotName = $attrs.ngTransclude || $attrs.ngTranscludeSlot; + + // If the slot is required and no transclusion content is provided then this call will throw an error + $transclude(ngTranscludeCloneAttachFn, null, slotName); + + // If the slot is optional and no transclusion content is provided then use the fallback content + if (slotName && !$transclude.isSlotFilled(slotName)) { + useFallbackContent(); + } + + function ngTranscludeCloneAttachFn(clone, transcludedScope) { + if (clone.length) { + $element.append(clone); + } else { + useFallbackContent(); + // There is nothing linked against the transcluded scope since no content was available, + // so it should be safe to clean up the generated scope. + transcludedScope.$destroy(); + } + } + + function useFallbackContent() { + // Since this is the fallback content rather than the transcluded content, + // we link against the scope of this directive rather than the transcluded scope + fallbackLinkFn($scope, function(clone) { + $element.append(clone); + }); + } + }; + } + }; +}]; + +/** + * @ngdoc directive + * @name script + * @restrict E + * + * @description + * Load the content of a ` + + Load inlined template +
+ + + it('should load template defined inside script tag', function() { + element(by.css('#tpl-link')).click(); + expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/); + }); + + + */ +var scriptDirective = ['$templateCache', function($templateCache) { + return { + restrict: 'E', + terminal: true, + compile: function(element, attr) { + if (attr.type == 'text/ng-template') { + var templateUrl = attr.id, + text = element[0].text; + + $templateCache.put(templateUrl, text); + } + } + }; +}]; + +var noopNgModelController = { $setViewValue: noop, $render: noop }; + +function chromeHack(optionElement) { + // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459 + // Adding an

80@p))vKu&4!?^P>#N?RqG(_0rgC3AA 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 z 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 literal 0 HcmV?d00001 diff --git a/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class b/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class new file mode 100644 index 0000000000000000000000000000000000000000..ad93a31bec808658de1ea29d5c03075d9ba3f77c GIT binary patch literal 4587 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 literal 0 HcmV?d00001 diff --git a/contabilizei/target/classes/com/luan/dao/PedidoDAO.class b/contabilizei/target/classes/com/luan/dao/PedidoDAO.class new file mode 100644 index 0000000000000000000000000000000000000000..2f5b6921f756cb8e98925292a4722b37a43a1c77 GIT binary patch literal 368 zcmZ{g%}N775QJ-D%$h`#DCor(*adOGYeWc$AS@=Z;(f9+EE8sDV1Dv&9(({FO6;r> z50Xh91LJ?OJY9v90DeTLaaYy~&MHhj6>s5&xa z+6LvdXSmMGy|r~xnegkL7jF#HbqclcE9YNQtGwIs&&44J<$Be+t)kq^y!<;`MXzns zC60{_QTSIUU0}G#iytgSZFotmIm58hjTJF@#c=ZvxIc9Lfvls-C10y2ZOA*>*KoUg mWx&92M4bVBYULOM67(`ox;ezCn`4|3cSckX6H?Po&AtJhm0)N9 literal 0 HcmV?d00001 From a2dc537346b4cb94202d19be0d98c900db323f06 Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Fri, 29 Jul 2016 17:41:33 -0300 Subject: [PATCH 05/19] recuperando um pedido --- .../java/com/luan/dao/MongoDBPedidoDAO.java | 47 ++++--- .../src/main/java/com/luan/models/Pedido.java | 4 +- .../main/java/com/luan/tests/TestPedido.java | 119 +++++++++++++++++- .../com/luan/dao/MongoDBPedidoDAO.class | Bin 4587 -> 4810 bytes .../classes/com/luan/models/Pedido.class | Bin 2445 -> 2495 bytes .../classes/com/luan/tests/TestPedido.class | Bin 2174 -> 3133 bytes 6 files changed, 146 insertions(+), 24 deletions(-) diff --git a/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java index de8b7461..1866c8e6 100644 --- a/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java +++ b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java @@ -1,18 +1,17 @@ package com.luan.dao; -import java.text.ParseException; -import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; -import java.util.Locale; +import java.util.List; import com.luan.models.Cliente; import com.luan.models.Pedido; import com.luan.models.Produto; +import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.Cursor; import com.mongodb.DB; import com.mongodb.DBCollection; -import com.mongodb.DBObject; import com.mongodb.MongoClient; public class MongoDBPedidoDAO { @@ -35,7 +34,7 @@ public void inserir(Pedido pedido){ cliente.put("telefone", pedido.getCliente().getTelefone()); document.put("cliente", cliente); - BasicDBObject produtos = new BasicDBObject(); + BasicDBList produtos = new BasicDBList(); for(Produto produto : pedido.getProdutos()){ BasicDBObject p = new BasicDBObject(); p.put("codigo",produto.getCodigo()); @@ -43,7 +42,7 @@ public void inserir(Pedido pedido){ p.put("quantidade",produto.getQuantidade()); p.put("valor_unitario",produto.getValorUnitario()); - produtos.append("produto", p); + produtos.add(p); } document.put("produtos", produtos); @@ -59,17 +58,15 @@ public Pedido buscarPorNumero(int Numero){ Cursor cursor = colecao.find(query); try { while (cursor.hasNext()) { - DBObject o = new BasicDBObject(); - pedido.setNumero( Integer.parseInt((String) o.get("numero"))); - pedido.setValorTotal(Integer.parseInt((String) o.get("valor_total"))); + BasicDBObject obj = (BasicDBObject) cursor.next(); + + pedido.setNumero( obj.getInt("numero")); + pedido.setValorTotal( obj.getInt("valor_total")); - String dataDeEmissao = (String) o.get("data_emissao"); - try{ - Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); - pedido.setDataDeEmissao(date); - } catch ( ParseException pe) { } + Date dataDeEmissao = obj.getDate("data_emissao"); - BasicDBObject c = (BasicDBObject) o.get("cliente"); + pedido.setDataDeEmissao(dataDeEmissao); + BasicDBObject c = (BasicDBObject) obj.get("cliente"); Cliente cliente = new Cliente(); cliente.setCpf(c.getInt("cpf")); cliente.setNome(c.getString("nome")); @@ -77,12 +74,22 @@ public Pedido buscarPorNumero(int Numero){ cliente.setTelefone(c.getInt("telefone")); pedido.setCliente(cliente); - BasicDBObject[] ps = (BasicDBObject[]) o.get("produtos"); - for (BasicDBObject p : ps){ - //pegar produtos. produtos { [produto: {}}, {produto:{}} ] - } + BasicDBList produtosObj = (BasicDBList) obj.get("produtos"); + BasicDBObject[] ps = produtosObj.toArray(new BasicDBObject[0]); + List produtos = new ArrayList(); + for (BasicDBObject produtoObj : ps){ + Produto produto = new Produto(); + produto.setCodigo(produtoObj.getString("codigo")); + produto.setDescricao(produtoObj.getString("descricao")); + produto.setQuantidade(produtoObj.getInt("quantidade")); + produto.setValorUnitario(produtoObj.getInt("valor_unitario")); + + produtos.add(produto); + } + + pedido.setProdutos(produtos); + - //System.out.println(cursor.next()); } } finally { cursor.close(); diff --git a/contabilizei/src/main/java/com/luan/models/Pedido.java b/contabilizei/src/main/java/com/luan/models/Pedido.java index 867a1659..4dbcfc81 100644 --- a/contabilizei/src/main/java/com/luan/models/Pedido.java +++ b/contabilizei/src/main/java/com/luan/models/Pedido.java @@ -46,9 +46,9 @@ public void addProduto(Produto produto) { produtos.add(produto); } - public Produto getProduto(Produto produto){ + public Produto getProdutoByCodigo(String codigo){ for (Produto p : produtos) - if (p.getCodigo() == produto.getCodigo()) + if (p.getCodigo() == codigo) return p; return null; } diff --git a/contabilizei/src/main/java/com/luan/tests/TestPedido.java b/contabilizei/src/main/java/com/luan/tests/TestPedido.java index a38fc1b7..72fe80fc 100644 --- a/contabilizei/src/main/java/com/luan/tests/TestPedido.java +++ b/contabilizei/src/main/java/com/luan/tests/TestPedido.java @@ -1,13 +1,16 @@ package com.luan.tests; +import static org.junit.Assert.assertEquals; + import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import java.util.Locale; -import static org.junit.Assert.*; import org.junit.Test; +import com.luan.dao.MongoDBPedidoDAO; import com.luan.models.Cliente; import com.luan.models.Pedido; import com.luan.models.Produto; @@ -42,7 +45,119 @@ public void testCriacao() throws ParseException { assertEquals(date, pedido.getDataDeEmissao()); assertEquals(cliente, pedido.getCliente()); assertEquals(100, pedido.getValorTotal()); - assertEquals("ABC", pedido.getProduto(produto).getCodigo()); + assertEquals("ABC", pedido.getProdutoByCodigo("ABC").getCodigo()); + } + /* + @Test + public void testSalvarPedido(){ + Produto produto = new Produto(); + produto.setCodigo("ABC"); + produto.setDescricao("DEF"); + produto.setQuantidade(10); + produto.setValorUnitario(9); + + Cliente cliente = new Cliente(); + cliente.setCpf(1234567890); + cliente.setEmail("eu@email.com"); + cliente.setNome("Joao"); + cliente.setTelefone(33333333); + + Pedido pedido = new Pedido(); + String dataDeEmissao = "2017-07-21"; + try{ + Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); + pedido.setDataDeEmissao(date); + } catch (ParseException pe) {} + pedido.setNumero(1); + pedido.addProduto(produto); + pedido.setValorTotal(100); + pedido.setCliente(cliente); + + MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); + mdbpdao.inserir(pedido); + + } + @Test + public void testSalvarPedidoComDoisProdutos(){ + Produto produto = new Produto(); + produto.setCodigo("ABC"); + produto.setDescricao("DEF"); + produto.setQuantidade(10); + produto.setValorUnitario(9); + + Produto produto2 = new Produto(); + produto2.setCodigo("ABCDEF"); + produto2.setDescricao("GHI"); + produto2.setQuantidade(19); + produto2.setValorUnitario(7); + + + Cliente cliente = new Cliente(); + cliente.setCpf(1234567890); + cliente.setEmail("eu@email.com"); + cliente.setNome("Joao"); + cliente.setTelefone(33333333); + + Pedido pedido = new Pedido(); + String dataDeEmissao = "2017-07-21"; + try{ + Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); + pedido.setDataDeEmissao(date); + } catch (ParseException pe) {} + pedido.setNumero(2); + pedido.addProduto(produto); + pedido.addProduto(produto2); + + pedido.setValorTotal(100); + pedido.setCliente(cliente); + + MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); + mdbpdao.inserir(pedido); + + }*/ + + @Test + public void testRecuperarPedido(){ + Produto produto = new Produto(); + produto.setCodigo("ABC"); + produto.setDescricao("DEF"); + produto.setQuantidade(10); + produto.setValorUnitario(9); + + Produto produto2 = new Produto(); + produto2.setCodigo("ABCDEF"); + produto2.setDescricao("GHI"); + produto2.setQuantidade(19); + produto2.setValorUnitario(7); + + + Cliente cliente = new Cliente(); + cliente.setCpf(1234567890); + cliente.setEmail("eu@email.com"); + cliente.setNome("Joao"); + cliente.setTelefone(33333333); + + Pedido pedido = new Pedido(); + String dataDeEmissao = "2017-07-21"; + try{ + Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); + pedido.setDataDeEmissao(date); + } catch (ParseException pe) {} + pedido.setNumero(2); + pedido.addProduto(produto); + pedido.addProduto(produto2); + + pedido.setValorTotal(100); + pedido.setCliente(cliente); + + MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); + Pedido recuperado = mdbpdao.buscarPorNumero(2); + + assertEquals(pedido.getNumero(),recuperado.getNumero()); + assertEquals(cliente.getCpf(),recuperado.getCliente().getCpf()); + assertEquals(produto.getCodigo(),recuperado.getProdutos().get(0).getCodigo()); + assertEquals(produto2.getCodigo(),recuperado.getProdutos().get(1).getCodigo()); + } } diff --git a/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class b/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class index ad93a31bec808658de1ea29d5c03075d9ba3f77c..916a132fb9a7bfd973909493ecf81e6051e7fe93 100644 GIT binary patch delta 2362 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 J$}us-0RY+#DR=+? diff --git a/contabilizei/target/classes/com/luan/tests/TestPedido.class b/contabilizei/target/classes/com/luan/tests/TestPedido.class index f83f0ec163b4b8f2a08e466466cb50b2ab4e8128..0dcf8b0e9d6c12da742cdbe4ea3ec07bb193538a 100644 GIT binary patch delta 1254 zcmZvbS#KLv7>3_t&*C^vuqL7H0Bx#NlsL7S5U7xBscPd;Qk0|(2|@uxu{{&ZiJdX_ z7%1C>(uG1<5_d06TWAPSwv=j8NI~3i12_Bt#2x>D>%wcBq(VZr&dhx0Ti@rLTj3uz zgnzm9{f_{8ab1N^K%bq}mm&|!-CEXi_LXe2;@Eu$lD3)4+5)kz!O7GMDI=en&Kjdm zDL0)>M5^yE|Dn+Z5D($n(oM{JeLO|Kom+XIJcL1jZ{ErUoQE^6K zW5zBR`ATZqFjKZMWKU=9{=P;~|E|43oJLb^IUmA@xFB#xx>C+Ct6dtd6s!`Pxw~sm zWN!FEk6Up5*U5g@TrPLf!6xOYdax)hR-<$6A0W{YhhIpH*4%oPg)r#ArL4wr0W$>3ud~=5d}JK zcl&=MGb~v8S3Q&NEu&5Q8o#GbwTMC zTJ<+&dy@?b3fV4KTh*(sw%)^xheJ2uEYavgkZT$nxUNG0>(R>hcIdc^zs3R%;;qT*Zyu)^qaBv*&!p{O}yhpplGUNCFvykaI$60*P7_IQDjZc+R z^w28+h!)P+>9&tAW8F|xt9sC*+DQ)`(QuoG&S+Tmuyq9y?r$58X;BZcnAYQ=H>Pd( z@Ni6vdq}Kcg!`j$N!t;ZSFm$j>$`^jWjv#_}NC&3qi79xoH-D}?zfQNBiWE_I$EmNy9VAYr~q zm`5;wxf1pNX28e5y-fHuR-yzjive2jGxiLcK4C$P+Y1WVzBq4Sbnu~V^wQe)>R@SBZ5 zk$1QEgQ{0)7HeKL@Jp4t_pg~V`^S7oTxA(YXVie%(yP%L-SkN4n~BGg=25p))_76p zbP&xD{R~STVVqHBaB!ttVuC!AtTDv~(`<^eOOgV!_{>peo Date: Fri, 29 Jul 2016 18:10:09 -0300 Subject: [PATCH 06/19] removendo pedido e refatorando --- .../java/com/luan/dao/MongoDBPedidoDAO.java | 80 +++++----- .../src/main/java/com/luan/dao/PedidoDAO.java | 2 +- .../main/java/com/luan/tests/TestPedido.java | 146 ++++++------------ .../com/luan/dao/MongoDBPedidoDAO.class | Bin 4810 -> 5041 bytes .../classes/com/luan/dao/PedidoDAO.class | Bin 368 -> 351 bytes .../classes/com/luan/tests/TestPedido.class | Bin 3133 -> 3697 bytes 6 files changed, 90 insertions(+), 138 deletions(-) diff --git a/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java index 1866c8e6..472bc4e0 100644 --- a/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java +++ b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java @@ -56,47 +56,53 @@ public Pedido buscarPorNumero(int Numero){ Pedido pedido = new Pedido(); Cursor cursor = colecao.find(query); - try { - while (cursor.hasNext()) { - BasicDBObject obj = (BasicDBObject) cursor.next(); - - pedido.setNumero( obj.getInt("numero")); - pedido.setValorTotal( obj.getInt("valor_total")); - - Date dataDeEmissao = obj.getDate("data_emissao"); - - pedido.setDataDeEmissao(dataDeEmissao); - BasicDBObject c = (BasicDBObject) obj.get("cliente"); - Cliente cliente = new Cliente(); - cliente.setCpf(c.getInt("cpf")); - cliente.setNome(c.getString("nome")); - cliente.setEmail(c.getString("email")); - cliente.setTelefone(c.getInt("telefone")); - pedido.setCliente(cliente); - - BasicDBList produtosObj = (BasicDBList) obj.get("produtos"); - BasicDBObject[] ps = produtosObj.toArray(new BasicDBObject[0]); - List produtos = new ArrayList(); - for (BasicDBObject produtoObj : ps){ - Produto produto = new Produto(); - produto.setCodigo(produtoObj.getString("codigo")); - produto.setDescricao(produtoObj.getString("descricao")); - produto.setQuantidade(produtoObj.getInt("quantidade")); - produto.setValorUnitario(produtoObj.getInt("valor_unitario")); - - produtos.add(produto); - } - - pedido.setProdutos(produtos); - - - } - } finally { - cursor.close(); + + pedido = getPedido((BasicDBObject) cursor.next()); + cursor.close(); + + return pedido; + } + + private Pedido getPedido(BasicDBObject obj) { + Pedido pedido = new Pedido(); + + pedido.setNumero( obj.getInt("numero")); + pedido.setValorTotal( obj.getInt("valor_total")); + + Date dataDeEmissao = obj.getDate("data_emissao"); + + pedido.setDataDeEmissao(dataDeEmissao); + BasicDBObject c = (BasicDBObject) obj.get("cliente"); + Cliente cliente = new Cliente(); + cliente.setCpf(c.getInt("cpf")); + cliente.setNome(c.getString("nome")); + cliente.setEmail(c.getString("email")); + cliente.setTelefone(c.getInt("telefone")); + pedido.setCliente(cliente); + + BasicDBList produtosObj = (BasicDBList) obj.get("produtos"); + BasicDBObject[] ps = produtosObj.toArray(new BasicDBObject[0]); + List produtos = new ArrayList(); + for (BasicDBObject produtoObj : ps){ + Produto produto = new Produto(); + produto.setCodigo(produtoObj.getString("codigo")); + produto.setDescricao(produtoObj.getString("descricao")); + produto.setQuantidade(produtoObj.getInt("quantidade")); + produto.setValorUnitario(produtoObj.getInt("valor_unitario")); + + produtos.add(produto); } + pedido.setProdutos(produtos); + return pedido; } + public void remover(int numero){ + BasicDBObject query = new BasicDBObject(); + query.put("numero", new BasicDBObject("$eq", numero)); + colecao.remove(query); + } + } diff --git a/contabilizei/src/main/java/com/luan/dao/PedidoDAO.java b/contabilizei/src/main/java/com/luan/dao/PedidoDAO.java index e59bf60f..3f90aebb 100644 --- a/contabilizei/src/main/java/com/luan/dao/PedidoDAO.java +++ b/contabilizei/src/main/java/com/luan/dao/PedidoDAO.java @@ -7,6 +7,6 @@ public interface PedidoDAO { public void inserir(Pedido pedido); public Pedido buscarPorNumero(int Numero); - public void remover(String codigo); + public void remover(int numero); public List listarTodos(); } diff --git a/contabilizei/src/main/java/com/luan/tests/TestPedido.java b/contabilizei/src/main/java/com/luan/tests/TestPedido.java index 72fe80fc..7d1e8a8a 100644 --- a/contabilizei/src/main/java/com/luan/tests/TestPedido.java +++ b/contabilizei/src/main/java/com/luan/tests/TestPedido.java @@ -5,9 +5,9 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.List; import java.util.Locale; +import org.junit.Before; import org.junit.Test; import com.luan.dao.MongoDBPedidoDAO; @@ -16,148 +16,94 @@ import com.luan.models.Produto; public class TestPedido { - - @Test - public void testCriacao() throws ParseException { - Produto produto = new Produto(); + Produto produto, produto2; + Pedido pedido, pedido2; + Cliente cliente; + Date date; + + @Before + public void inicializaPedidos() throws ParseException{ + produto = new Produto(); produto.setCodigo("ABC"); produto.setDescricao("DEF"); produto.setQuantidade(10); produto.setValorUnitario(9); - Cliente cliente = new Cliente(); + cliente = new Cliente(); cliente.setCpf(1234567890); cliente.setEmail("eu@email.com"); cliente.setNome("Joao"); cliente.setTelefone(33333333); String dataDeEmissao = "2017-07-21"; - Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); + date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); - Pedido pedido = new Pedido(); + pedido = new Pedido(); pedido.setNumero(1); pedido.setDataDeEmissao(date); pedido.addProduto(produto); pedido.setValorTotal(100); pedido.setCliente(cliente); + produto2 = new Produto(); + produto2.setCodigo("ABCDEF"); + produto2.setDescricao("GHI"); + produto2.setQuantidade(19); + produto2.setValorUnitario(7); + + pedido2 = new Pedido(); + try{ + Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); + pedido.setDataDeEmissao(date); + } catch (ParseException pe) {} + pedido2.setNumero(2); + pedido2.addProduto(produto); + pedido2.addProduto(produto2); + + pedido2.setValorTotal(100); + pedido2.setCliente(cliente); + + + } + + @Test + public void testCriacao() { assertEquals(1, pedido.getNumero()); assertEquals(date, pedido.getDataDeEmissao()); assertEquals(cliente, pedido.getCliente()); assertEquals(100, pedido.getValorTotal()); assertEquals("ABC", pedido.getProdutoByCodigo("ABC").getCodigo()); } - /* + @Test public void testSalvarPedido(){ - Produto produto = new Produto(); - produto.setCodigo("ABC"); - produto.setDescricao("DEF"); - produto.setQuantidade(10); - produto.setValorUnitario(9); - - Cliente cliente = new Cliente(); - cliente.setCpf(1234567890); - cliente.setEmail("eu@email.com"); - cliente.setNome("Joao"); - cliente.setTelefone(33333333); - - Pedido pedido = new Pedido(); - String dataDeEmissao = "2017-07-21"; - try{ - Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); - pedido.setDataDeEmissao(date); - } catch (ParseException pe) {} - pedido.setNumero(1); - pedido.addProduto(produto); - pedido.setValorTotal(100); - pedido.setCliente(cliente); - MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); mdbpdao.inserir(pedido); - } + @Test public void testSalvarPedidoComDoisProdutos(){ - Produto produto = new Produto(); - produto.setCodigo("ABC"); - produto.setDescricao("DEF"); - produto.setQuantidade(10); - produto.setValorUnitario(9); - - Produto produto2 = new Produto(); - produto2.setCodigo("ABCDEF"); - produto2.setDescricao("GHI"); - produto2.setQuantidade(19); - produto2.setValorUnitario(7); - - - Cliente cliente = new Cliente(); - cliente.setCpf(1234567890); - cliente.setEmail("eu@email.com"); - cliente.setNome("Joao"); - cliente.setTelefone(33333333); - - Pedido pedido = new Pedido(); - String dataDeEmissao = "2017-07-21"; - try{ - Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); - pedido.setDataDeEmissao(date); - } catch (ParseException pe) {} - pedido.setNumero(2); - pedido.addProduto(produto); - pedido.addProduto(produto2); - - pedido.setValorTotal(100); - pedido.setCliente(cliente); - MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); - mdbpdao.inserir(pedido); - - }*/ + mdbpdao.inserir(pedido2); + } @Test public void testRecuperarPedido(){ - Produto produto = new Produto(); - produto.setCodigo("ABC"); - produto.setDescricao("DEF"); - produto.setQuantidade(10); - produto.setValorUnitario(9); - - Produto produto2 = new Produto(); - produto2.setCodigo("ABCDEF"); - produto2.setDescricao("GHI"); - produto2.setQuantidade(19); - produto2.setValorUnitario(7); - - - Cliente cliente = new Cliente(); - cliente.setCpf(1234567890); - cliente.setEmail("eu@email.com"); - cliente.setNome("Joao"); - cliente.setTelefone(33333333); - - Pedido pedido = new Pedido(); - String dataDeEmissao = "2017-07-21"; - try{ - Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); - pedido.setDataDeEmissao(date); - } catch (ParseException pe) {} - pedido.setNumero(2); - pedido.addProduto(produto); - pedido.addProduto(produto2); - - pedido.setValorTotal(100); - pedido.setCliente(cliente); MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); Pedido recuperado = mdbpdao.buscarPorNumero(2); - assertEquals(pedido.getNumero(),recuperado.getNumero()); + assertEquals(pedido2.getNumero(),recuperado.getNumero()); assertEquals(cliente.getCpf(),recuperado.getCliente().getCpf()); assertEquals(produto.getCodigo(),recuperado.getProdutos().get(0).getCodigo()); assertEquals(produto2.getCodigo(),recuperado.getProdutos().get(1).getCodigo()); } + + @Test + public void removerPedido(){ + MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); + mdbpdao.remover(1); + } } diff --git a/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class b/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class index 916a132fb9a7bfd973909493ecf81e6051e7fe93..61d38ce08d4a5d00c23d6d386261249db9bb9baa 100644 GIT binary patch delta 1389 zcmYLIYitx%6#mY3cV~9?Zi@?*PARkkE#2-`T>8QlLu!HeXiFPQA3mZ3JFQE$yJUCU z#2;kS=no_Dk3$UqP-B8MDpbkT+E@`qrT7-{QD5NuEj~~IThE;;W|Et4&f`1hp7Y)5 z%CS}2^z7490M<}=OuJ9j35Nxq#|s4CfSKzs zGimmxQ>JY3FM+c-XJxg^ynhSKV$K@X8eK%zNv$GJ1%!p$jbUT;P%e>N-JHo7x3?y; zIgMN>(lFv2qzF=FJvoAwbUZP@_ZcBgkY8E_TQ`{5ZJES2dC?IH2rB$^(jq~{bg{L^ztU30k@^*c!vFi*VB}1K zk}(Im04k0>@=i24p5kl<&4sapNXDPgVHeoT=q8u@Vu#VA{SkGUCJ@xZssKurH$Fz7E zM?oB4gK0d=GDCg&md~!{2@Y2nIu==IJsl0uJpykRHMJ3QQLXdOvi=El{x$L2N=9uEq*ni)vhlI<)c%+St;LE^NlF=s*&k$l!YHWXmpW z!ESW($b0YvKZhyw@gi=(3EYTNxS5|(H_mX@d2B@_&t-PNFNc3&gR``l_r{Nk!{pvv zTzZB|Nar=x;TV;&*Uc>)#vm=>?eAngm*Fwi$u4ARDX}iOf$g}TmNCaDTBw{eeB4Y7 zk7GXqRKfKGSJ;ib47-HG#@JK~*Bl;1KmjR;Driz@xdVC?q!dXz3?c@=IUWMhN*rev zmJr{;%iRH0lZdh&>e?c~dI^IEmpp}abDJ+j!mx?6&L6`-Fx7~m=2 ehDszHSy#-{T^LFg8XQ@xSoW{1i9(WwYW@McaYIr7 delta 1203 zcmY*YTW}L)6#h=q>~41dP0~QEtJNw{wL@bKXj@kbl@_5Ap_M{g1#t_Z#7PrO0uC=` zI{M%^qYv&34~{clUaF2*J38xN#}=w6*8Ba23Mwj!7qH-^ntFD@aeVprJLi1gIp5jc zf8^rH8g;Vt+!%lbR5POPQj|C*1YW?4c5|?1^-BUT;{YL;PZm~fA4ul1gtAN8YuBl0 z#H7HhZc*prIxC&cb!7`yTEXiCvDqqE8T&`Nws5Qo~~gW5AZ>{ppZSKEU`Pq{`nUW zLjPH5vkFO>=KO0fZDsoFySC=Cw^@DZq`gyLLH?&F^rBDol^`Pu&{}(Cq_#Ljs!_HF zV}!kkn}L`Sh+ghspM(7_OnC4WMz1+|!<1r%ES*Pf8*hPk8?C;C=QMlxz~eUuZ$Tqg8t_bcks(zOquE^PI2eoP0dhy z&G1-5$lst3p~DDQ=nG6Sib1aaVMdIIA)k zq5DpqDvEkV=;4{+n4vi&^NS#jaDVB<5W;4;8wwVekDo!Yr$DHs7HZ);P=@(@-ie4C^D1>kiqb6Jr3uqCo67-qdyp#VEJ*Bkk}5eT zv+I2rptGT{%_3XbjUb!7mCj*{DqG%)hv-~rY`m4KSRvTHi6=3P2%X0+1RFTbI-gl1 zoau#BLY<8DaT$#=#%EX+kwGNmOvVLN?S(xuGBT!Q?C=Ovz%&vw+%@n&1(1;GLXA0d Jd4iAT{R0X@B<=tJ diff --git a/contabilizei/target/classes/com/luan/dao/PedidoDAO.class b/contabilizei/target/classes/com/luan/dao/PedidoDAO.class index 2f5b6921f756cb8e98925292a4722b37a43a1c77..8ec8f5b0240395ffef2892ce3a27df11b8360e53 100644 GIT binary patch delta 13 Vcmeysbf0O$0%jHs&xu?1001Ta1$_Vj delta 30 mcmcc5^nq!@0ufOSpRB~PME#t^ymbBGlA_GKbnA(W_W%H}(F^4O diff --git a/contabilizei/target/classes/com/luan/tests/TestPedido.class b/contabilizei/target/classes/com/luan/tests/TestPedido.class index 0dcf8b0e9d6c12da742cdbe4ea3ec07bb193538a..bd60e35e49bec5ad1156d0247e3ac11704ec9119 100644 GIT binary patch literal 3697 zcma)8`F9i775+w+J+gQhArsPI){7zb?Z8|!l8WQuyMI)6n3UjHGGxJu~ z)1Vh!$1HmeWz#j`yklCqQfe|F^=XKOT)i4vioQM#Z(GgpQ^>9dJml81Iom3DRwMO; z0g3!k(-4+K+V`*Q*}2pZcSvbDY8PzpUJXs1T^TYC(z7_4(5|o!2@UJgcEOq`=VvT; z+L*~vNiywZjasYp0(hmCJnb_)yNF+bh+T!c`IX=Y+CLw6dcd+C4Hydxzv1_v7`p9S;w{dbZpab z>wigk99z-e3Jtd_G@~VkUCcoLz@Y5kp|BgB8d^)1$8^|ptlcf0LF)X{PI<0fnCt7x z#L!K#q2c2qwpXD?#1zGbtWwssvxXytl)`=-(6E+-Q-qFZn}*3mMmtBlGQx1D!aIZ^ zL57TxbKElwgZU+; zwR3!A`uMUGGPs`}3{RX$k4}w9iR<7ESo-3az*zz6yEN=>P@&ZllJE(Sf^9U3-w)_ZQnu@XqR3MDZw@bl3% z&9=#jzOuqaypQ@w2|?9RU-ca6%190_Dd^HM?6A~f?hl0Q?z{-(k+ z682h3-(1^oD|`pvW!I1rVrAe`^)%~gi1(EitGAOJQQuRzg6{|Ut!mj&&BC%`@sv+U zwWf^RMZ>M$j6c+{rKa69oYc5em~(~(0{T$@$vB=vyL^74@KgMZZEqJ?BirSb(g5GV zH7NI$o;PQT)Tm)wJ!6e5(6MbR9UFA=Lylbv<7DyMh2yl9Ef+1f>b-bXQMiWdybNc` zr7Q`K8}zYwH@do1L0H7)LA<1JLkiR)6~7>=>y@GDn<169iR(4^C4Q~r zR~p)uoqVJy{06@zzNtWNCVJr0{W65$BB0zb4wK1Q>soo|q7@cILi&Tk8*(b>A%y}{ zPT9>`$8EXf*GXpuaqJW2*umCrBJ5iD&kIu!D93<5@|^QW_PsyyHu6Uvl^k_S@+raZ zdahC&HIB{Q*O0u*Ndz1CZSgmgxP@~SFkmBY<%&-N3OC_4&ZAsy!sd{F3rDJqbkHHX zrXB6Rfvsn+VfzwxbiaTd$(U!{OfH3cR|<3*22uJ`#Amko-X4@j{|K@OUAi2OfvE7FT*QE?W1};uSWKSHq%FMp0HES{Ex5=-_WtJRVtw9IZo3VwzJLENk?Knc( zAZ|w*J8=fPaE=s%kESxZ@L_c0G3?>lxff6KMRW!G@H`(tuiyY)=R5i@xD$Wld*>gx z3vc2u-oo8lGmdDj=+oBYsJ0pRXuJ7l*^gsdAFT)?wg>eM5n$VLUP-^^kIGZ~t> zpDG^sA7)-?Xy#>RTb!M(MMHQl`8bu-6Svj;6O1p)`Y9QMk`TVna_8ly7x7vIuVHJD zapr?)_9@YuDfJX><>>>y^3vZOj#RaeVqx6FnPag q7}XeQQlqw7RM854U$-6<$fosq!t}zj%(d05wbTmqM{0`TPyYcwb$_w| literal 3133 zcmai0*>@9F9R8-A$)sT_F;pNdf}oJngp|6Vtzt`CpqLg)7cD9>Nv35W$%M&7!3{(a zQQT0$4FyGUSCkXfay-8HqHjL?>VM#)NB!6U~*_kom=cT6i+P;sqG_=alnah*X@EaA!b=SiaE#38pCG6WXz6S z&T@3uk~JkPdn~@U$ST}&+f-a9VZlTmSr(Kj#JAg4y69K|G@#Cpg{-$@W2g99q+v0Z zNT@3q4vRO(nA&xbM72``j&0_~+8T%bxSnQR-J68jat${KGmU0lMj>UJEJ_GgYPb?R>vGfU!~8Pmu)#H0~*wLPb5 zeiy5?8sfr-Pb8fm^KK071?cWSsxIG;nopph{~t(@V<-9)UVdENS0^ZHoJIu#uf7F7`&FthoL z(WN`aCdK zX&4s$5scx(^;eda{f%kZ1C!;9RmyRP zK~DhtkX4akN!1h9Q79O;qag>@rRnZh_x_@u;o(;zTeo^C?$=<0J3+df){9VNM$<*0 zqHy`}G=#kw)i&uYmUp};2Q(bSqb!$ECdyq*|I_iS)T?k(il4M-){`0ziL&cyJ++Nb zX*hzXNk&S_uxvb784a;nX*4}z*^K0Ez)=m);+WUpikF5;7u;D~o-jNJd2dQ_;>{?c z;*we^ZzRm7RVkHqrKggxe6*$pl&M6*1gD<^PL{k&dXD9pnYa?p^Lb*P?=VuuykYCM zchC6oI*mD7IVb%%MJjFH(xc){2}>uMl-8|yuaz6Kx;A=7T^-v3I4w@sX}qK1U7X>? zlPnfe^lI7O8RO-`33|0;#N2vc!&!l-Pw*i>DnR}~!-qJ}QC5YLw4BPpgjsOf=HO#| zqT+&tYbH$~N;G_m&sYT=hi-wv@Xo-eyEn$5$)LKGYXhYvP z+DAegzeU$&Y>k!B+bWNvpGE_%N?4Ig7z`_6zU~bxO(onPR)Xmg9ttb;mkflJ5=M`H zkG)}8Ec4&PiHgM|Tr}V@v3x>^Lkq%+$nbCp&rnotLJ|vE#(em(fJHClfem93f0ttk z@9Cvji|cufE<-DK+OYziScxIrgk4z0X}g-UD}w!G-vO+_lZfIu#Bh>U@389^(2Nq+ zxeeanwX57 Date: Fri, 29 Jul 2016 18:23:52 -0300 Subject: [PATCH 07/19] Listando todos os pedidos --- .../java/com/luan/dao/MongoDBPedidoDAO.java | 17 +++++++++++++++++ .../main/java/com/luan/tests/TestPedido.java | 11 ++++++++++- .../com/luan/dao/MongoDBPedidoDAO.class | Bin 5041 -> 5463 bytes .../classes/com/luan/tests/TestPedido.class | Bin 3697 -> 4001 bytes 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java index 472bc4e0..8f0a1f81 100644 --- a/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java +++ b/contabilizei/src/main/java/com/luan/dao/MongoDBPedidoDAO.java @@ -104,5 +104,22 @@ public void remover(int numero){ colecao.remove(query); } + public List listarTodos(){ + List pedidos = new ArrayList(); + + Cursor cursor = colecao.find(); + + try { + while (cursor.hasNext()) { + pedidos.add(getPedido((BasicDBObject) cursor.next())); + } + } finally { + cursor.close(); + } + + return pedidos; + + } + } diff --git a/contabilizei/src/main/java/com/luan/tests/TestPedido.java b/contabilizei/src/main/java/com/luan/tests/TestPedido.java index 7d1e8a8a..d804c5fe 100644 --- a/contabilizei/src/main/java/com/luan/tests/TestPedido.java +++ b/contabilizei/src/main/java/com/luan/tests/TestPedido.java @@ -5,6 +5,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import java.util.Locale; import org.junit.Before; @@ -101,9 +102,17 @@ public void testRecuperarPedido(){ } @Test - public void removerPedido(){ + public void testRemoverPedido(){ MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); mdbpdao.remover(1); } + + @Test + public void testListarPedidos(){ + MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); + List pedidos = mdbpdao.listarTodos(); + + assertEquals(pedido2.getNumero(),pedidos.get(0).getNumero()); + } } diff --git a/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class b/contabilizei/target/classes/com/luan/dao/MongoDBPedidoDAO.class index 61d38ce08d4a5d00c23d6d386261249db9bb9baa..ebe1cb059148aa77b7192df66276a25605f6ef53 100644 GIT binary patch delta 374 zcmXwzO-lj+5Qg8`wszZg!P-NC6yinQT|cu+hKJ}7^l?duZfzu{h~m0ho%#`bi;jWU zq)4pL3c6Hx|3Ogyp^qtvfq91a9cJEkXkaMMUpGAfDOzYNHEnjHT&%mcldJAm>xA*G zVxeNY4JS{q!V&LX4SKu6m@k`Aa86MbcN8PcguRmN7taXB|As%CktjvbOLo(am+eX+ zo;z@=hxT4M?;UHaGToL=#KQWgNlc)d0ugFo+_?l-Uc?+~3(WUhvAX1FWm847~(TZB`~BenOYfl+f4L NBudI4`pqFw`Ul-uOVI!T delta 36 scmcbvwNahx)W2Q(7#J9g7_~QY74l9t;d5hT-CWK0ij|dtfr(KI0O`OAIRF3v diff --git a/contabilizei/target/classes/com/luan/tests/TestPedido.class b/contabilizei/target/classes/com/luan/tests/TestPedido.class index bd60e35e49bec5ad1156d0247e3ac11704ec9119..d43acd9ac9524500dfeb29191e09295e66644918 100644 GIT binary patch delta 566 zcmZ9J$xl;J6o(K`U)d+*lH0 zBymOV-o%v&aZ@n}j;xFt701Ml3wJKu_y=e_fGcx1_k8DfhWop}B6p&J*MA;81KRmg z4LmWHg-dR+)T>__EtQ3JEGiVW_Mmgc zNt8=DFEL-7R5aN6jN_egMsm)8=cca~-1PiK5&uuyX=n0739sx7Cx-IlW0tQgsec&f zm7%-MxLP$iY>unST7pEVW1XBPHWMX5Gaa!bb%UKuZaO!BO~=$ zTrTQwA=ey~>?J~Yx~HaDw}6md?!ECG)TLUY)T^q}eGj6N>t=ZZA<4Duv< zuMG3f2w#ly%^1Ios|XookyW)!D4(24GO5x`sjNX>*E=_j1stY{GD8=$Qk?ZeXnltqPTdV*1fNZCVp2z++vmm*v8SbT Date: Fri, 29 Jul 2016 21:22:45 -0300 Subject: [PATCH 08/19] API retornando Pedido por numero --- contabilizei/.classpath | 6 +++++ contabilizei/.project | 6 +++++ .../.settings/org.eclipse.jdt.core.prefs | 6 ++--- .../.settings/org.eclipse.m2e.core.prefs | 4 +++ contabilizei/pom.xml | 14 +++++++++- .../controllers/HelloWorldController.java | 24 +++++++++++++++++- .../java/com/luan/services/PedidoService.java | 13 ++++++++++ .../main/java/com/luan/tests/TestPedido.java | 5 +--- contabilizei/src/main/webapp/WEB-INF/web.xml | 6 +++++ .../controllers/HelloWorldController.class | Bin 1295 -> 1964 bytes .../com/luan/services/PedidoService.class | Bin 0 -> 563 bytes .../classes/com/luan/tests/TestPedido.class | Bin 4001 -> 3894 bytes 12 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 contabilizei/.settings/org.eclipse.m2e.core.prefs create mode 100644 contabilizei/src/main/java/com/luan/services/PedidoService.java create mode 100644 contabilizei/target/classes/com/luan/services/PedidoService.class diff --git a/contabilizei/.classpath b/contabilizei/.classpath index 98c0f02d..9cd75d52 100644 --- a/contabilizei/.classpath +++ b/contabilizei/.classpath @@ -9,4 +9,10 @@ + + + + + + diff --git a/contabilizei/.project b/contabilizei/.project index 5027ce79..ce2d71be 100644 --- a/contabilizei/.project +++ b/contabilizei/.project @@ -20,8 +20,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature org.eclipse.wst.common.project.facet.core.nature org.eclipse.wst.common.modulecore.ModuleCoreNature diff --git a/contabilizei/.settings/org.eclipse.jdt.core.prefs b/contabilizei/.settings/org.eclipse.jdt.core.prefs index f2992737..60105c1b 100644 --- a/contabilizei/.settings/org.eclipse.jdt.core.prefs +++ b/contabilizei/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ -#Mon Jul 18 10:33:35 SGT 2011 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/contabilizei/.settings/org.eclipse.m2e.core.prefs b/contabilizei/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/contabilizei/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/contabilizei/pom.xml b/contabilizei/pom.xml index 1c46415a..309163df 100644 --- a/contabilizei/pom.xml +++ b/contabilizei/pom.xml @@ -37,7 +37,19 @@ 3.3.0 - + + + com.sun.jersey + jersey-json + 1.8 + + + + com.google.code.gson + gson + 2.6.2 + + diff --git a/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java b/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java index 0d21ec89..a18b41ef 100644 --- a/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java +++ b/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java @@ -3,10 +3,18 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; + +import com.google.gson.Gson; +import com.luan.models.Pedido; +import com.luan.services.PedidoService; -@Path("/hello") +@Path("/pedidos") public class HelloWorldController { + + private PedidoService pedidoService = new PedidoService(); @GET @Path("/{param}") @@ -17,5 +25,19 @@ public Response getMsg(@PathParam("param") String msg) { return Response.status(200).entity(output).build(); } + + @GET + @Path("/get/{numero}") + @Produces(MediaType.APPLICATION_JSON) + public Response getPedido(@PathParam("numero") int numero) { + + Pedido pedido = pedidoService.getByNumero(numero); + + Gson gson = new Gson(); + String json = gson.toJson(pedido); + + return Response.status(200).entity(json).build(); + + } } \ No newline at end of file diff --git a/contabilizei/src/main/java/com/luan/services/PedidoService.java b/contabilizei/src/main/java/com/luan/services/PedidoService.java new file mode 100644 index 00000000..7b9ca566 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/services/PedidoService.java @@ -0,0 +1,13 @@ +package com.luan.services; + +import com.luan.dao.MongoDBPedidoDAO; +import com.luan.models.Pedido; + +public class PedidoService { + + public Pedido getByNumero(int numero) { + MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); + return mdbpdao.buscarPorNumero(numero); + } + +} diff --git a/contabilizei/src/main/java/com/luan/tests/TestPedido.java b/contabilizei/src/main/java/com/luan/tests/TestPedido.java index d804c5fe..03902100 100644 --- a/contabilizei/src/main/java/com/luan/tests/TestPedido.java +++ b/contabilizei/src/main/java/com/luan/tests/TestPedido.java @@ -53,10 +53,7 @@ public void inicializaPedidos() throws ParseException{ produto2.setValorUnitario(7); pedido2 = new Pedido(); - try{ - Date date = new SimpleDateFormat("y-m-d", Locale.ENGLISH).parse(dataDeEmissao); - pedido.setDataDeEmissao(date); - } catch (ParseException pe) {} + pedido.setDataDeEmissao(date); pedido2.setNumero(2); pedido2.addProduto(produto); pedido2.addProduto(produto2); diff --git a/contabilizei/src/main/webapp/WEB-INF/web.xml b/contabilizei/src/main/webapp/WEB-INF/web.xml index 0098f2a9..740b92f2 100644 --- a/contabilizei/src/main/webapp/WEB-INF/web.xml +++ b/contabilizei/src/main/webapp/WEB-INF/web.xml @@ -11,6 +11,12 @@ com.sun.jersey.config.property.packages com.luan.controllers + + + com.sun.jersey.api.json.POJOMappingFeature + true + + 1 diff --git a/contabilizei/target/classes/com/luan/controllers/HelloWorldController.class b/contabilizei/target/classes/com/luan/controllers/HelloWorldController.class index 52653de81bd93786efe938179b001bbbf054e822..d30c915e7e55552871c74b5beceebfe4973def56 100644 GIT binary patch literal 1964 zcmah}TTdHD6#fQGjLi}QO(B#73?<>t_7Zx5G%3(PoN#f0I;CkJ*7nF*wBE7yLK{VW z><{TbXr&gaBK4&&Rew~JZ+0EPjv-oUcIM1E-}%mE&i^m}{s+KE_#uflfvJ+JnoelB zW=Xk$ryNImzWGo(j(Vazr@VS9O(G%Cb6_1>renDkbGvvTOMyUlO_uGl+Lhj+U6KN$ z8>f(dEc4C$d6gxBD|c6t|10A>` zklC|AsFLLrEYH^Gx-bzuvweY?GnQ`)T=T8SVAHP%n3Ef48Q2Xx z+pR23MWUa~AAOUlD=AN!JJPQy*OxRM+zH*luF8V#+hnoqx+<^&o3{eJ4VLQ<_Nd?2 zAj@09GYUHnEhl6|o#u<06QiNTB$}%NnF zvkW1NFh7~Qq=MtGOL<0T0iP!E37^h|E}D%De1^~IQnC|*=K}Z7Cm?=DmvvDy9K&3| zl7YMUf`u&VY6;w|=c8rJEO>iW_ix-?4LKt(6$Z7CPdUXlkDsc*@TF-XV7Eza^MxB$ zrKi}C{f)imsd8A7J{5adcgHS8O>Z9f%B9EHO26TU26A{L&_%SB=X}3J6ByFoPbWZ? z5*GHK_ zYuex)T;reb8U556;66jE>--N=`ks#=+~C0wJl%{X!;xEy>YCQb2}bt&Mvw9S%n@!M zVS2L{|NVve*(2OJ!s2gKiCLui2R-x>Su@DS=5+=H!adxlhhFmilDjtUm!s%3t08Ki zW3`H}G?}LmJ|4Wma4ll^3n4maIx+nRGDAmL-#o!%CTDYNj^wr$6EV@jL^IPqW(pW1 z$T->DqTh*#@tqj%l<@@CutORt3}Y92QJnqw28D=g22U78g8OfY)`tBkyIs_;XZAZh O%TB^j5Iwi0KuZ;hqOGEUqEcQ}e9Oay3pe7%gv2F@1Tmx}N{p`f1Y_wG9A{wP-cdF-gz#UB3= z&$%s`KCgA%Xtz83MN0Po0gT*uDf;Ldi;xjY=>hzGN(3krT^f)Pps0=ogj4imm`0H9 z3{f5=wMH1G>dYNx5pm`2z`1c{ezc=ba*>$W5Iy}eyf8pC;~?f>wW{Ik9UEB(IS1Qs zq#3VQ2;K1-J=a2f+&{5Eldz8iTA`7dL&^l=k4D|ak+A@A6H_IWiBPDJM+#!aBmV=6 CU^?Fb diff --git a/contabilizei/target/classes/com/luan/services/PedidoService.class b/contabilizei/target/classes/com/luan/services/PedidoService.class new file mode 100644 index 0000000000000000000000000000000000000000..26eb1c4d1d8fa7f71c9b05c711232db8ee53995e GIT binary patch literal 563 zcmah`T}uK%6g}hD>S}8CokjVk5iRs;1epYareFv?&h8Gjvbz(jEA+4GC83}n(2t7l zxS9k(FXzsknS0KeGoN2?9{|pApdrR^WJ%9(L+%@65lkIRjE$bK9b5LJRzrfJIO0=o zxZEEaU2`O?2}A0_@tw&fL%doWFeI*}Ep)_@$svgpL!s^X;x_b55!`Xp6%3`ew75Iq zfus7xW@7T-j2SBJe{9qlvO_UxJQ1Y`BtyB{s;!1RQg@fm>l)S>4u2SJE{%@#hqBp- zp4PnT>L?d?X?YY^C}aF&WkSG7KznyV#ps+n-ODzX2tZc?kdj literal 0 HcmV?d00001 diff --git a/contabilizei/target/classes/com/luan/tests/TestPedido.class b/contabilizei/target/classes/com/luan/tests/TestPedido.class index d43acd9ac9524500dfeb29191e09295e66644918..d8c54bceefec426a71b4f68bbf2730f4fb78f106 100644 GIT binary patch delta 1140 zcma))*-sNu6vn@y?X*m9%Oco_P*kF_7#j&8RfC4O6$In~5u*_s1S|oHr8Pc*%A&Y{ zaz!PsxK+gs!C@6~7ukf6ugP>`Ob2;C(rG5mP>Hr z62oP5@L@4SyvlG5*SSe=*WMHm!#njcArkzUrTld=+`(P$(>ELZ=w|4_BW^UL%;{z5 zQ^+Eb*Ho1#$N`2y4DkZP!sua)=!)rcn zSU}h@hPN2%mV%Q6N%#sKf&d|rua$g`tP~=VCRnjbNI*IwY1eF(M5~1&Cq}U!2O!YzAVR4YO<9qmI$Fc%X@r&{z#%ER zGU^-pa9EL7!{$D;(wkk4+9+BZfp#@Ir)&+6Q-bg~85d<-p?Vj=)P|!-2v`S(^@zd- z#KVD9WYAkCA7_z{8#6YPO{d8Wgbl*KwHLRtl2oYSHW4D1r@R036ZZrYp0-HGeU>RI;D}4=}vVr9%fU!M6PdG5-`&)LssH8WmWy1 zPi|4BU(=7rK^TEmb&n43o2+R2Q~xRj=C?vmvfHTD?J#2ptSH1X?8HX;-o+^5Rc6Z; zwRJNJ@EpNpsDKwU4v{%&w|RO9t&EoeE!FE%(%KCZ-N?}nkZv5 z;L6m%&PjU|Db2(M52u4b1xZzsR23Fs4=)U{B&l*HxoG|^%QkTy!AkvvM<6h>Ox!T6J- zVv7rcdQqzoux{wM7VvdLz+G|Qe$ihw{=&cDa^AdY2h%40F!SEI=brO9=X=fzYK9la z&i_4e23W~2Be7O{X}l%vx9>{&y{-QCRENvMiqf6_y?#T=-`&;FlJ4u?-DU2ym(@O^ zd6dT#C0!lqjeG9y=<87wEx)`e#(oaCJYk0Ic|`|#(u~^+oToL0L*`d|g}0w)H3xal zXy;1jdCdzPHtU?m+GCm*!+deccblK;>1*vt`>7Z{FKJ%p6*J^CIj?Ds^Sb%dX;g2T zT6b|gOGS(Zyv36C8_lGgwHS=Q^ zE}dj!TlwY_Y#C*1eZU>b6{py7ML_p)ij$^v&Z-K<1!XIbDv6paau2e|Y?{-axrV>E zR@tmkC9G9tT&JqJUe&QqUB!B}h8vkDw`(I7m0Tj0&u=`ygD8phh?BtLAvv$W`bQ9! zi*nf;{#8kZ3{WZ;s^x+s)}TDgyc^+ z>G(6z&=UPVpS7I~WN%)) zx@kzj*9GaORPpl~hVeo7xi1Wdb;6-`3mB)vfuH&wDf}nhN~K# N{FsyACpokD`Cl{Q3c>&Y From 730c0b8233ff1704fdc09447009bf3c325eefc89 Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Sat, 30 Jul 2016 16:52:09 -0300 Subject: [PATCH 09/19] =?UTF-8?q?API:=20GET=20pedidos,=20POST=20pedido,=20?= =?UTF-8?q?DELETE=20pedido=20+=20refatora=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/HelloWorldController.java | 43 ------------ .../luan/controllers/PedidosController.java | 66 ++++++++++++++++++ .../java/com/luan/services/PedidoService.java | 34 ++++++++- .../controllers/HelloWorldController.class | Bin 1964 -> 0 bytes .../luan/controllers/PedidosController.class | Bin 0 -> 2282 bytes .../com/luan/services/PedidoService.class | Bin 563 -> 1755 bytes 6 files changed, 98 insertions(+), 45 deletions(-) delete mode 100644 contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java create mode 100644 contabilizei/src/main/java/com/luan/controllers/PedidosController.java delete mode 100644 contabilizei/target/classes/com/luan/controllers/HelloWorldController.class create mode 100644 contabilizei/target/classes/com/luan/controllers/PedidosController.class diff --git a/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java b/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java deleted file mode 100644 index a18b41ef..00000000 --- a/contabilizei/src/main/java/com/luan/controllers/HelloWorldController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.luan.controllers; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import com.google.gson.Gson; -import com.luan.models.Pedido; -import com.luan.services.PedidoService; - -@Path("/pedidos") -public class HelloWorldController { - - private PedidoService pedidoService = new PedidoService(); - - @GET - @Path("/{param}") - public Response getMsg(@PathParam("param") String msg) { - - String output = " Ol, API. Seja bem vindo: " + msg; - - return Response.status(200).entity(output).build(); - - } - - @GET - @Path("/get/{numero}") - @Produces(MediaType.APPLICATION_JSON) - public Response getPedido(@PathParam("numero") int numero) { - - Pedido pedido = pedidoService.getByNumero(numero); - - Gson gson = new Gson(); - String json = gson.toJson(pedido); - - return Response.status(200).entity(json).build(); - - } - -} \ No newline at end of file diff --git a/contabilizei/src/main/java/com/luan/controllers/PedidosController.java b/contabilizei/src/main/java/com/luan/controllers/PedidosController.java new file mode 100644 index 00000000..17929309 --- /dev/null +++ b/contabilizei/src/main/java/com/luan/controllers/PedidosController.java @@ -0,0 +1,66 @@ +package com.luan.controllers; + +import java.util.List; + +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import com.luan.models.Pedido; +import com.luan.services.PedidoService; + +@Path("/pedidos") +public class PedidosController { + + private PedidoService pedidoService = new PedidoService(); + +/* @GET + @Path("/{param}") + public Response getMsg(@PathParam("param") String msg) { + + String output = " Ol, API. Seja bem vindo: " + msg; + + return Response.status(200).entity(output).build(); + + } + */ + @GET + @Path("/{numero}") + @Produces(MediaType.APPLICATION_JSON) + public Response getPedido(@PathParam("numero") int numero) { + Pedido pedido = pedidoService.getByNumero(numero); + return Response.status(200).entity(pedidoService.toJson(pedido)).build(); + } + + @GET + @Path("/") + @Produces(MediaType.APPLICATION_JSON) + public Response getTodosOsPedidos() { + List pedidos = pedidoService.getAll(); + return Response.status(200).entity(pedidoService.toJson(pedidos)).build(); + } + + @POST + @Path("/") + @Produces(MediaType.APPLICATION_JSON) + public Response salvaPedido(String pedidoJson) { + Pedido pedido = pedidoService.fromJson(pedidoJson); + pedidoService.salvaPedido(pedido); + return Response.status(200).entity(pedidoService.toJson(pedido)).build(); + } + + @DELETE + @Path("/{numero}") + @Produces(MediaType.APPLICATION_JSON) + public Response deletePedido(@PathParam("numero") int numero) { + pedidoService.remover(numero); + return Response.status(200).entity("").build(); + } + + +} \ No newline at end of file diff --git a/contabilizei/src/main/java/com/luan/services/PedidoService.java b/contabilizei/src/main/java/com/luan/services/PedidoService.java index 7b9ca566..accfa3ac 100644 --- a/contabilizei/src/main/java/com/luan/services/PedidoService.java +++ b/contabilizei/src/main/java/com/luan/services/PedidoService.java @@ -1,13 +1,43 @@ package com.luan.services; +import java.util.List; + +import com.google.gson.Gson; import com.luan.dao.MongoDBPedidoDAO; import com.luan.models.Pedido; public class PedidoService { - + private MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); + public Pedido getByNumero(int numero) { - MongoDBPedidoDAO mdbpdao = new MongoDBPedidoDAO(); return mdbpdao.buscarPorNumero(numero); } + public List getAll() { + return mdbpdao.listarTodos(); + } + + public String toJson(Object object){ + Gson gson = new Gson(); + return gson.toJson(object); + } + + public Pedido fromJson(String pedidoJson){ + Gson gson = new Gson(); + return gson.fromJson(pedidoJson, Pedido.class); + } + + public void salvaPedido(Pedido pedido) { + pedido.setNumero(getNumero()); + mdbpdao.inserir(pedido); + } + + private int getNumero(){ + return (mdbpdao.listarTodos().size()+1); + } + + public void remover(int numero) { + mdbpdao.remover(numero);; + } + } diff --git a/contabilizei/target/classes/com/luan/controllers/HelloWorldController.class b/contabilizei/target/classes/com/luan/controllers/HelloWorldController.class deleted file mode 100644 index d30c915e7e55552871c74b5beceebfe4973def56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1964 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 An*aa+ delta 228 zcmXYqJqp4=6ohBaWEjM`mD7{^=ktea1&@Dr0VdVZj)@i5FHA1c3JX3_sW;LMUsFAmz}z4 YinOx-s~E%pLzcPxD#nO*fpHa2ej0HWR{#J2 From 721cd2d0f00457d174826c359ab2075bbde7d941 Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Sat, 30 Jul 2016 17:00:19 -0300 Subject: [PATCH 10/19] PUT pedido --- .../luan/controllers/PedidosController.java | 10 ++++++++++ .../java/com/luan/services/PedidoService.java | 5 +++++ .../luan/controllers/PedidosController.class | Bin 2282 -> 2484 bytes .../com/luan/services/PedidoService.class | Bin 1755 -> 1871 bytes 4 files changed, 15 insertions(+) diff --git a/contabilizei/src/main/java/com/luan/controllers/PedidosController.java b/contabilizei/src/main/java/com/luan/controllers/PedidosController.java index 17929309..c4b05f37 100644 --- a/contabilizei/src/main/java/com/luan/controllers/PedidosController.java +++ b/contabilizei/src/main/java/com/luan/controllers/PedidosController.java @@ -5,6 +5,7 @@ import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; +import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -61,6 +62,15 @@ public Response deletePedido(@PathParam("numero") int numero) { pedidoService.remover(numero); return Response.status(200).entity("").build(); } + + @PUT + @Path("/") + @Produces(MediaType.APPLICATION_JSON) + public Response atualizaPedido(String pedidoJson) { + Pedido pedido = pedidoService.fromJson(pedidoJson); + pedidoService.atualizaPedido(pedido); + return Response.status(200).entity(pedidoService.toJson(pedido)).build(); + } } \ No newline at end of file diff --git a/contabilizei/src/main/java/com/luan/services/PedidoService.java b/contabilizei/src/main/java/com/luan/services/PedidoService.java index accfa3ac..eacbfc6b 100644 --- a/contabilizei/src/main/java/com/luan/services/PedidoService.java +++ b/contabilizei/src/main/java/com/luan/services/PedidoService.java @@ -40,4 +40,9 @@ public void remover(int numero) { mdbpdao.remover(numero);; } + public void atualizaPedido(Pedido pedido) { + mdbpdao.remover(pedido.getNumero()); + mdbpdao.inserir(pedido); + } + } diff --git a/contabilizei/target/classes/com/luan/controllers/PedidosController.class b/contabilizei/target/classes/com/luan/controllers/PedidosController.class index 00a9b2416b495703569070ca75811799f750a748..9b69242f0053e88f616e81dc8c00162a2ed68e04 100644 GIT binary patch delta 252 zcmaDQxJ8)j)W2Q(7#J9g7?L+~&1co+ODri(%*m`u3`kAMOvz_t5cJ7PEK97=FE7?F zD%KAO4YB58;9-d6VTfYzpS+wkm62^SFPkZ+FaryNC<8x(@MLec4pvnLP6oBfH`qE^ zbs0Dq^d_gV&*C%%ikUG8GMG>15a0 d*2N7pLlTIkiWw3Z5`hw2K#l=}8bcBbCjbfFDx3fS delta 154 zcmdlY{7R7P)W2Q(7#J9g7~(f_&1ao_gEg6vb+QecDW?zv3xfy)KZDTZDz*+*6$VZQ z)yeGaovbSGHOw_^|jnkB}-1SG{7gn{}&K%7B= s!IFWIfteu+$YWxN28u8+a05jofmo`TA%-CqD8L2e7%-?Y#IbM!03AyfS^xk5 diff --git a/contabilizei/target/classes/com/luan/services/PedidoService.class b/contabilizei/target/classes/com/luan/services/PedidoService.class index a234f939a4036313f5d5c6c24376111345f4457e..34a5c70307158acc747404dc70ea75a2e65dd658 100644 GIT binary patch delta 132 zcmcc3d!CQ$)W2Q(7#J9g7=ku({bLs4ODri(%*m`u3`kAMOv&eBFkrBn%*JBM$hp~u zWfqf+1p^}kCs2I=0}~K3FoqO{bQai$70OLu{nrk785H20~3Qk0PLO$IsgCw From ec2b92eb136c5bbe3c896a18a40b802b0600352f Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Sat, 30 Jul 2016 17:02:03 -0300 Subject: [PATCH 11/19] detalhe no controller --- .../luan/controllers/PedidosController.java | 12 +----------- .../luan/controllers/PedidosController.class | Bin 2484 -> 2484 bytes 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/contabilizei/src/main/java/com/luan/controllers/PedidosController.java b/contabilizei/src/main/java/com/luan/controllers/PedidosController.java index c4b05f37..e0180f99 100644 --- a/contabilizei/src/main/java/com/luan/controllers/PedidosController.java +++ b/contabilizei/src/main/java/com/luan/controllers/PedidosController.java @@ -19,17 +19,7 @@ public class PedidosController { private PedidoService pedidoService = new PedidoService(); - -/* @GET - @Path("/{param}") - public Response getMsg(@PathParam("param") String msg) { - - String output = " Ol, API. Seja bem vindo: " + msg; - - return Response.status(200).entity(output).build(); - - } - */ + @GET @Path("/{numero}") @Produces(MediaType.APPLICATION_JSON) diff --git a/contabilizei/target/classes/com/luan/controllers/PedidosController.class b/contabilizei/target/classes/com/luan/controllers/PedidosController.class index 9b69242f0053e88f616e81dc8c00162a2ed68e04..d735dfd6adb34ebba944b4001114a512681fa674 100644 GIT binary patch delta 69 zcmdlYyhV5e6FaLk11E#bWOnvWR%Heb29?QE*=KQT1I2V01Q~QETX0NeH35p7PQJv^ U!D#~&w*`vZ0maoPcX4U~0M*G2asU7T delta 69 zcmdlYyhV5e6FaLa11E#pWOnvWR$T@T2EEBs*=KQ@0>#W21R2aHTX0NewF8RVPrk&_ U!RZDRcL$1l0L9fOcX4U~0Okn|>Hq)$ From 4384967f2b2bc7ffc4decbf5773da98f1cb4a8a1 Mon Sep 17 00:00:00 2001 From: Luan Andrade Date: Sat, 30 Jul 2016 17:39:37 -0300 Subject: [PATCH 12/19] hello angular --- starstore/index.html | 15 + starstore/js/app.js | 1 + starstore/js/controllers.js | 7 + starstore/lib/angular.js | 31768 ++++++++++++++++++++++++++++++++++ 4 files changed, 31791 insertions(+) create mode 100644 starstore/index.html create mode 100644 starstore/js/app.js create mode 100644 starstore/js/controllers.js create mode 100644 starstore/lib/angular.js diff --git a/starstore/index.html b/starstore/index.html new file mode 100644 index 00000000..c0c98206 --- /dev/null +++ b/starstore/index.html @@ -0,0 +1,15 @@ + + + + + Star Store - sua loja de naves espaciais + + + + + +