diff --git a/user/pages/_links/_link/text.md b/user/pages/_links/_link/text.md index 421301e..4d8102e 100644 --- a/user/pages/_links/_link/text.md +++ b/user/pages/_links/_link/text.md @@ -6,7 +6,3 @@ content: by: '' dir: '' --- - -Faux-texte: a pour fonction de faire office de texte de substitution ou d'outil permettant la comparaison et l'appréciation de différentes polices. - -On appelle Lipsum un texte qui, en l'absence du texte définitif, sert de substitut aux futurs contenus lors de la production de maquettes pour les publications ou sites Web. Le terme Lipsum est issu de la contraction du plus connu de ce type de texte "Lorem ipsum". Ils sont également connus sous les noms de texte blanc, faux-texte, bolo bolo, pseudo texte, texte factice, vrai faux texte, faux contenu, texte de remplissage, de remplacement, ou d'attente. Outre son usage dans les milieux de l'imprimerie et du graphisme, certains chansonniers en font l'utilisation lors de la composition de mélodies, chantant ces textes en amont de l'écriture de leur textes. L'utilisation de faux-textes aurait déjà été une pratique courante depuis le 16ème siècle dans les milieux de l'imprimerie et de la composition. \ No newline at end of file diff --git a/user/pages/_reseaux-sociaux/_reseaux/text.md b/user/pages/_reseaux-sociaux/_reseaux/text.md index 7f4a32b..5c6e47b 100644 --- a/user/pages/_reseaux-sociaux/_reseaux/text.md +++ b/user/pages/_reseaux-sociaux/_reseaux/text.md @@ -2,7 +2,3 @@ title: Reseaux image_align: left --- - -Faux-texte: a pour fonction de faire office de texte de substitution ou d'outil permettant la comparaison et l'appréciation de différentes polices. - -On appelle Lipsum un texte qui, en l'absence du texte définitif, sert de substitut aux futurs contenus lors de la production de maquettes pour les publications ou sites Web. Le terme Lipsum est issu de la contraction du plus connu de ce type de texte "Lorem ipsum". Ils sont également connus sous les noms de texte blanc, faux-texte, bolo bolo, pseudo texte, texte factice, vrai faux texte, faux contenu, texte de remplissage, de remplacement, ou d'attente. Outre son usage dans les milieux de l'imprimerie et du graphisme, certains chansonniers en font l'utilisation lors de la composition de mélodies, chantant ces textes en amont de l'écriture de leur textes. L'utilisation de faux-textes aurait déjà été une pratique courante depuis le 16ème siècle dans les milieux de l'imprimerie et de la composition. \ No newline at end of file diff --git a/user/pages/_streetmap/_streetmap/text.md b/user/pages/_streetmap/_streetmap/text.md index d06599e..0a7d8ea 100644 --- a/user/pages/_streetmap/_streetmap/text.md +++ b/user/pages/_streetmap/_streetmap/text.md @@ -2,7 +2,3 @@ title: Streetmap image_align: left --- - -Faux-texte: a pour fonction de faire office de texte de substitution ou d'outil permettant la comparaison et l'appréciation de différentes polices. - -On appelle Lipsum un texte qui, en l'absence du texte définitif, sert de substitut aux futurs contenus lors de la production de maquettes pour les publications ou sites Web. Le terme Lipsum est issu de la contraction du plus connu de ce type de texte "Lorem ipsum". Ils sont également connus sous les noms de texte blanc, faux-texte, bolo bolo, pseudo texte, texte factice, vrai faux texte, faux contenu, texte de remplissage, de remplacement, ou d'attente. Outre son usage dans les milieux de l'imprimerie et du graphisme, certains chansonniers en font l'utilisation lors de la composition de mélodies, chantant ces textes en amont de l'écriture de leur textes. L'utilisation de faux-textes aurait déjà été une pratique courante depuis le 16ème siècle dans les milieux de l'imprimerie et de la composition. \ No newline at end of file diff --git a/user/themes/r2c/css-compiled/template.css b/user/themes/r2c/css-compiled/template.css index d84ebe4..2a0b310 100644 --- a/user/themes/r2c/css-compiled/template.css +++ b/user/themes/r2c/css-compiled/template.css @@ -91,4 +91,6 @@ body { overflow: hidden; } #page #start .blocs:nth-child(3) { background: white; } -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY3NzIiwic291cmNlcyI6WyJ0ZW1wbGF0ZS5zY3NzIiwiY29uZmlndXJhdGlvbi9fbWl4aW4uc2NzcyIsImNvbmZpZ3VyYXRpb24vX2NvbmZpZy5zY3NzIiwidGVtcGxhdGUvX3Jlc2V0LnNjc3MiLCJ0ZW1wbGF0ZS9fdHlwb2dyYXBoeS5zY3NzIiwidGVtcGxhdGUvX2hlYWRlci5zY3NzIiwidGVtcGxhdGUvX3NlY3Rpb24uc2NzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvL2NvbmZpZ3VyYXRpb25cbkBpbXBvcnQgXCJjb25maWd1cmF0aW9uL21peGluXCI7XG5AaW1wb3J0IFwiY29uZmlndXJhdGlvbi9jb25maWdcIjtcblxuLy9yZXNldCRcbkBpbXBvcnQgXCJ0ZW1wbGF0ZS9yZXNldFwiO1xuXG4vLyBUeXBvZ3JhcGh5XG5AaW1wb3J0IFwidGVtcGxhdGUvdHlwb2dyYXBoeVwiO1xuXG4vLyBIZWFkZXJcbkBpbXBvcnQgXCJ0ZW1wbGF0ZS9oZWFkZXJcIjtcblxuLy9zZWN0aW9uXG5AaW1wb3J0IFwidGVtcGxhdGUvc2VjdGlvblwiO1xuLy8gQGltcG9ydCBcInRlbXBsYXRlL3NlY3Rpb24tbWVkaWEtcXVlcmllc1wiO1xuXG4vLyBGb290ZXJcbi8vIEBpbXBvcnQgXCJ0ZW1wbGF0ZS9mb290ZXJcIjtcbiIsIiRDb29wZXJIZXdpdHQ6IFwiQ29vcGVySGV3aXR0XCI7XG4kZmlsZTogXCJDb29wZXJIZXdpdHQtQm9sZFwiO1xuJGZhbWlseTogXCJDb29wZXJIZXdpdHRcIjtcbiRjYXRlZ29yeTogXCJzYW5zLXNlcmlmXCI7XG5cbkBtaXhpbiBmb250LWZhY2UoJENvb3Blckhld2l0dCwgJGZpbGUsICRmYW1pbHksICRjYXRlZ29yeTpcIlwiKSB7XG4gICAgJGZpbGVwYXRoOiBcIi4uL2ZvbnRzL1wiICsgJGZhbWlseSArIFwiL1wiICsgJGZpbGU7XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JENvb3Blckhld2l0dH1cIjtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90XCIpO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3Q/I2llZml4XCIpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLndvZmZcIikgZm9ybWF0KCd3b2ZmJyksIHVybCgkZmlsZXBhdGggKyBcIi50dGZcIikgIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnN2ZyNcIiArICRDb29wZXJIZXdpdHQgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cbiAgICAlI3skQ29vcGVySGV3aXR0fSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnkgIT0gXCJcIiB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JENvb3Blckhld2l0dH1cIiwgI3skY2F0ZWdvcnl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRDb29wZXJIZXdpdHR9XCI7XG4gICAgICAgICAgICAgICAgd2VpZ2h0OiBub3JtYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiRDb29wZXJIZXdpdHQtaXRhbGljOiBcIkNvb3Blckhld2l0dC1Cb2xkSXRhbGljXCI7XG4kZmlsZTI6IFwiQ29vcGVySGV3aXR0LUJvbGRJdGFsaWNcIjtcbiRmYW1pbHkyOiBcIkNvb3Blckhld2l0dFwiO1xuJGNhdGVnb3J5MjogXCJzYW5zLXNlcmlmXCI7XG5cbkBtaXhpbiBmb250LWZhY2UoJENvb3Blckhld2l0dC1pdGFsaWMsICRmaWxlMiwgJGZhbWlseTIsICRjYXRlZ29yeTI6XCJcIikge1xuICAgICRmaWxlcGF0aDogXCIuLi9mb250cy9cIiArICRmYW1pbHkyICsgXCIvXCIgKyAkZmlsZTI7XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JENvb3Blckhld2l0dC1pdGFsaWN9XCI7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdFwiKTtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90PyNpZWZpeFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksIHVybCgkZmlsZXBhdGggKyBcIi53b2ZmXCIpIGZvcm1hdCgnd29mZicpLCB1cmwoJGZpbGVwYXRoICsgXCIudHRmXCIpICBmb3JtYXQoJ3RydWV0eXBlJyksIHVybCgkZmlsZXBhdGggKyBcIi5zdmcjXCIgKyAkQ29vcGVySGV3aXR0LWl0YWxpYyArIFwiXCIpIGZvcm1hdCgnc3ZnJyk7XG4gICAgfVxuICAgICUjeyRDb29wZXJIZXdpdHQtaXRhbGljfSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnkyICE9IFwiXCIge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRDb29wZXJIZXdpdHQtaXRhbGljfVwiLCAjeyRjYXRlZ29yeTJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skQ29vcGVySGV3aXR0LWl0YWxpY31cIjtcbiAgICAgICAgICAgICAgICAvLyB3ZWlnaHQ6IGl0YWxpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4kcnViaWs6IFwicnViaWtcIjtcbiRmaWxlMzogXCJSdWJpay1MaWdodFwiO1xuJGZhbWlseTM6IFwicnViaWtcIjtcbiRjYXRlZ29yeTM6IFwic2Fucy1zZXJpZlwiO1xuXG5cbkBtaXhpbiBmb250LWZhY2UoJHJ1YmlrLCAkZmlsZTMsICRmYW1pbHkzLCAkY2F0ZWdvcnkzOlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5MyArIFwiL1wiICsgJGZpbGUzO1xuICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCIjeyRydWJpa31cIjtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90XCIpO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3Q/I2llZml4XCIpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLndvZmZcIikgZm9ybWF0KCd3b2ZmJyksIHVybCgkZmlsZXBhdGggKyBcIi50dGZcIikgIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnN2ZyNcIiArICRydWJpayArIFwiXCIpIGZvcm1hdCgnc3ZnJyk7XG4gICAgfVxuICAgICUjeyRydWJpa30ge1xuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICBAaWYgJGNhdGVnb3J5MyAhPSBcIlwiIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skcnViaWt9XCIsICN7JGNhdGVnb3J5M307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JHJ1YmlrfVwiO1xuICAgICAgICAgICAgICAgIHdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4kcnViaWstQjogXCJSdWJpay1Cb2xkXCI7XG4kZmlsZTQ6IFwiUnViaWstQm9sZFwiO1xuXG5AbWl4aW4gZm9udC1mYWNlKCRydWJpay1CLCAkZmlsZTQsICRmYW1pbHkzLCAkY2F0ZWdvcnkzOlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5MyArIFwiL1wiICsgJGZpbGU0O1xuICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCIjeyRydWJpay1CfVwiO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3RcIik7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdD8jaWVmaXhcIikgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLCB1cmwoJGZpbGVwYXRoICsgXCIud29mZlwiKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnR0ZlwiKSAgZm9ybWF0KCd0cnVldHlwZScpLCB1cmwoJGZpbGVwYXRoICsgXCIuc3ZnI1wiICsgJHJ1YmlrLUIgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cbiAgICAlI3skcnViaWstQn0ge1xuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICBAaWYgJGNhdGVnb3J5MyAhPSBcIlwiIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skcnViaWstQn1cIiwgI3skY2F0ZWdvcnkzfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skcnViaWstQn1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuJGNtdTogXCJjbXUtY29uY3JldGUtaXRhXCI7XG4kZmlsZTU6IFwiY211bm90aVwiO1xuJGZhbWlseTU6IFwiQ29uY3JldGVcIjtcbiRjYXRlZ29yeTU6IFwic2VyaWZcIjtcblxuXG5AbWl4aW4gZm9udC1mYWNlKCRjbXUsICRmaWxlNSwgJGZhbWlseTUsICRjYXRlZ29yeTU6XCJcIikge1xuICAgICRmaWxlcGF0aDogXCIuLi9mb250cy9cIiArICRmYW1pbHk1ICsgXCIvXCIgKyAkZmlsZTU7XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JGNtdX1cIjtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90XCIpO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3Q/I2llZml4XCIpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLndvZmZcIikgZm9ybWF0KCd3b2ZmJyksIHVybCgkZmlsZXBhdGggKyBcIi50dGZcIikgIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnN2ZyNcIiArICRjbXUgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cbiAgICAlI3skY211fSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnk1ICE9IFwiXCIge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRjbXV9XCIsICN7JGNhdGVnb3J5NX07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JGNtdX1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vZm9udHNcbkBpbmNsdWRlIGZvbnQtZmFjZSgkQ29vcGVySGV3aXR0LCAkZmlsZSwgJGZhbWlseSwgJGNhdGVnb3J5KTtcbkBpbmNsdWRlIGZvbnQtZmFjZSgkQ29vcGVySGV3aXR0LWl0YWxpYywgJGZpbGUyLCAkZmFtaWx5MiwgJGNhdGVnb3J5Mik7XG5AaW5jbHVkZSBmb250LWZhY2UoJHJ1YmlrLCAkZmlsZTMsICRmYW1pbHkzLCAkY2F0ZWdvcnkzKTtcbkBpbmNsdWRlIGZvbnQtZmFjZSgkcnViaWstQiwgJGZpbGU0LCAkZmFtaWx5MywgJGNhdGVnb3J5Myk7XG5AaW5jbHVkZSBmb250LWZhY2UoJGNtdSwgJGZpbGU1LCAkZmFtaWx5NSwgJGNhdGVnb3J5NSk7XG5cbi8vIEZvbnRzLXNpemVcbi8vICRmSDFcbi8vICRmSDJcbi8vICRmSDNcbi8vICRmcFxuLy8gJGZlbVxuLy8gJGZib2xkXG5cbi8vIGhlYWRlclxuJGhlaWdodEg6ICgyNXB4KTtcblxuLy8gdGFpbGxlICYgcG9zaXRpb24gYmxvY3NcblxuLy8gaGVpZ2h0XG4kSDEwMDogMTAwJTtcbiRINTA6IGNhbGMoI3skSDEwMH0gLyAyKTtcbiRINTAtMjU6IGNhbGMoI3skSDEwMH0gLyAyICsgI3skaGVpZ2h0SH0pO1xuLy8gd2lkdGhcbiRXMTAwOiAxMDAlO1xuJFczMzogY2FsYygjeyRXMTAwfSAvIDMpO1xuXG4vLyB0b3BcbiRUMTAwOiAxMDAlO1xuXG4vLyByaWdodFxuJFIxMDA6IDEwMCU7XG5cbi8vYm90dG9tXG4kQjEwMDogMTAwJTtcblxuLy8gbGVmdFxuJEwxMDA6IDEwMCU7XG4kTDMzOiBjYWxjKCN7JEwxMDB9IC8gMyk7XG4kTDY2OiBjYWxjKCN7JEwzM30gKiAyKTtcbiIsIioge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuaHRtbCwgYm9keSwgZGl2LCBzcGFuLCBhcHBsZXQsIG9iamVjdCwgaWZyYW1lLFxuaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgYmxvY2txdW90ZSwgcHJlLFxuYSwgYWJiciwgYWNyb255bSwgYWRkcmVzcywgYmlnLCBjaXRlLCBjb2RlLFxuZGVsLCBkZm4sIGVtLCBpbWcsIGlucywga2JkLCBxLCBzLCBzYW1wLFxuc21hbGwsIHN0cmlrZSwgc3Ryb25nLCBzdWIsIHN1cCwgdHQsIHZhcixcbmIsIHUsIGksIGNlbnRlcixcbmRsLCBkdCwgZGQsIG9sLCB1bCwgbGksXG5maWVsZHNldCwgZm9ybSwgbGFiZWwsIGxlZ2VuZCxcbnRhYmxlLCBjYXB0aW9uLCB0Ym9keSwgdGZvb3QsIHRoZWFkLCB0ciwgdGgsIHRkLFxuYXJ0aWNsZSwgYXNpZGUsIGNhbnZhcywgZGV0YWlscywgZW1iZWQsXG5maWd1cmUsIGZpZ2NhcHRpb24sIGZvb3RlciwgaGVhZGVyLCBoZ3JvdXAsXG5tZW51LCBuYXYsIG91dHB1dCwgcnVieSwgc2VjdGlvbiwgc3VtbWFyeSxcbnRpbWUsIG1hcmssIGF1ZGlvLCB2aWRlbyB7XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAwO1xuXHRmb250LXNpemU6IDE2cHg7XG5cdGZvbnQ6IGluaGVyaXQ7XG5cdHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuLyogSFRNTDUgZGlzcGxheS1yb2xlIHJlc2V0IGZvciBvbGRlciBicm93c2VycyAqL1xuYXJ0aWNsZSwgYXNpZGUsIGRldGFpbHMsIGZpZ2NhcHRpb24sIGZpZ3VyZSxcbmZvb3RlciwgaGVhZGVyLCBoZ3JvdXAsIG1lbnUsIG5hdiwgc2VjdGlvbiB7XG5cdGRpc3BsYXk6IGJsb2NrO1xufVxuXG5odG1sLCBib2R5e1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbmJvZHkge1xuXHRsaW5lLWhlaWdodDogMTtcbn1cblxub2wsIHVsIHtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuYXtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRjb2xvcjpibGFjaztcbn1cblxuYmxvY2txdW90ZSwgcSB7XG5cdHF1b3Rlczogbm9uZTtcbn1cbmltZ3tcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0dmVydGljYWwtYWxpZ246IGJvdHRvbTtcbn1cblxuYmxvY2txdW90ZTpiZWZvcmUsIGJsb2NrcXVvdGU6YWZ0ZXIsXG5xOmJlZm9yZSwgcTphZnRlciB7XG5cdGNvbnRlbnQ6ICcnO1xuXHRjb250ZW50OiBub25lO1xufVxuXG50YWJsZSB7XG5cdGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG5cdGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG5we1xuXHRmb250LXN0eWxlOiBub3JtYWw7XG59XG5cbmVte1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbnN0cm9uZ3tcblx0Ly8gZm9udC13ZWlnaHQ6IGJvbGRlcjtcbiAgZm9udC1mYW1pbHk6ICRydWJpay1CO1xufVxuIiwiaDF7XG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xuICBsaW5lLWhlaWdodDogNTBweDtcbiAgYXtcbiAgICBmb250LWZhbWlseTogJENvb3Blckhld2l0dDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICB9XG59XG5cbmgye1xuICBmb250LWZhbWlseTogJENvb3Blckhld2l0dC1pdGFsaWM7XG4gIGZvbnQtc2l6ZTogMS4xcmVtO1xuICBsaW5lLWhlaWdodDogNTBweDtcbn1cblxucHtcbiAgZm9udC1mYW1pbHk6ICRydWJpaztcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS4zcmVtO1xuICBhe1xuICAgIGZvbnQtZmFtaWx5OiAkY211O1xuICB9XG59XG5cbi50b3B7XG4gICYgPiBkaXZ7XG4gICAgJjpudGgtY2hpbGQoMSl7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgICBhe1xuICAgICAgICBjb2xvcjogcmdiKDI1NSwgMCwgODQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiI2hlYWRlcntcbiAgcGFkZGluZzogMCAyMHB4O1xufVxuIiwiYm9keXtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuI3BhZ2V7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZDpyZ2IoMjMwLCAyMzAsIDIzMCk7XG4gIC5uYXZiYXJ7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA1MHB4O1xuICB9XG4gIC5oYW5kbGVye1xuICAgIHdpZHRoOiA1MHB4O1xuICAgIGhlaWdodDogNTBweDtcbiAgICBib3JkZXItcmFkaXVzOiAyNXB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDUwJTtcbiAgICB6LWluZGV4OiA5OTk7XG4gICAgY3Vyc29yOiBncmFiO1xuICB9XG4gIC5oYW5kMXtcbiAgICBiYWNrZ3JvdW5kOiBncmVlbjtcbiAgICBvcGFjaXR5OiAwLjU7XG4gICAgbGVmdCA6IGNhbGMoKDEwMCUvMykgLSAyNXB4KTtcbiAgfVxuXG4gIC5oYW5kMntcbiAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgb3BhY2l0eTogMC41O1xuICAgIHJpZ2h0OiBjYWxjKCgxMDAlLzMpIC0gMjVweCk7XG4gIH1cblxuICAubW91c2VEb3due1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gIH1cblxuICAjc3RhcnR7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA1MHB4KTtcbiAgICAudG9wLCAuYm90dG9te1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICB9XG4gICAgaW1ne1xuICAgICAgZmlsdGVyOiBncmF5c2NhbGUoMTAwJSkgY29udHJhc3QoNCk7XG4gICAgICB0cmFuc2l0aW9uOiBmaWx0ZXIgMC41cztcbiAgICAgICY6aG92ZXJ7XG4gICAgICAgIGZpbHRlcjogZ3JheXNjYWxlKDAlKTtcbiAgICAgICAgdHJhbnNpdGlvbjogZmlsdGVyIDAuNXM7XG4gICAgICB9XG4gICAgfVxuICAgIC50b3B7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBoZWlnaHQ6ICRINTA7XG4gICAgICAmID4gZGl2e1xuICAgICAgICAmOm50aC1jaGlsZCgtbisyKXtcbiAgICAgICAgICBwYWRkaW5nOiAwcHggMjBweDtcbiAgICAgICAgfVxuICAgICAgICAmOm50aC1jaGlsZCgxKXtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMTUwLCAxNTAsIDE1MCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLmJvdHRvbXtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogYXV0bztcbiAgICAgIHRvcDogJEg1MC0yNTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgICYgPiBkaXZ7XG4gICAgICAgICY6bnRoLWNoaWxkKDEpe1xuICAgICAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuICAgIC5ibG9jc3tcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBtYXJnaW46IDJweDtcbiAgICAgIHdpZHRoOiAkVzMzO1xuICAgICAgbWluLXdpZHRoOiAyMDBweDtcbiAgICAgICY6bnRoLWNoaWxkKDIpe1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgbGVmdDogJEwzMztcbiAgICAgIH1cbiAgICAgICY6bnRoLWNoaWxkKDMpe1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUMyR0ksVUFBVSxHQUNOLFdBQVcsRUFBRSxjQUFTLEVBQ3RCLEdBQUcsRUFBRSxrREFBdUIsRUFDNUIsR0FBRyxFQUFFLHlEQUE4QixDQUFDLDJCQUEyQixFQUFFLG1EQUF3QixDQUFDLGNBQWMsRUFBRSxrREFBdUIsQ0FBRSxrQkFBa0IsRUFBRSwrREFBb0MsQ0FBQyxhQUFhOztBQUg3TSxVQUFVLEdBQ04sV0FBVyxFQUFFLHlCQUFTLEVBQ3RCLEdBQUcsRUFBRSx3REFBdUIsRUFDNUIsR0FBRyxFQUFFLCtEQUE4QixDQUFDLDJCQUEyQixFQUFFLHlEQUF3QixDQUFDLGNBQWMsRUFBRSx3REFBdUIsQ0FBRSxrQkFBa0IsRUFBRSxnRkFBb0MsQ0FBQyxhQUFhOztBQUg3TSxVQUFVLEdBQ04sV0FBVyxFQUFFLE9BQVMsRUFDdEIsR0FBRyxFQUFFLHFDQUF1QixFQUM1QixHQUFHLEVBQUUsNENBQThCLENBQUMsMkJBQTJCLEVBQUUsc0NBQXdCLENBQUMsY0FBYyxFQUFFLHFDQUF1QixDQUFFLGtCQUFrQixFQUFFLDJDQUFvQyxDQUFDLGFBQWE7O0FBSDdNLFVBQVUsR0FDTixXQUFXLEVBQUUsWUFBUyxFQUN0QixHQUFHLEVBQUUsb0NBQXVCLEVBQzVCLEdBQUcsRUFBRSwyQ0FBOEIsQ0FBQywyQkFBMkIsRUFBRSxxQ0FBd0IsQ0FBQyxjQUFjLEVBQUUsb0NBQXVCLENBQUUsa0JBQWtCLEVBQUUsK0NBQW9DLENBQUMsYUFBYTs7QUFIN00sVUFBVSxHQUNOLFdBQVcsRUFBRSxrQkFBUyxFQUN0QixHQUFHLEVBQUUsb0NBQXVCLEVBQzVCLEdBQUcsRUFBRSwyQ0FBOEIsQ0FBQywyQkFBMkIsRUFBRSxxQ0FBd0IsQ0FBQyxjQUFjLEVBQUUsb0NBQXVCLENBQUUsa0JBQWtCLEVBQUUscURBQW9DLENBQUMsYUFBYTs7QUU5R2pOLEFBQUEsQ0FBQyxDQUFDLEVBQ0Esa0JBQWtCLEVBQUUsVUFBVSxFQUN0QixVQUFVLEVBQUUsVUFBVSxHQUMvQjs7QUFFRCxBQUFBLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFDN0MsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQzFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDMUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQ3ZDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFDeEMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUN0QixRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQzdCLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQ3RDLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQzFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUN6QyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFDeEIsTUFBTSxFQUFFLENBQUMsRUFDVCxPQUFPLEVBQUUsQ0FBQyxFQUNWLE1BQU0sRUFBRSxDQUFDLEVBQ1QsU0FBUyxFQUFFLElBQUksRUFDZixJQUFJLEVBQUUsT0FBTyxFQUNiLGNBQWMsRUFBRSxRQUFRLEdBQ3hCOztBQUVELGlEQUFpRDtBQUNqRCxBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQzNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQzFDLE9BQU8sRUFBRSxLQUFLLEdBQ2Q7O0FBRUQsQUFBQSxJQUFJLEVBQUUsSUFBSSxDQUFBLEVBQ1IsTUFBTSxFQUFFLElBQUksR0FDYjs7QUFFRCxBQUFBLElBQUksQ0FBQyxFQUNKLFdBQVcsRUFBRSxDQUFDLEdBQ2Q7O0FBRUQsQUFBQSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQ04sVUFBVSxFQUFFLElBQUksR0FDaEI7O0FBRUQsQUFBQSxDQUFDLENBQUEsRUFDQSxlQUFlLEVBQUUsSUFBSSxFQUNyQixLQUFLLEVBQUMsS0FBSyxHQUNYOztBQUVELEFBQUEsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUNiLE1BQU0sRUFBRSxJQUFJLEdBQ1o7O0FBQ0QsQUFBQSxHQUFHLENBQUEsRUFDRixLQUFLLEVBQUUsSUFBSSxFQUNYLE1BQU0sRUFBRSxJQUFJLEVBQ1osY0FBYyxFQUFFLE1BQU0sR0FDdEI7O0FBRUQsQUFBQSxVQUFVLEFBQUEsT0FBTyxFQUFFLFVBQVUsQUFBQSxNQUFNLEVBQ25DLENBQUMsQUFBQSxPQUFPLEVBQUUsQ0FBQyxBQUFBLE1BQU0sQ0FBQyxFQUNqQixPQUFPLEVBQUUsRUFBRSxFQUNYLE9BQU8sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBQSxLQUFLLENBQUMsRUFDTCxlQUFlLEVBQUUsUUFBUSxFQUN6QixjQUFjLEVBQUUsQ0FBQyxHQUNqQjs7QUFFRCxBQUFBLENBQUMsQ0FBQSxFQUNBLFVBQVUsRUFBRSxNQUFNLEdBQ2xCOztBQUVELEFBQUEsRUFBRSxDQUFBLEVBQ0QsVUFBVSxFQUFFLE1BQU0sR0FDbEI7O0FBRUQsQUFBQSxNQUFNLENBQUEsRUFFSixXQUFXLEVGSEgsWUFBWSxHRUlyQjs7QUNoRkQsQUFBQSxFQUFFLENBQUEsRUFDQSxTQUFTLEVBQUUsTUFBTSxFQUNqQixXQUFXLEVBQUUsSUFBSSxHQUtsQjs7QUFQRCxBQUdFLEVBSEEsQ0FHQSxDQUFDLENBQUEsRUFDQyxXQUFXLEVISkEsY0FBYyxFR0t6QixXQUFXLEVBQUUsTUFBTSxHQUNwQjs7QUFHSCxBQUFBLEVBQUUsQ0FBQSxFQUNBLFdBQVcsRUhlUyx5QkFBeUIsRUdkN0MsU0FBUyxFQUFFLE1BQU0sRUFDakIsV0FBVyxFQUFFLElBQUksR0FDbEI7O0FBRUQsQUFBQSxDQUFDLENBQUEsRUFDQyxXQUFXLEVIa0NMLE9BQU8sRUdqQ2IsU0FBUyxFQUFFLElBQUksRUFDZixXQUFXLEVBQUUsTUFBTSxHQUlwQjs7QUFQRCxBQUlFLENBSkQsQ0FJQyxDQUFDLENBQUEsRUFDQyxXQUFXLEVIK0VULGtCQUFrQixHRzlFckI7O0FBR0gsQUFFSSxJQUZBLEdBQ0UsR0FBRyxBQUNKLFVBQVcsQ0FBQSxDQUFDLEVBQUMsRUFDWixLQUFLLEVBQUUsS0FBSyxHQUliOztBQVBMLEFBSU0sSUFKRixHQUNFLEdBQUcsQUFDSixVQUFXLENBQUEsQ0FBQyxFQUVYLENBQUMsQ0FBQSxFQUNDLEtBQUssRUFBRSxPQUFlLEdBQ3ZCOztBQzlCUCxBQUFBLE9BQU8sQ0FBQSxFQUNMLE9BQU8sRUFBRSxNQUFNLEdBQ2hCOztBQ0ZELEFBQUEsSUFBSSxDQUFBLEVBQ0YsUUFBUSxFQUFFLE1BQU0sR0FDakI7O0FBRUQsQUFBQSxLQUFLLENBQUEsRUFDSCxNQUFNLEVBQUUsSUFBSSxFQUNaLFVBQVUsRUFBQyxPQUFrQixHQW9GOUI7O0FBdEZELEFBR0UsS0FIRyxDQUdILE9BQU8sQ0FBQSxFQUNMLEtBQUssRUFBRSxJQUFJLEVBQ1gsTUFBTSxFQUFFLElBQUksR0FDYjs7QUFOSCxBQU9FLEtBUEcsQ0FPSCxRQUFRLENBQUEsRUFDTixLQUFLLEVBQUUsSUFBSSxFQUNYLE1BQU0sRUFBRSxJQUFJLEVBQ1osYUFBYSxFQUFFLElBQUksRUFDbkIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsR0FBRyxFQUFFLEdBQUcsRUFDUixPQUFPLEVBQUUsR0FBRyxFQUNaLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBZkgsQUFnQkUsS0FoQkcsQ0FnQkgsTUFBTSxDQUFBLEVBQ0osVUFBVSxFQUFFLEtBQUssRUFDakIsT0FBTyxFQUFFLEdBQUcsRUFDWixJQUFJLEVBQUcscUJBQXFCLEdBQzdCOztBQXBCSCxBQXNCRSxLQXRCRyxDQXNCSCxNQUFNLENBQUEsRUFDSixVQUFVLEVBQUUsR0FBRyxFQUNmLE9BQU8sRUFBRSxHQUFHLEVBQ1osS0FBSyxFQUFFLHFCQUFxQixHQUM3Qjs7QUExQkgsQUE0QkUsS0E1QkcsQ0E0QkgsVUFBVSxDQUFBLEVBQ1IsTUFBTSxFQUFFLFFBQVEsR0FDakI7O0FBOUJILEFBZ0NFLEtBaENHLENBZ0NILE1BQU0sQ0FBQSxFQUNKLEtBQUssRUFBRSxJQUFJLEVBQ1gsTUFBTSxFQUFFLGlCQUFpQixHQW1EMUI7O0FBckZILEFBbUNJLEtBbkNDLENBZ0NILE1BQU0sQ0FHSixJQUFJLEVBbkNSLEtBQUssQ0FnQ0gsTUFBTSxDQUdFLE9BQU8sQ0FBQSxFQUNYLEtBQUssRUFBRSxJQUFJLEVBQ1gsT0FBTyxFQUFFLFdBQVcsRUFDcEIsZUFBZSxFQUFFLGFBQWEsR0FDL0I7O0FBdkNMLEFBd0NJLEtBeENDLENBZ0NILE1BQU0sQ0FRSixHQUFHLENBQUEsRUFDRCxNQUFNLEVBQUUsZUFBZSxDQUFDLFdBQVcsRUFDbkMsVUFBVSxFQUFFLFdBQVcsR0FLeEI7O0FBL0NMLEFBMkNNLEtBM0NELENBZ0NILE1BQU0sQ0FRSixHQUFHLEFBR0EsTUFBTSxDQUFBLEVBQ0wsTUFBTSxFQUFFLGFBQWEsRUFDckIsVUFBVSxFQUFFLFdBQVcsR0FDeEI7O0FBOUNQLEFBZ0RJLEtBaERDLENBZ0NILE1BQU0sQ0FnQkosSUFBSSxDQUFBLEVBQ0YsUUFBUSxFQUFFLFFBQVEsRUFDbEIsTUFBTSxFSmhDTixjQUFrQixHSXlDbkI7O0FBM0RMLEFBb0RRLEtBcERILENBZ0NILE1BQU0sQ0FnQkosSUFBSSxHQUdFLEdBQUcsQUFDSixVQUFXLENBQUEsSUFBSSxFQUFDLEVBQ2YsT0FBTyxFQUFFLFFBQVEsR0FDbEI7O0FBdERULEFBdURRLEtBdkRILENBZ0NILE1BQU0sQ0FnQkosSUFBSSxHQUdFLEdBQUcsQUFJSixVQUFXLENBQUEsQ0FBQyxFQUFDLEVBQ1osVUFBVSxFQUFFLE9BQWtCLEdBQy9COztBQXpEVCxBQTRESSxLQTVEQyxDQWdDSCxNQUFNLENBNEJKLE9BQU8sQ0FBQSxFQUNMLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLE1BQU0sRUFBRSxJQUFJLEVBQ1osR0FBRyxFSjVDQSxxQkFBZ0MsRUk2Q25DLE1BQU0sRUFBRSxDQUFDLEdBT1Y7O0FBdkVMLEFBa0VRLEtBbEVILENBZ0NILE1BQU0sQ0E0QkosT0FBTyxHQUtELEdBQUcsQUFDSixVQUFXLENBQUEsQ0FBQyxFQUFDLEVBQ1osVUFBVSxFQUFFLEdBQUcsR0FDaEI7O0FBcEVULEFBd0VJLEtBeEVDLENBZ0NILE1BQU0sQ0F3Q0osTUFBTSxDQUFBLEVBQ0osVUFBVSxFQUFFLElBQUksRUFDaEIsTUFBTSxFQUFFLEdBQUcsRUFDWCxLQUFLLEVKckRMLGNBQWtCLEVJc0RsQixTQUFTLEVBQUUsS0FBSyxHQVFqQjs7QUFwRkwsQUE2RU0sS0E3RUQsQ0FnQ0gsTUFBTSxDQXdDSixNQUFNLEFBS0gsVUFBVyxDQUFBLENBQUMsRUFBQyxFQUNaLFVBQVUsRUFBRSxLQUFLLEVBQ2pCLElBQUksRUo1Q04sY0FBa0IsR0k2Q2pCOztBQWhGUCxBQWlGTSxLQWpGRCxDQWdDSCxNQUFNLENBd0NKLE1BQU0sQUFTSCxVQUFXLENBQUEsQ0FBQyxFQUFDLEVBQ1osVUFBVSxFQUFFLEtBQUssR0FDbEIifQ== */ +#mapid { height: 180px; } + +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY3NzIiwic291cmNlcyI6WyJ0ZW1wbGF0ZS5zY3NzIiwiY29uZmlndXJhdGlvbi9fbWl4aW4uc2NzcyIsImNvbmZpZ3VyYXRpb24vX2NvbmZpZy5zY3NzIiwidGVtcGxhdGUvX3Jlc2V0LnNjc3MiLCJ0ZW1wbGF0ZS9fdHlwb2dyYXBoeS5zY3NzIiwidGVtcGxhdGUvX2hlYWRlci5zY3NzIiwidGVtcGxhdGUvX3NlY3Rpb24uc2NzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvL2NvbmZpZ3VyYXRpb25cbkBpbXBvcnQgXCJjb25maWd1cmF0aW9uL21peGluXCI7XG5AaW1wb3J0IFwiY29uZmlndXJhdGlvbi9jb25maWdcIjtcblxuLy9yZXNldCRcbkBpbXBvcnQgXCJ0ZW1wbGF0ZS9yZXNldFwiO1xuXG4vLyBUeXBvZ3JhcGh5XG5AaW1wb3J0IFwidGVtcGxhdGUvdHlwb2dyYXBoeVwiO1xuXG4vLyBIZWFkZXJcbkBpbXBvcnQgXCJ0ZW1wbGF0ZS9oZWFkZXJcIjtcblxuLy9zZWN0aW9uXG5AaW1wb3J0IFwidGVtcGxhdGUvc2VjdGlvblwiO1xuLy8gQGltcG9ydCBcInRlbXBsYXRlL3NlY3Rpb24tbWVkaWEtcXVlcmllc1wiO1xuXG4vLyBGb290ZXJcbi8vIEBpbXBvcnQgXCJ0ZW1wbGF0ZS9mb290ZXJcIjtcbiIsIiRDb29wZXJIZXdpdHQ6IFwiQ29vcGVySGV3aXR0XCI7XG4kZmlsZTogXCJDb29wZXJIZXdpdHQtQm9sZFwiO1xuJGZhbWlseTogXCJDb29wZXJIZXdpdHRcIjtcbiRjYXRlZ29yeTogXCJzYW5zLXNlcmlmXCI7XG5cbkBtaXhpbiBmb250LWZhY2UoJENvb3Blckhld2l0dCwgJGZpbGUsICRmYW1pbHksICRjYXRlZ29yeTpcIlwiKSB7XG4gICAgJGZpbGVwYXRoOiBcIi4uL2ZvbnRzL1wiICsgJGZhbWlseSArIFwiL1wiICsgJGZpbGU7XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JENvb3Blckhld2l0dH1cIjtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90XCIpO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3Q/I2llZml4XCIpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLndvZmZcIikgZm9ybWF0KCd3b2ZmJyksIHVybCgkZmlsZXBhdGggKyBcIi50dGZcIikgIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnN2ZyNcIiArICRDb29wZXJIZXdpdHQgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cbiAgICAlI3skQ29vcGVySGV3aXR0fSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnkgIT0gXCJcIiB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JENvb3Blckhld2l0dH1cIiwgI3skY2F0ZWdvcnl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRDb29wZXJIZXdpdHR9XCI7XG4gICAgICAgICAgICAgICAgd2VpZ2h0OiBub3JtYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiRDb29wZXJIZXdpdHQtaXRhbGljOiBcIkNvb3Blckhld2l0dC1Cb2xkSXRhbGljXCI7XG4kZmlsZTI6IFwiQ29vcGVySGV3aXR0LUJvbGRJdGFsaWNcIjtcbiRmYW1pbHkyOiBcIkNvb3Blckhld2l0dFwiO1xuJGNhdGVnb3J5MjogXCJzYW5zLXNlcmlmXCI7XG5cbkBtaXhpbiBmb250LWZhY2UoJENvb3Blckhld2l0dC1pdGFsaWMsICRmaWxlMiwgJGZhbWlseTIsICRjYXRlZ29yeTI6XCJcIikge1xuICAgICRmaWxlcGF0aDogXCIuLi9mb250cy9cIiArICRmYW1pbHkyICsgXCIvXCIgKyAkZmlsZTI7XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JENvb3Blckhld2l0dC1pdGFsaWN9XCI7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdFwiKTtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90PyNpZWZpeFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksIHVybCgkZmlsZXBhdGggKyBcIi53b2ZmXCIpIGZvcm1hdCgnd29mZicpLCB1cmwoJGZpbGVwYXRoICsgXCIudHRmXCIpICBmb3JtYXQoJ3RydWV0eXBlJyksIHVybCgkZmlsZXBhdGggKyBcIi5zdmcjXCIgKyAkQ29vcGVySGV3aXR0LWl0YWxpYyArIFwiXCIpIGZvcm1hdCgnc3ZnJyk7XG4gICAgfVxuICAgICUjeyRDb29wZXJIZXdpdHQtaXRhbGljfSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnkyICE9IFwiXCIge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRDb29wZXJIZXdpdHQtaXRhbGljfVwiLCAjeyRjYXRlZ29yeTJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skQ29vcGVySGV3aXR0LWl0YWxpY31cIjtcbiAgICAgICAgICAgICAgICAvLyB3ZWlnaHQ6IGl0YWxpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4kcnViaWs6IFwicnViaWtcIjtcbiRmaWxlMzogXCJSdWJpay1MaWdodFwiO1xuJGZhbWlseTM6IFwicnViaWtcIjtcbiRjYXRlZ29yeTM6IFwic2Fucy1zZXJpZlwiO1xuXG5cbkBtaXhpbiBmb250LWZhY2UoJHJ1YmlrLCAkZmlsZTMsICRmYW1pbHkzLCAkY2F0ZWdvcnkzOlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5MyArIFwiL1wiICsgJGZpbGUzO1xuICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCIjeyRydWJpa31cIjtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90XCIpO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3Q/I2llZml4XCIpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLndvZmZcIikgZm9ybWF0KCd3b2ZmJyksIHVybCgkZmlsZXBhdGggKyBcIi50dGZcIikgIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnN2ZyNcIiArICRydWJpayArIFwiXCIpIGZvcm1hdCgnc3ZnJyk7XG4gICAgfVxuICAgICUjeyRydWJpa30ge1xuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICBAaWYgJGNhdGVnb3J5MyAhPSBcIlwiIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skcnViaWt9XCIsICN7JGNhdGVnb3J5M307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JHJ1YmlrfVwiO1xuICAgICAgICAgICAgICAgIHdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4kcnViaWstQjogXCJSdWJpay1Cb2xkXCI7XG4kZmlsZTQ6IFwiUnViaWstQm9sZFwiO1xuXG5AbWl4aW4gZm9udC1mYWNlKCRydWJpay1CLCAkZmlsZTQsICRmYW1pbHkzLCAkY2F0ZWdvcnkzOlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5MyArIFwiL1wiICsgJGZpbGU0O1xuICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCIjeyRydWJpay1CfVwiO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3RcIik7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdD8jaWVmaXhcIikgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLCB1cmwoJGZpbGVwYXRoICsgXCIud29mZlwiKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnR0ZlwiKSAgZm9ybWF0KCd0cnVldHlwZScpLCB1cmwoJGZpbGVwYXRoICsgXCIuc3ZnI1wiICsgJHJ1YmlrLUIgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cbiAgICAlI3skcnViaWstQn0ge1xuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICBAaWYgJGNhdGVnb3J5MyAhPSBcIlwiIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skcnViaWstQn1cIiwgI3skY2F0ZWdvcnkzfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skcnViaWstQn1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuJGNtdTogXCJjbXUtY29uY3JldGUtaXRhXCI7XG4kZmlsZTU6IFwiY211bm90aVwiO1xuJGZhbWlseTU6IFwiQ29uY3JldGVcIjtcbiRjYXRlZ29yeTU6IFwic2VyaWZcIjtcblxuXG5AbWl4aW4gZm9udC1mYWNlKCRjbXUsICRmaWxlNSwgJGZhbWlseTUsICRjYXRlZ29yeTU6XCJcIikge1xuICAgICRmaWxlcGF0aDogXCIuLi9mb250cy9cIiArICRmYW1pbHk1ICsgXCIvXCIgKyAkZmlsZTU7XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JGNtdX1cIjtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90XCIpO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3Q/I2llZml4XCIpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLndvZmZcIikgZm9ybWF0KCd3b2ZmJyksIHVybCgkZmlsZXBhdGggKyBcIi50dGZcIikgIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCRmaWxlcGF0aCArIFwiLnN2ZyNcIiArICRjbXUgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cbiAgICAlI3skY211fSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnk1ICE9IFwiXCIge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRjbXV9XCIsICN7JGNhdGVnb3J5NX07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JGNtdX1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vZm9udHNcbkBpbmNsdWRlIGZvbnQtZmFjZSgkQ29vcGVySGV3aXR0LCAkZmlsZSwgJGZhbWlseSwgJGNhdGVnb3J5KTtcbkBpbmNsdWRlIGZvbnQtZmFjZSgkQ29vcGVySGV3aXR0LWl0YWxpYywgJGZpbGUyLCAkZmFtaWx5MiwgJGNhdGVnb3J5Mik7XG5AaW5jbHVkZSBmb250LWZhY2UoJHJ1YmlrLCAkZmlsZTMsICRmYW1pbHkzLCAkY2F0ZWdvcnkzKTtcbkBpbmNsdWRlIGZvbnQtZmFjZSgkcnViaWstQiwgJGZpbGU0LCAkZmFtaWx5MywgJGNhdGVnb3J5Myk7XG5AaW5jbHVkZSBmb250LWZhY2UoJGNtdSwgJGZpbGU1LCAkZmFtaWx5NSwgJGNhdGVnb3J5NSk7XG5cbi8vIEZvbnRzLXNpemVcbi8vICRmSDFcbi8vICRmSDJcbi8vICRmSDNcbi8vICRmcFxuLy8gJGZlbVxuLy8gJGZib2xkXG5cbi8vIGhlYWRlclxuJGhlaWdodEg6ICgyNXB4KTtcblxuLy8gdGFpbGxlICYgcG9zaXRpb24gYmxvY3NcblxuLy8gaGVpZ2h0XG4kSDEwMDogMTAwJTtcbiRINTA6IGNhbGMoI3skSDEwMH0gLyAyKTtcbiRINTAtMjU6IGNhbGMoI3skSDEwMH0gLyAyICsgI3skaGVpZ2h0SH0pO1xuLy8gd2lkdGhcbiRXMTAwOiAxMDAlO1xuJFczMzogY2FsYygjeyRXMTAwfSAvIDMpO1xuXG4vLyB0b3BcbiRUMTAwOiAxMDAlO1xuXG4vLyByaWdodFxuJFIxMDA6IDEwMCU7XG5cbi8vYm90dG9tXG4kQjEwMDogMTAwJTtcblxuLy8gbGVmdFxuJEwxMDA6IDEwMCU7XG4kTDMzOiBjYWxjKCN7JEwxMDB9IC8gMyk7XG4kTDY2OiBjYWxjKCN7JEwzM30gKiAyKTtcbiIsIioge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuaHRtbCwgYm9keSwgZGl2LCBzcGFuLCBhcHBsZXQsIG9iamVjdCwgaWZyYW1lLFxuaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgYmxvY2txdW90ZSwgcHJlLFxuYSwgYWJiciwgYWNyb255bSwgYWRkcmVzcywgYmlnLCBjaXRlLCBjb2RlLFxuZGVsLCBkZm4sIGVtLCBpbWcsIGlucywga2JkLCBxLCBzLCBzYW1wLFxuc21hbGwsIHN0cmlrZSwgc3Ryb25nLCBzdWIsIHN1cCwgdHQsIHZhcixcbmIsIHUsIGksIGNlbnRlcixcbmRsLCBkdCwgZGQsIG9sLCB1bCwgbGksXG5maWVsZHNldCwgZm9ybSwgbGFiZWwsIGxlZ2VuZCxcbnRhYmxlLCBjYXB0aW9uLCB0Ym9keSwgdGZvb3QsIHRoZWFkLCB0ciwgdGgsIHRkLFxuYXJ0aWNsZSwgYXNpZGUsIGNhbnZhcywgZGV0YWlscywgZW1iZWQsXG5maWd1cmUsIGZpZ2NhcHRpb24sIGZvb3RlciwgaGVhZGVyLCBoZ3JvdXAsXG5tZW51LCBuYXYsIG91dHB1dCwgcnVieSwgc2VjdGlvbiwgc3VtbWFyeSxcbnRpbWUsIG1hcmssIGF1ZGlvLCB2aWRlbyB7XG5cdG1hcmdpbjogMDtcblx0cGFkZGluZzogMDtcblx0Ym9yZGVyOiAwO1xuXHRmb250LXNpemU6IDE2cHg7XG5cdGZvbnQ6IGluaGVyaXQ7XG5cdHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuLyogSFRNTDUgZGlzcGxheS1yb2xlIHJlc2V0IGZvciBvbGRlciBicm93c2VycyAqL1xuYXJ0aWNsZSwgYXNpZGUsIGRldGFpbHMsIGZpZ2NhcHRpb24sIGZpZ3VyZSxcbmZvb3RlciwgaGVhZGVyLCBoZ3JvdXAsIG1lbnUsIG5hdiwgc2VjdGlvbiB7XG5cdGRpc3BsYXk6IGJsb2NrO1xufVxuXG5odG1sLCBib2R5e1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbmJvZHkge1xuXHRsaW5lLWhlaWdodDogMTtcbn1cblxub2wsIHVsIHtcblx0bGlzdC1zdHlsZTogbm9uZTtcbn1cblxuYXtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRjb2xvcjpibGFjaztcbn1cblxuYmxvY2txdW90ZSwgcSB7XG5cdHF1b3Rlczogbm9uZTtcbn1cbmltZ3tcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0dmVydGljYWwtYWxpZ246IGJvdHRvbTtcbn1cblxuYmxvY2txdW90ZTpiZWZvcmUsIGJsb2NrcXVvdGU6YWZ0ZXIsXG5xOmJlZm9yZSwgcTphZnRlciB7XG5cdGNvbnRlbnQ6ICcnO1xuXHRjb250ZW50OiBub25lO1xufVxuXG50YWJsZSB7XG5cdGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG5cdGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG5we1xuXHRmb250LXN0eWxlOiBub3JtYWw7XG59XG5cbmVte1xuXHRmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbnN0cm9uZ3tcblx0Ly8gZm9udC13ZWlnaHQ6IGJvbGRlcjtcbiAgZm9udC1mYW1pbHk6ICRydWJpay1CO1xufVxuIiwiaDF7XG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xuICBsaW5lLWhlaWdodDogNTBweDtcbiAgYXtcbiAgICBmb250LWZhbWlseTogJENvb3Blckhld2l0dDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICB9XG59XG5cbmgye1xuICBmb250LWZhbWlseTogJENvb3Blckhld2l0dC1pdGFsaWM7XG4gIGZvbnQtc2l6ZTogMS4xcmVtO1xuICBsaW5lLWhlaWdodDogNTBweDtcbn1cblxucHtcbiAgZm9udC1mYW1pbHk6ICRydWJpaztcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS4zcmVtO1xuICBhe1xuICAgIGZvbnQtZmFtaWx5OiAkY211O1xuICB9XG59XG5cbi50b3B7XG4gICYgPiBkaXZ7XG4gICAgJjpudGgtY2hpbGQoMSl7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgICBhe1xuICAgICAgICBjb2xvcjogcmdiKDI1NSwgMCwgODQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiI2hlYWRlcntcbiAgcGFkZGluZzogMCAyMHB4O1xufVxuIiwiYm9keXtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuI3BhZ2V7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZDpyZ2IoMjMwLCAyMzAsIDIzMCk7XG4gIC5uYXZiYXJ7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA1MHB4O1xuICB9XG4gIC5oYW5kbGVye1xuICAgIHdpZHRoOiA1MHB4O1xuICAgIGhlaWdodDogNTBweDtcbiAgICBib3JkZXItcmFkaXVzOiAyNXB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDUwJTtcbiAgICB6LWluZGV4OiA5OTk7XG4gICAgY3Vyc29yOiBncmFiO1xuICB9XG4gIC5oYW5kMXtcbiAgICBiYWNrZ3JvdW5kOiBncmVlbjtcbiAgICBvcGFjaXR5OiAwLjU7XG4gICAgbGVmdCA6IGNhbGMoKDEwMCUvMykgLSAyNXB4KTtcbiAgfVxuXG4gIC5oYW5kMntcbiAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgb3BhY2l0eTogMC41O1xuICAgIHJpZ2h0OiBjYWxjKCgxMDAlLzMpIC0gMjVweCk7XG4gIH1cblxuICAubW91c2VEb3due1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gIH1cblxuICAjc3RhcnR7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA1MHB4KTtcbiAgICAudG9wLCAuYm90dG9te1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICB9XG4gICAgaW1ne1xuICAgICAgZmlsdGVyOiBncmF5c2NhbGUoMTAwJSkgY29udHJhc3QoNCk7XG4gICAgICB0cmFuc2l0aW9uOiBmaWx0ZXIgMC41cztcbiAgICAgICY6aG92ZXJ7XG4gICAgICAgIGZpbHRlcjogZ3JheXNjYWxlKDAlKTtcbiAgICAgICAgdHJhbnNpdGlvbjogZmlsdGVyIDAuNXM7XG4gICAgICB9XG4gICAgfVxuICAgIC50b3B7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBoZWlnaHQ6ICRINTA7XG4gICAgICAmID4gZGl2e1xuICAgICAgICAmOm50aC1jaGlsZCgtbisyKXtcbiAgICAgICAgICBwYWRkaW5nOiAwcHggMjBweDtcbiAgICAgICAgfVxuICAgICAgICAmOm50aC1jaGlsZCgxKXtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMTUwLCAxNTAsIDE1MCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLmJvdHRvbXtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogYXV0bztcbiAgICAgIHRvcDogJEg1MC0yNTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgICYgPiBkaXZ7XG4gICAgICAgICY6bnRoLWNoaWxkKDEpe1xuICAgICAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuICAgIC5ibG9jc3tcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBtYXJnaW46IDJweDtcbiAgICAgIHdpZHRoOiAkVzMzO1xuICAgICAgbWluLXdpZHRoOiAyMDBweDtcbiAgICAgICY6bnRoLWNoaWxkKDIpe1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgbGVmdDogJEwzMztcbiAgICAgIH1cbiAgICAgICY6bnRoLWNoaWxkKDMpe1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuI21hcGlkIHsgaGVpZ2h0OiAxODBweDsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQzJHSSxVQUFVLEdBQ04sV0FBVyxFQUFFLGNBQVMsRUFDdEIsR0FBRyxFQUFFLGtEQUF1QixFQUM1QixHQUFHLEVBQUUseURBQThCLENBQUMsMkJBQTJCLEVBQUUsbURBQXdCLENBQUMsY0FBYyxFQUFFLGtEQUF1QixDQUFFLGtCQUFrQixFQUFFLCtEQUFvQyxDQUFDLGFBQWE7O0FBSDdNLFVBQVUsR0FDTixXQUFXLEVBQUUseUJBQVMsRUFDdEIsR0FBRyxFQUFFLHdEQUF1QixFQUM1QixHQUFHLEVBQUUsK0RBQThCLENBQUMsMkJBQTJCLEVBQUUseURBQXdCLENBQUMsY0FBYyxFQUFFLHdEQUF1QixDQUFFLGtCQUFrQixFQUFFLGdGQUFvQyxDQUFDLGFBQWE7O0FBSDdNLFVBQVUsR0FDTixXQUFXLEVBQUUsT0FBUyxFQUN0QixHQUFHLEVBQUUscUNBQXVCLEVBQzVCLEdBQUcsRUFBRSw0Q0FBOEIsQ0FBQywyQkFBMkIsRUFBRSxzQ0FBd0IsQ0FBQyxjQUFjLEVBQUUscUNBQXVCLENBQUUsa0JBQWtCLEVBQUUsMkNBQW9DLENBQUMsYUFBYTs7QUFIN00sVUFBVSxHQUNOLFdBQVcsRUFBRSxZQUFTLEVBQ3RCLEdBQUcsRUFBRSxvQ0FBdUIsRUFDNUIsR0FBRyxFQUFFLDJDQUE4QixDQUFDLDJCQUEyQixFQUFFLHFDQUF3QixDQUFDLGNBQWMsRUFBRSxvQ0FBdUIsQ0FBRSxrQkFBa0IsRUFBRSwrQ0FBb0MsQ0FBQyxhQUFhOztBQUg3TSxVQUFVLEdBQ04sV0FBVyxFQUFFLGtCQUFTLEVBQ3RCLEdBQUcsRUFBRSxvQ0FBdUIsRUFD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 */ diff --git a/user/themes/r2c/css-compiled/template.min.css b/user/themes/r2c/css-compiled/template.min.css index ce18287..9f00ed1 100644 --- a/user/themes/r2c/css-compiled/template.min.css +++ b/user/themes/r2c/css-compiled/template.min.css @@ -1 +1 @@ -@font-face{font-family:CooperHewitt;src:url(../fonts/CooperHewitt/CooperHewitt-Bold.eot);src:url(../fonts/CooperHewitt/CooperHewitt-Bold.eot?#iefix) format('embedded-opentype'),url(../fonts/CooperHewitt/CooperHewitt-Bold.woff) format('woff'),url(../fonts/CooperHewitt/CooperHewitt-Bold.ttf) format('truetype'),url(../fonts/CooperHewitt/CooperHewitt-Bold.svg#CooperHewitt) format('svg')}@font-face{font-family:CooperHewitt-BoldItalic;src:url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.eot);src:url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.eot?#iefix) format('embedded-opentype'),url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.woff) format('woff'),url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.ttf) format('truetype'),url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.svg#CooperHewitt-BoldItalic) format('svg')}@font-face{font-family:rubik;src:url(../fonts/rubik/Rubik-Light.eot);src:url(../fonts/rubik/Rubik-Light.eot?#iefix) format('embedded-opentype'),url(../fonts/rubik/Rubik-Light.woff) format('woff'),url(../fonts/rubik/Rubik-Light.ttf) format('truetype'),url(../fonts/rubik/Rubik-Light.svg#rubik) format('svg')}@font-face{font-family:Rubik-Bold;src:url(../fonts/rubik/Rubik-Bold.eot);src:url(../fonts/rubik/Rubik-Bold.eot?#iefix) format('embedded-opentype'),url(../fonts/rubik/Rubik-Bold.woff) format('woff'),url(../fonts/rubik/Rubik-Bold.ttf) format('truetype'),url(../fonts/rubik/Rubik-Bold.svg#Rubik-Bold) format('svg')}@font-face{font-family:cmu-concrete-ita;src:url(../fonts/Concrete/cmunoti.eot);src:url(../fonts/Concrete/cmunoti.eot?#iefix) format('embedded-opentype'),url(../fonts/Concrete/cmunoti.woff) format('woff'),url(../fonts/Concrete/cmunoti.ttf) format('truetype'),url(../fonts/Concrete/cmunoti.svg#cmu-concrete-ita) format('svg')}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{font:inherit;font-size:16px;margin:0;padding:0;vertical-align:baseline;border:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body,html{height:100%}body{line-height:1}ol,ul{list-style:none}a{text-decoration:none;color:#000}blockquote,q{quotes:none}img{width:100%;height:100%;vertical-align:bottom}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}table{border-spacing:0;border-collapse:collapse}p{font-style:normal}em{font-style:italic}strong{font-family:Rubik-Bold}h1{font-size:1.2rem;line-height:50px}h1 a{font-family:CooperHewitt;font-weight:400}h2{font-family:CooperHewitt-BoldItalic;font-size:1.1rem;line-height:50px}p{font-family:rubik;font-size:1rem;line-height:1.3rem}p a{font-family:cmu-concrete-ita}.top>div:nth-child(1){color:#fff}.top>div:nth-child(1) a{color:#ff0054}#header{padding:0 20px}body{overflow:hidden}#page{height:100%;background:#e6e6e6}#page .navbar{width:100%;height:50px}#page .handler{position:absolute;z-index:999;top:50%;width:50px;height:50px;cursor:-webkit-grab;cursor:grab;border-radius:25px}#page .hand1{left:calc((100%/3) - 25px);opacity:.5;background:green}#page .hand2{right:calc((100%/3) - 25px);opacity:.5;background:red}#page .mouseDown{cursor:-webkit-grabbing;cursor:grabbing}#page #start{width:100%;height:calc(100% - 50px)}#page #start .bottom,#page #start .top{display:-ms-inline-flexbox;display:inline-flex;width:100%;-ms-flex-pack:justify;justify-content:space-between}#page #start img{transition:filter .5s;filter:grayscale(100%) contrast(4)}#page #start img:hover{transition:filter .5s;filter:grayscale(0)}#page #start .top{position:relative;height:calc(100% / 2)}#page #start .top>div:nth-child(-n+2){padding:0 20px}#page #start .top>div:nth-child(1){background:#969696}#page #start .bottom{position:absolute;top:calc(100% / 2 + 25px);bottom:0;height:auto}#page #start .bottom>div:nth-child(1){background:red}#page #start .blocs{overflow-y:auto;width:calc(100% / 3);min-width:200px;margin:2px}#page #start .blocs:nth-child(2){left:calc(100% / 3);background:#fff}#page #start .blocs:nth-child(3){background:#fff} \ No newline at end of file +@font-face{font-family:CooperHewitt;src:url(../fonts/CooperHewitt/CooperHewitt-Bold.eot);src:url(../fonts/CooperHewitt/CooperHewitt-Bold.eot?#iefix) format('embedded-opentype'),url(../fonts/CooperHewitt/CooperHewitt-Bold.woff) format('woff'),url(../fonts/CooperHewitt/CooperHewitt-Bold.ttf) format('truetype'),url(../fonts/CooperHewitt/CooperHewitt-Bold.svg#CooperHewitt) format('svg')}@font-face{font-family:CooperHewitt-BoldItalic;src:url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.eot);src:url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.eot?#iefix) format('embedded-opentype'),url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.woff) format('woff'),url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.ttf) format('truetype'),url(../fonts/CooperHewitt/CooperHewitt-BoldItalic.svg#CooperHewitt-BoldItalic) format('svg')}@font-face{font-family:rubik;src:url(../fonts/rubik/Rubik-Light.eot);src:url(../fonts/rubik/Rubik-Light.eot?#iefix) format('embedded-opentype'),url(../fonts/rubik/Rubik-Light.woff) format('woff'),url(../fonts/rubik/Rubik-Light.ttf) format('truetype'),url(../fonts/rubik/Rubik-Light.svg#rubik) format('svg')}@font-face{font-family:Rubik-Bold;src:url(../fonts/rubik/Rubik-Bold.eot);src:url(../fonts/rubik/Rubik-Bold.eot?#iefix) format('embedded-opentype'),url(../fonts/rubik/Rubik-Bold.woff) format('woff'),url(../fonts/rubik/Rubik-Bold.ttf) format('truetype'),url(../fonts/rubik/Rubik-Bold.svg#Rubik-Bold) format('svg')}@font-face{font-family:cmu-concrete-ita;src:url(../fonts/Concrete/cmunoti.eot);src:url(../fonts/Concrete/cmunoti.eot?#iefix) format('embedded-opentype'),url(../fonts/Concrete/cmunoti.woff) format('woff'),url(../fonts/Concrete/cmunoti.ttf) format('truetype'),url(../fonts/Concrete/cmunoti.svg#cmu-concrete-ita) format('svg')}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{font:inherit;font-size:16px;margin:0;padding:0;vertical-align:baseline;border:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body,html{height:100%}body{line-height:1}ol,ul{list-style:none}a{text-decoration:none;color:#000}blockquote,q{quotes:none}img{width:100%;height:100%;vertical-align:bottom}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}table{border-spacing:0;border-collapse:collapse}p{font-style:normal}em{font-style:italic}strong{font-family:Rubik-Bold}h1{font-size:1.2rem;line-height:50px}h1 a{font-family:CooperHewitt;font-weight:400}h2{font-family:CooperHewitt-BoldItalic;font-size:1.1rem;line-height:50px}p{font-family:rubik;font-size:1rem;line-height:1.3rem}p a{font-family:cmu-concrete-ita}.top>div:nth-child(1){color:#fff}.top>div:nth-child(1) a{color:#ff0054}#header{padding:0 20px}body{overflow:hidden}#page{height:100%;background:#e6e6e6}#page .navbar{width:100%;height:50px}#page .handler{position:absolute;z-index:999;top:50%;width:50px;height:50px;cursor:-webkit-grab;cursor:grab;border-radius:25px}#page .hand1{left:calc((100%/3) - 25px);opacity:.5;background:green}#page .hand2{right:calc((100%/3) - 25px);opacity:.5;background:red}#page .mouseDown{cursor:-webkit-grabbing;cursor:grabbing}#page #start{width:100%;height:calc(100% - 50px)}#page #start .bottom,#page #start .top{display:-ms-inline-flexbox;display:inline-flex;width:100%;-ms-flex-pack:justify;justify-content:space-between}#page #start img{transition:filter .5s;filter:grayscale(100%) contrast(4)}#page #start img:hover{transition:filter .5s;filter:grayscale(0)}#page #start .top{position:relative;height:calc(100% / 2)}#page #start .top>div:nth-child(-n+2){padding:0 20px}#page #start .top>div:nth-child(1){background:#969696}#page #start .bottom{position:absolute;top:calc(100% / 2 + 25px);bottom:0;height:auto}#page #start .bottom>div:nth-child(1){background:red}#page #start .blocs{overflow-y:auto;width:calc(100% / 3);min-width:200px;margin:2px}#page #start .blocs:nth-child(2){left:calc(100% / 3);background:#fff}#page #start .blocs:nth-child(3){background:#fff}#mapid{height:180px} \ No newline at end of file diff --git a/user/themes/r2c/css/leaflet.css b/user/themes/r2c/css/leaflet.css new file mode 100644 index 0000000..a0932d5 --- /dev/null +++ b/user/themes/r2c/css/leaflet.css @@ -0,0 +1,635 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + } + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-tile { + will-change: opacity; + } +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + will-change: transform; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a, +.leaflet-bar a:hover { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover { + text-decoration: underline; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + padding: 4px 4px 0 0; + border: none; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } +.leaflet-oldie .leaflet-popup-tip-container { + margin-top: -1px; + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-clickable { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } diff --git a/user/themes/r2c/css/styles_3djs.css b/user/themes/r2c/css/styles_3djs.css new file mode 100644 index 0000000..edbe7de --- /dev/null +++ b/user/themes/r2c/css/styles_3djs.css @@ -0,0 +1,13 @@ +.links line { + stroke: #999; + stroke-opacity: 0.6; +} + +.nodes text { + -webkit-user-select: none!important; + -moz-user-select: none!important; + -ms-user-select: none!important; + user-select: none!important; + cursor: -webkit-grab; + cursor: grab; +} diff --git a/user/themes/r2c/css/styles_paperjs.css b/user/themes/r2c/css/styles_paperjs.css new file mode 100644 index 0000000..42c58d8 --- /dev/null +++ b/user/themes/r2c/css/styles_paperjs.css @@ -0,0 +1,4 @@ +canvas[resize] { + width: 100%; + height: 100%; +} diff --git a/user/themes/r2c/js/d3.js b/user/themes/r2c/js/d3.js new file mode 100644 index 0000000..5845717 --- /dev/null +++ b/user/themes/r2c/js/d3.js @@ -0,0 +1,2 @@ +// https://d3js.org Version 4.13.0. Copyright 2018 Mike Bostock. +(function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.d3=t.d3||{})})(this,function(t){"use strict";function n(t,n){return tn?1:t>=n?0:NaN}function e(t){return 1===t.length&&(t=function(t){return function(e,r){return n(t(e),r)}}(t)),{left:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)>0?i=o:r=o+1}return r}}}function r(t,n){return[t,n]}function i(t){return null===t?NaN:+t}function o(t,n){var e,r,o=t.length,u=0,a=-1,c=0,s=0;if(null==n)for(;++a1)return s/(u-1)}function u(t,n){var e=o(t,n);return e?Math.sqrt(e):e}function a(t,n){var e,r,i,o=t.length,u=-1;if(null==n){for(;++u=e)for(r=i=e;++ue&&(r=e),i=e)for(r=i=e;++ue&&(r=e),i0)return[t];if((r=n0)for(t=Math.ceil(t/u),n=Math.floor(n/u),o=new Array(i=Math.ceil(n-t+1));++a=0?(o>=Hs?10:o>=js?5:o>=Xs?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=Hs?10:o>=js?5:o>=Xs?2:1)}function p(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=Hs?i*=10:o>=js?i*=5:o>=Xs&&(i*=2),n=1)return+e(t[r-1],r-1,t);var r,o=(r-1)*n,u=Math.floor(o),a=+e(t[u],u,t);return a+(+e(t[u+1],u+1,t)-a)*(o-u)}}function g(t){for(var n,e,r,i=t.length,o=-1,u=0;++o=0;)for(n=(r=t[i]).length;--n>=0;)e[--u]=r[n];return e}function _(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++oe&&(r=e)}else for(;++o=e)for(r=e;++oe&&(r=e);return r}function y(t){if(!(i=t.length))return[];for(var n=-1,e=_(t,m),r=new Array(e);++n=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),tf.hasOwnProperty(n)?{space:tf[n],local:t}:t}function A(t){var n=E(t);return(n.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===Ks&&n.documentElement.namespaceURI===Ks?n.createElement(t):n.createElementNS(e,t)}})(n)}function C(){}function z(t){return null==t?C:function(){return this.querySelector(t)}}function P(){return[]}function R(t){return null==t?P:function(){return this.querySelectorAll(t)}}function L(t){return new Array(t.length)}function q(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}function D(t,n,e,r,i,o){for(var u,a=0,c=n.length,s=o.length;an?1:t>=n?0:NaN}function F(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function I(t,n){return t.style.getPropertyValue(n)||F(t).getComputedStyle(t,null).getPropertyValue(n)}function Y(t){return t.trim().split(/^|\s+/)}function B(t){return t.classList||new H(t)}function H(t){this._node=t,this._names=Y(t.getAttribute("class")||"")}function j(t,n){for(var e=B(t),r=-1,i=n.length;++r>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1)):(n=df.exec(t))?At(parseInt(n[1],16)):(n=vf.exec(t))?new Rt(n[1],n[2],n[3],1):(n=gf.exec(t))?new Rt(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=_f.exec(t))?Ct(n[1],n[2],n[3],n[4]):(n=yf.exec(t))?Ct(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=mf.exec(t))?Lt(n[1],n[2]/100,n[3]/100,1):(n=xf.exec(t))?Lt(n[1],n[2]/100,n[3]/100,n[4]):bf.hasOwnProperty(t)?At(bf[t]):"transparent"===t?new Rt(NaN,NaN,NaN,0):null}function At(t){return new Rt(t>>16&255,t>>8&255,255&t,1)}function Ct(t,n,e,r){return r<=0&&(t=n=e=NaN),new Rt(t,n,e,r)}function zt(t){return t instanceof St||(t=Et(t)),t?(t=t.rgb(),new Rt(t.r,t.g,t.b,t.opacity)):new Rt}function Pt(t,n,e,r){return 1===arguments.length?zt(t):new Rt(t,n,e,null==r?1:r)}function Rt(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function Lt(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Dt(t,n,e,r)}function qt(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof Dt)return new Dt(t.h,t.s,t.l,t.opacity);if(t instanceof St||(t=Et(t)),!t)return new Dt;if(t instanceof Dt)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),u=NaN,a=o-i,c=(o+i)/2;return a?(u=n===o?(e-r)/a+6*(e0&&c<1?0:u,new Dt(u,a,c,t.opacity)}(t):new Dt(t,n,e,null==r?1:r)}function Dt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Ut(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}function Ot(t){if(t instanceof It)return new It(t.l,t.a,t.b,t.opacity);if(t instanceof Vt){var n=t.h*wf;return new It(t.l,Math.cos(n)*t.c,Math.sin(n)*t.c,t.opacity)}t instanceof Rt||(t=zt(t));var e=jt(t.r),r=jt(t.g),i=jt(t.b),o=Yt((.4124564*e+.3575761*r+.1804375*i)/Tf),u=Yt((.2126729*e+.7151522*r+.072175*i)/Nf);return new It(116*u-16,500*(o-u),200*(u-Yt((.0193339*e+.119192*r+.9503041*i)/kf)),t.opacity)}function Ft(t,n,e,r){return 1===arguments.length?Ot(t):new It(t,n,e,null==r?1:r)}function It(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function Yt(t){return t>Cf?Math.pow(t,1/3):t/Af+Sf}function Bt(t){return t>Ef?t*t*t:Af*(t-Sf)}function Ht(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function jt(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Xt(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof Vt)return new Vt(t.h,t.c,t.l,t.opacity);t instanceof It||(t=Ot(t));var n=Math.atan2(t.b,t.a)*Mf;return new Vt(n<0?n+360:n,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}(t):new Vt(t,n,e,null==r?1:r)}function Vt(t,n,e,r){this.h=+t,this.c=+n,this.l=+e,this.opacity=+r}function $t(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof Wt)return new Wt(t.h,t.s,t.l,t.opacity);t instanceof Rt||(t=zt(t));var n=t.r/255,e=t.g/255,r=t.b/255,i=(Df*r+Lf*n-qf*e)/(Df+Lf-qf),o=r-i,u=(Rf*(e-i)-zf*o)/Pf,a=Math.sqrt(u*u+o*o)/(Rf*i*(1-i)),c=a?Math.atan2(u,o)*Mf-120:NaN;return new Wt(c<0?c+360:c,a,i,t.opacity)}(t):new Wt(t,n,e,null==r?1:r)}function Wt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Zt(t,n,e,r,i){var o=t*t,u=o*t;return((1-3*t+3*o-u)*n+(4-6*o+3*u)*e+(1+3*t+3*o-3*u)*r+u*i)/6}function Gt(t){var n=t.length-1;return function(e){var r=e<=0?e=0:e>=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],u=r>0?t[r-1]:2*i-o,a=r180||e<-180?e-360*Math.round(e/360):e):Jt(isNaN(t)?n:t)}function nn(t){return 1==(t=+t)?en:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):Jt(isNaN(n)?e:n)}}function en(t,n){var e=n-t;return e?Kt(t,e):Jt(isNaN(t)?n:t)}function rn(t){return function(n){var e,r,i=n.length,o=new Array(i),u=new Array(i),a=new Array(i);for(e=0;eo&&(i=n.slice(o,i),a[u]?a[u]+=i:a[++u]=i),(e=e[0])===(r=r[0])?a[u]?a[u]+=r:a[++u]=r:(a[++u]=null,c.push({i:u,x:an(e,r)})),o=$f.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:an(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,u.rotate,a,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:an(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,u.skewX,a,c),function(t,n,e,r,o,u){if(t!==e||n!==r){var a=o.push(i(o)+"scale(",null,",",null,")");u.push({i:a-4,x:an(t,e)},{i:a-2,x:an(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,u.scaleX,u.scaleY,a,c),o=u=null,function(t){for(var n,e=-1,r=c.length;++e=0&&n._call.call(null,t),n=n._next;--cl}function Tn(){pl=(hl=vl.now())+dl,cl=sl=0;try{Mn()}finally{cl=0,function(){var t,n,e=Yf,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Yf=n);Bf=t,kn(r)}(),pl=0}}function Nn(){var t=vl.now(),n=t-hl;n>ll&&(dl-=n,hl=t)}function kn(t){if(!cl){sl&&(sl=clearTimeout(sl));t-pl>24?(t<1/0&&(sl=setTimeout(Tn,t-vl.now()-dl)),fl&&(fl=clearInterval(fl))):(fl||(hl=vl.now(),fl=setInterval(Nn,ll)),cl=1,gl(Tn))}}function Sn(t,n,e){var r=new bn;return n=null==n?0:+n,r.restart(function(e){r.stop(),t(e+n)},n,e),r}function En(t,n,e,r,i,o){var u=t.__transition;if(u){if(e in u)return}else t.__transition={};(function(t,n,e){function r(c){var s,f,l,h;if(e.state!==xl)return o();for(s in a)if((h=a[s]).name===e.name){if(h.state===wl)return Sn(r);h.state===Ml?(h.state=Nl,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete a[s]):+sml)throw new Error("too late; already scheduled");return e}function Cn(t,n){var e=zn(t,n);if(e.state>bl)throw new Error("too late; already started");return e}function zn(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function Pn(t,n){var e,r,i,o=t.__transition,u=!0;if(o){n=null==n?null:n+"";for(i in o)(e=o[i]).name===n?(r=e.state>bl&&e.stateMath.abs(t[1]-D[1])?b=!0:x=!0),D=t,m=!0,$n(),o()}function o(){var t;switch(_=D[0]-q[0],y=D[1]-q[1],T){case th:case Kl:N&&(_=Math.max(C-a,Math.min(P-p,_)),s=a+_,d=p+_),k&&(y=Math.max(z-l,Math.min(R-v,y)),h=l+y,g=v+y);break;case nh:N<0?(_=Math.max(C-a,Math.min(P-a,_)),s=a+_,d=p):N>0&&(_=Math.max(C-p,Math.min(P-p,_)),s=a,d=p+_),k<0?(y=Math.max(z-l,Math.min(R-l,y)),h=l+y,g=v):k>0&&(y=Math.max(z-v,Math.min(R-v,y)),h=l,g=v+y);break;case eh:N&&(s=Math.max(C,Math.min(P,a-_*N)),d=Math.max(C,Math.min(P,p+_*N))),k&&(h=Math.max(z,Math.min(R,l-y*k)),g=Math.max(z,Math.min(R,v+y*k)))}d0&&(a=s-_),k<0?v=g-y:k>0&&(l=h-y),T=th,F.attr("cursor",uh.selection),o());break;default:return}$n()},!0).on("keyup.brush",function(){switch(t.event.keyCode){case 16:L&&(x=b=L=!1,o());break;case 18:T===eh&&(N<0?p=d:N>0&&(a=s),k<0?v=g:k>0&&(l=h),T=nh,o());break;case 32:T===th&&(t.event.altKey?(N&&(p=d-_*N,a=s+_*N),k&&(v=g-y*k,l=h+y*k),T=eh):(N<0?p=d:N>0&&(a=s),k<0?v=g:k>0&&(l=h),T=nh),F.attr("cursor",uh[M]),o());break;default:return}$n()},!0).on("mousemove.brush",e,!0).on("mouseup.brush",u,!0);_t(t.event.view)}Vn(),Pn(w),r.call(w),U.start()}}function a(){var t=this.__brush||{selection:null};return t.extent=s.apply(this,arguments),t.dim=n,t}var c,s=Gn,f=Zn,l=N(e,"start","brush","end"),h=6;return e.move=function(t,e){t.selection?t.on("start.brush",function(){i(this,arguments).beforestart().start()}).on("interrupt.brush end.brush",function(){i(this,arguments).end()}).tween("brush",function(){function t(t){u.selection=1===t&&Jn(s)?null:f(t),r.call(o),a.brush()}var o=this,u=o.__brush,a=i(o,arguments),c=u.selection,s=n.input("function"==typeof e?e.apply(this,arguments):e,u.extent),f=fn(c,s);return c&&s?t:t(1)}):t.each(function(){var t=arguments,o=this.__brush,u=n.input("function"==typeof e?e.apply(this,t):e,o.extent),a=i(this,t).beforestart();Pn(this),o.selection=null==u||Jn(u)?null:u,r.call(this),a.start().brush().end()})},o.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(){return this.starting&&(this.starting=!1,this.emit("start")),this},brush:function(){return this.emit("brush"),this},end:function(){return 0==--this.active&&(delete this.state.emitter,this.emit("end")),this},emit:function(t){it(new function(t,n,e){this.target=t,this.type=n,this.selection=e}(e,t,n.output(this.state.selection)),l.apply,l,[t,this.that,this.args])}},e.extent=function(t){return arguments.length?(s="function"==typeof t?t:Xn([[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]]),e):s},e.filter=function(t){return arguments.length?(f="function"==typeof t?t:Xn(!!t),e):f},e.handleSize=function(t){return arguments.length?(h=+t,e):h},e.on=function(){var t=l.on.apply(l,arguments);return t===l?e:t},e}function te(t){return function(){return t}}function ne(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function ee(){return new ne}function re(t){return t.source}function ie(t){return t.target}function oe(t){return t.radius}function ue(t){return t.startAngle}function ae(t){return t.endAngle}function ce(){}function se(t,n){var e=new ce;if(t instanceof ce)t.each(function(t,n){e.set(n,t)});else if(Array.isArray(t)){var r,i=-1,o=t.length;if(null==n)for(;++i=u?s=!0:(e=t.charCodeAt(a++))===Nh?f=!0:e===kh&&(f=!0,t.charCodeAt(a)===Nh&&++a),t.slice(r+1,n-1).replace(/""/g,'"')}for(;a=(o=(v+_)/2))?v=o:_=o,(f=e>=(u=(g+y)/2))?g=u:y=u,i=p,!(p=p[l=f<<1|s]))return i[l]=d,t;if(a=+t._x.call(null,p.data),c=+t._y.call(null,p.data),n===a&&e===c)return d.next=p,i?i[l]=d:t._root=d,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(s=n>=(o=(v+_)/2))?v=o:_=o,(f=e>=(u=(g+y)/2))?g=u:y=u}while((l=f<<1|s)==(h=(c>=u)<<1|a>=o));return i[h]=p,i[l]=d,t}function be(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function we(t){return t[0]}function Me(t){return t[1]}function Te(t,n,e){var r=new Ne(null==n?we:n,null==e?Me:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Ne(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function ke(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}function Se(t){return t.x+t.vx}function Ee(t){return t.y+t.vy}function Ae(t){return t.index}function Ce(t,n){var e=t.get(n);if(!e)throw new Error("missing: "+n);return e}function ze(t){return t.x}function Pe(t){return t.y}function Re(t,n){if((e=(t=n?t.toExponential(n-1):t.toExponential()).indexOf("e"))<0)return null;var e,r=t.slice(0,e);return[r.length>1?r[0]+r.slice(2):r,+t.slice(e+1)]}function Le(t){return(t=Re(Math.abs(t)))?t[1]:NaN}function qe(t,n){var e=Re(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}function De(t){return new Ue(t)}function Ue(t){if(!(n=Bh.exec(t)))throw new Error("invalid format: "+t);var n,e=n[1]||" ",r=n[2]||">",i=n[3]||"-",o=n[4]||"",u=!!n[5],a=n[6]&&+n[6],c=!!n[7],s=n[8]&&+n[8].slice(1),f=n[9]||"";"n"===f?(c=!0,f="g"):Yh[f]||(f=""),(u||"0"===e&&"="===r)&&(u=!0,e="0",r="="),this.fill=e,this.align=r,this.sign=i,this.symbol=o,this.zero=u,this.width=a,this.comma=c,this.precision=s,this.type=f}function Oe(t){return t}function Fe(t){function n(t){function n(t){var n,r,u,f=g,x=_;if("c"===v)x=y(t)+x,t="";else{var b=(t=+t)<0;if(t=y(Math.abs(t),d),b&&0==+t&&(b=!1),f=(b?"("===s?s:"-":"-"===s||"("===s?"":s)+f,x=("s"===v?jh[8+Oh/3]:"")+x+(b&&"("===s?")":""),m)for(n=-1,r=t.length;++n(u=t.charCodeAt(n))||u>57){x=(46===u?i+t.slice(n+1):t.slice(n))+x,t=t.slice(0,n);break}}p&&!l&&(t=e(t,1/0));var w=f.length+t.length+x.length,M=w>1)+f+t+x+M.slice(w);break;default:t=M+f+t+x}return o(t)}var a=(t=De(t)).fill,c=t.align,s=t.sign,f=t.symbol,l=t.zero,h=t.width,p=t.comma,d=t.precision,v=t.type,g="$"===f?r[0]:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",_="$"===f?r[1]:/[%p]/.test(v)?u:"",y=Yh[v],m=!v||/[defgprs%]/.test(v);return d=null==d?v?6:12:/[gprs]/.test(v)?Math.max(1,Math.min(21,d)):Math.max(0,Math.min(20,d)),n.toString=function(){return t+""},n}var e=t.grouping&&t.thousands?function(t,n){return function(e,r){for(var i=e.length,o=[],u=0,a=t[0],c=0;i>0&&a>0&&(c+a+1>r&&(a=Math.max(1,r-c)),o.push(e.substring(i-=a,i+a)),!((c+=a+1)>r));)a=t[u=(u+1)%t.length];return o.reverse().join(n)}}(t.grouping,t.thousands):Oe,r=t.currency,i=t.decimal,o=t.numerals?function(t){return function(n){return n.replace(/[0-9]/g,function(n){return t[+n]})}}(t.numerals):Oe,u=t.percent||"%";return{format:n,formatPrefix:function(t,e){var r=n((t=De(t),t.type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(Le(e)/3))),o=Math.pow(10,-i),u=jh[8+i/3];return function(t){return r(o*t)+u}}}}function Ie(n){return Hh=Fe(n),t.format=Hh.format,t.formatPrefix=Hh.formatPrefix,Hh}function Ye(t){return Math.max(0,-Le(Math.abs(t)))}function Be(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Le(n)/3)))-Le(Math.abs(t)))}function He(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,Le(n)-Le(t))+1}function je(){return new Xe}function Xe(){this.reset()}function Ve(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}function $e(t){return t>1?0:t<-1?Np:Math.acos(t)}function We(t){return t>1?kp:t<-1?-kp:Math.asin(t)}function Ze(t){return(t=Fp(t/2))*t}function Ge(){}function Qe(t,n){t&&jp.hasOwnProperty(t.type)&&jp[t.type](t,n)}function Je(t,n,e){var r,i=-1,o=t.length-e;for(n.lineStart();++i=0?1:-1,i=r*e,o=Lp(n),u=Fp(n),a=Zh*u,c=Wh*o+a*Lp(i),s=a*r*Fp(i);Xp.add(Rp(s,c)),$h=t,Wh=o,Zh=u}function or(t){return[Rp(t[1],t[0]),We(t[2])]}function ur(t){var n=t[0],e=t[1],r=Lp(e);return[r*Lp(n),r*Fp(n),Fp(e)]}function ar(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function cr(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function sr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function fr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function lr(t){var n=Yp(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function hr(t,n){ip.push(op=[Gh=t,Jh=t]),nKh&&(Kh=n)}function pr(t,n){var e=ur([t*Cp,n*Cp]);if(rp){var r=cr(rp,e),i=cr([r[1],-r[0],0],r);lr(i),i=or(i);var o,u=t-tp,a=u>0?1:-1,c=i[0]*Ap*a,s=zp(u)>180;s^(a*tpKh&&(Kh=o):(c=(c+360)%360-180,s^(a*tpKh&&(Kh=n))),s?tmr(Gh,Jh)&&(Jh=t):mr(t,Jh)>mr(Gh,Jh)&&(Gh=t):Jh>=Gh?(tJh&&(Jh=t)):t>tp?mr(Gh,t)>mr(Gh,Jh)&&(Jh=t):mr(t,Jh)>mr(Gh,Jh)&&(Gh=t)}else ip.push(op=[Gh=t,Jh=t]);nKh&&(Kh=n),rp=e,tp=t}function dr(){Zp.point=pr}function vr(){op[0]=Gh,op[1]=Jh,Zp.point=hr,rp=null}function gr(t,n){if(rp){var e=t-tp;Wp.add(zp(e)>180?e+(e>0?360:-360):e)}else np=t,ep=n;$p.point(t,n),pr(t,n)}function _r(){$p.lineStart()}function yr(){gr(np,ep),$p.lineEnd(),zp(Wp)>Mp&&(Gh=-(Jh=180)),op[0]=Gh,op[1]=Jh,rp=null}function mr(t,n){return(n-=t)<0?n+360:n}function xr(t,n){return t[0]-n[0]}function br(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nNp?t-Ep:t<-Np?t+Ep:t,n]}function qr(t,n,e){return(t%=Ep)?n||e?Rr(Ur(t),Or(n,e)):Ur(t):n||e?Or(n,e):Lr}function Dr(t){return function(n,e){return n+=t,[n>Np?n-Ep:n<-Np?n+Ep:n,e]}}function Ur(t){var n=Dr(t);return n.invert=Dr(-t),n}function Or(t,n){function e(t,n){var e=Lp(n),a=Lp(t)*e,c=Fp(t)*e,s=Fp(n),f=s*r+a*i;return[Rp(c*o-f*u,a*r-s*i),We(f*o+c*u)]}var r=Lp(t),i=Fp(t),o=Lp(n),u=Fp(n);return e.invert=function(t,n){var e=Lp(n),a=Lp(t)*e,c=Fp(t)*e,s=Fp(n),f=s*o-c*u;return[Rp(c*o+s*u,a*r+f*i),We(f*r-a*i)]},e}function Fr(t){function n(n){return n=t(n[0]*Cp,n[1]*Cp),n[0]*=Ap,n[1]*=Ap,n}return t=qr(t[0]*Cp,t[1]*Cp,t.length>2?t[2]*Cp:0),n.invert=function(n){return n=t.invert(n[0]*Cp,n[1]*Cp),n[0]*=Ap,n[1]*=Ap,n},n}function Ir(t,n,e,r,i,o){if(e){var u=Lp(n),a=Fp(n),c=r*e;null==i?(i=n+r*Ep,o=n-c/2):(i=Yr(u,i),o=Yr(u,o),(r>0?io)&&(i+=r*Ep));for(var s,f=i;r>0?f>o:f1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}}function Hr(t,n){return zp(t[0]-n[0])=0;--o)i.point((f=s[o])[0],f[1]);else r(h.x,h.p.x,-1,i);h=h.p}s=(h=h.o).z,p=!p}while(!h.v);i.lineEnd()}}}function Vr(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r=0?1:-1,T=M*w,N=T>Np,k=d*x;if(cd.add(Rp(k*M*Fp(T),v*b+k*Lp(T))),o+=N?w+M*Ep:w,N^h>=e^y>=e){var S=cr(ur(l),ur(_));lr(S);var E=cr(i,S);lr(E);var A=(N^w>=0?-1:1)*We(E[2]);(r>A||r===A&&(S[0]||S[1]))&&(u+=N^w>=0?1:-1)}}return(o<-Mp||o0){for(m||(i.polygonStart(),m=!0),i.lineStart(),t=0;t1&&2&o&&u.push(u.pop().concat(u.shift())),p.push(u.filter(Zr))}var h,p,d,v=n(i),_=Br(),y=n(_),m=!1,x={point:o,lineStart:a,lineEnd:c,polygonStart:function(){x.point=s,x.lineStart=f,x.lineEnd=l,p=[],h=[]},polygonEnd:function(){x.point=o,x.lineStart=a,x.lineEnd=c,p=g(p);var t=$r(h,r);p.length?(m||(i.polygonStart(),m=!0),Xr(p,Gr,t,e,i)):t&&(m||(i.polygonStart(),m=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),m&&(i.polygonEnd(),m=!1),p=h=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}};return x}}function Zr(t){return t.length>1}function Gr(t,n){return((t=t.x)[0]<0?t[1]-kp-Mp:kp-t[1])-((n=n.x)[0]<0?n[1]-kp-Mp:kp-n[1])}function Qr(t){function n(t,n){return Lp(t)*Lp(n)>i}function e(t,n,e){var r=[1,0,0],o=cr(ur(t),ur(n)),u=ar(o,o),a=o[0],c=u-a*a;if(!c)return!e&&t;var s=i*u/c,f=-i*a/c,l=cr(r,o),h=fr(r,s);sr(h,fr(o,f));var p=l,d=ar(h,p),v=ar(p,p),g=d*d-v*(ar(h,h)-1);if(!(g<0)){var _=Yp(g),y=fr(p,(-d-_)/v);if(sr(y,h),y=or(y),!e)return y;var m,x=t[0],b=n[0],w=t[1],M=n[1];b0^y[1]<(zp(y[0]-x)Np^(x<=y[0]&&y[0]<=b)){var k=fr(p,(-d+_)/v);return sr(k,h),[y,or(k)]}}}function r(n,e){var r=u?t:Np-t,i=0;return n<-r?i|=1:n>r&&(i|=2),e<-r?i|=4:e>r&&(i|=8),i}var i=Lp(t),o=6*Cp,u=i>0,a=zp(i)>Mp;return Wr(n,function(t){var i,o,c,s,f;return{lineStart:function(){s=c=!1,f=1},point:function(l,h){var p,d=[l,h],v=n(l,h),g=u?v?0:r(l,h):v?r(l+(l<0?Np:-Np),h):0;if(!i&&(s=c=v)&&t.lineStart(),v!==c&&(!(p=e(i,d))||Hr(i,p)||Hr(d,p))&&(d[0]+=Mp,d[1]+=Mp,v=n(d[0],d[1])),v!==c)f=0,v?(t.lineStart(),p=e(d,i),t.point(p[0],p[1])):(p=e(i,d),t.point(p[0],p[1]),t.lineEnd()),i=p;else if(a&&i&&u^v){var _;g&o||!(_=e(d,i,!0))||(f=0,u?(t.lineStart(),t.point(_[0][0],_[0][1]),t.point(_[1][0],_[1][1]),t.lineEnd()):(t.point(_[1][0],_[1][1]),t.lineEnd(),t.lineStart(),t.point(_[0][0],_[0][1])))}!v||i&&Hr(i,d)||t.point(d[0],d[1]),i=d,c=v,o=g},lineEnd:function(){c&&t.lineEnd(),i=null},clean:function(){return f|(s&&c)<<1}}},function(n,e,r,i){Ir(i,t,o,r,n,e)},u?[0,-t]:[-Np,t-Np])}function Jr(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function o(i,o,a,s){var f=0,l=0;if(null==i||(f=u(i,a))!==(l=u(o,a))||c(i,o)<0^a>0)do{s.point(0===f||3===f?t:e,f>1?r:n)}while((f=(f+a+4)%4)!==l);else s.point(o[0],o[1])}function u(r,i){return zp(r[0]-t)0?0:3:zp(r[0]-e)0?2:1:zp(r[1]-n)0?1:0:i>0?3:2}function a(t,n){return c(t.x,n.x)}function c(t,n){var e=u(t,1),r=u(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(u){function c(t,n){i(t,n)&&w.point(t,n)}function s(o,u){var a=i(o,u);if(l&&h.push([o,u]),x)p=o,d=u,v=a,x=!1,a&&(w.lineStart(),w.point(o,u));else if(a&&m)w.point(o,u);else{var c=[_=Math.max(ld,Math.min(fd,_)),y=Math.max(ld,Math.min(fd,y))],s=[o=Math.max(ld,Math.min(fd,o)),u=Math.max(ld,Math.min(fd,u))];!function(t,n,e,r,i,o){var u,a=t[0],c=t[1],s=0,f=1,l=n[0]-a,h=n[1]-c;if(u=e-a,l||!(u>0)){if(u/=l,l<0){if(u0){if(u>f)return;u>s&&(s=u)}if(u=i-a,l||!(u<0)){if(u/=l,l<0){if(u>f)return;u>s&&(s=u)}else if(l>0){if(u0)){if(u/=h,h<0){if(u0){if(u>f)return;u>s&&(s=u)}if(u=o-c,h||!(u<0)){if(u/=h,h<0){if(u>f)return;u>s&&(s=u)}else if(h>0){if(u0&&(t[0]=a+s*l,t[1]=c+s*h),f<1&&(n[0]=a+f*l,n[1]=c+f*h),!0}}}}}(c,s,t,n,e,r)?a&&(w.lineStart(),w.point(o,u),b=!1):(m||(w.lineStart(),w.point(c[0],c[1])),w.point(s[0],s[1]),a||w.lineEnd(),b=!1)}_=o,y=u,m=a}var f,l,h,p,d,v,_,y,m,x,b,w=u,M=Br(),T={point:c,lineStart:function(){T.point=s,l&&l.push(h=[]),x=!0,m=!1,_=y=NaN},lineEnd:function(){f&&(s(p,d),v&&m&&M.rejoin(),f.push(M.result())),T.point=c,m&&w.lineEnd()},polygonStart:function(){w=M,f=[],l=[],b=!0},polygonEnd:function(){var n=function(){for(var n=0,e=0,i=l.length;er&&(h-o)*(r-u)>(p-u)*(t-o)&&++n:p<=r&&(h-o)*(r-u)<(p-u)*(t-o)&&--n;return n}(),e=b&&n,i=(f=g(f)).length;(e||i)&&(u.polygonStart(),e&&(u.lineStart(),o(null,null,1,u),u.lineEnd()),i&&Xr(f,a,n,o,u),u.polygonEnd()),w=u,f=l=h=null}};return T}}function Kr(){pd.point=pd.lineEnd=Ge}function ti(t,n){Qp=t*=Cp,Jp=Fp(n*=Cp),Kp=Lp(n),pd.point=ni}function ni(t,n){t*=Cp;var e=Fp(n*=Cp),r=Lp(n),i=zp(t-Qp),o=Lp(i),u=r*Fp(i),a=Kp*e-Jp*r*o,c=Jp*e+Kp*r*o;hd.add(Rp(Yp(u*u+a*a),c)),Qp=t,Jp=e,Kp=r}function ei(t){return hd.reset(),tr(t,pd),+hd}function ri(t,n){return dd[0]=t,dd[1]=n,ei(vd)}function ii(t,n){return!(!t||!_d.hasOwnProperty(t.type))&&_d[t.type](t,n)}function oi(t,n){return 0===ri(t,n)}function ui(t,n){var e=ri(t[0],t[1]);return ri(t[0],n)+ri(n,t[1])<=e+Mp}function ai(t,n){return!!$r(t.map(ci),si(n))}function ci(t){return(t=t.map(si)).pop(),t}function si(t){return[t[0]*Cp,t[1]*Cp]}function fi(t,n,e){var r=f(t,n-Mp,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function li(t,n,e){var r=f(t,n-Mp,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function hi(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return f(qp(o/_)*_,i,_).map(p).concat(f(qp(s/y)*y,c,y).map(d)).concat(f(qp(r/v)*v,e,v).filter(function(t){return zp(t%_)>Mp}).map(l)).concat(f(qp(a/g)*g,u,g).filter(function(t){return zp(t%y)>Mp}).map(h))}var e,r,i,o,u,a,c,s,l,h,p,d,v=10,g=v,_=90,y=360,m=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[p(o).concat(d(c).slice(1),p(i).reverse().slice(1),d(s).reverse().slice(1))]}},t.extent=function(n){return arguments.length?t.extentMajor(n).extentMinor(n):t.extentMinor()},t.extentMajor=function(n){return arguments.length?(o=+n[0][0],i=+n[1][0],s=+n[0][1],c=+n[1][1],o>i&&(n=o,o=i,i=n),s>c&&(n=s,s=c,c=n),t.precision(m)):[[o,s],[i,c]]},t.extentMinor=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],a=+n[0][1],u=+n[1][1],r>e&&(n=r,r=e,e=n),a>u&&(n=a,a=u,u=n),t.precision(m)):[[r,a],[e,u]]},t.step=function(n){return arguments.length?t.stepMajor(n).stepMinor(n):t.stepMinor()},t.stepMajor=function(n){return arguments.length?(_=+n[0],y=+n[1],t):[_,y]},t.stepMinor=function(n){return arguments.length?(v=+n[0],g=+n[1],t):[v,g]},t.precision=function(n){return arguments.length?(m=+n,l=fi(a,u,90),h=li(r,e,m),p=fi(s,c,90),d=li(o,i,m),t):m},t.extentMajor([[-180,-90+Mp],[180,90-Mp]]).extentMinor([[-180,-80-Mp],[180,80+Mp]])}function pi(t){return t}function di(){xd.point=vi}function vi(t,n){xd.point=gi,td=ed=t,nd=rd=n}function gi(t,n){md.add(rd*t-ed*n),ed=t,rd=n}function _i(){gi(td,nd)}function yi(t,n){kd+=t,Sd+=n,++Ed}function mi(){qd.point=xi}function xi(t,n){qd.point=bi,yi(ud=t,ad=n)}function bi(t,n){var e=t-ud,r=n-ad,i=Yp(e*e+r*r);Ad+=i*(ud+t)/2,Cd+=i*(ad+n)/2,zd+=i,yi(ud=t,ad=n)}function wi(){qd.point=yi}function Mi(){qd.point=Ni}function Ti(){ki(id,od)}function Ni(t,n){qd.point=ki,yi(id=ud=t,od=ad=n)}function ki(t,n){var e=t-ud,r=n-ad,i=Yp(e*e+r*r);Ad+=i*(ud+t)/2,Cd+=i*(ad+n)/2,zd+=i,Pd+=(i=ad*t-ud*n)*(ud+t),Rd+=i*(ad+n),Ld+=3*i,yi(ud=t,ad=n)}function Si(t){this._context=t}function Ei(t,n){Bd.point=Ai,Ud=Fd=t,Od=Id=n}function Ai(t,n){Fd-=t,Id-=n,Yd.add(Yp(Fd*Fd+Id*Id)),Fd=t,Id=n}function Ci(){this._string=[]}function zi(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Pi(t){return function(n){var e=new Ri;for(var r in t)e[r]=t[r];return e.stream=n,e}}function Ri(){}function Li(t,n,e){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),tr(e,t.stream(Nd)),n(Nd.result()),null!=r&&t.clipExtent(r),t}function qi(t,n,e){return Li(t,function(e){var r=n[1][0]-n[0][0],i=n[1][1]-n[0][1],o=Math.min(r/(e[1][0]-e[0][0]),i/(e[1][1]-e[0][1])),u=+n[0][0]+(r-o*(e[1][0]+e[0][0]))/2,a=+n[0][1]+(i-o*(e[1][1]+e[0][1]))/2;t.scale(150*o).translate([u,a])},e)}function Di(t,n,e){return qi(t,[[0,0],n],e)}function Ui(t,n,e){return Li(t,function(e){var r=+n,i=r/(e[1][0]-e[0][0]),o=(r-i*(e[1][0]+e[0][0]))/2,u=-i*e[0][1];t.scale(150*i).translate([o,u])},e)}function Oi(t,n,e){return Li(t,function(e){var r=+n,i=r/(e[1][1]-e[0][1]),o=-i*e[0][0],u=(r-i*(e[1][1]+e[0][1]))/2;t.scale(150*i).translate([o,u])},e)}function Fi(t,n){return+n?function(t,n){function e(r,i,o,u,a,c,s,f,l,h,p,d,v,g){var _=s-r,y=f-i,m=_*_+y*y;if(m>4*n&&v--){var x=u+h,b=a+p,w=c+d,M=Yp(x*x+b*b+w*w),T=We(w/=M),N=zp(zp(w)-1)n||zp((_*A+y*C)/m-.5)>.3||u*h+a*p+c*d2?t[2]%360*Cp:0,r()):[x*Ap,b*Ap,w*Ap]},n.precision=function(t){return arguments.length?(E=Fi(e,S=t*t),i()):Yp(S)},n.fitExtent=function(t,e){return qi(n,t,e)},n.fitSize=function(t,e){return Di(n,t,e)},n.fitWidth=function(t,e){return Ui(n,t,e)},n.fitHeight=function(t,e){return Oi(n,t,e)},function(){return o=t.apply(this,arguments),n.invert=o.invert&&function(t){return(t=s.invert((t[0]-u)/v,(a-t[1])/v))&&[t[0]*Ap,t[1]*Ap]},r()}}function Bi(t){var n=0,e=Np/3,r=Yi(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*Cp,e=t[1]*Cp):[n*Ap,e*Ap]},i}function Hi(t,n){function e(t,n){var e=Yp(o-2*i*Fp(n))/i;return[e*Fp(t*=i),u-e*Lp(t)]}var r=Fp(t),i=(r+Fp(n))/2;if(zp(i)0?n<-kp+Mp&&(n=-kp+Mp):n>kp-Mp&&(n=kp-Mp);var e=o/Op(Gi(n),i);return[e*Fp(i*t),o-e*Lp(i*t)]}var r=Lp(t),i=t===n?Fp(t):Up(r/Lp(n))/Up(Gi(n)/Gi(t)),o=r*Op(Gi(t),i)/i;return i?(e.invert=function(t,n){var e=o-n,r=Ip(i)*Yp(t*t+e*e);return[Rp(t,zp(e))/i*Ip(e),2*Pp(Op(o/r,1/i))-kp]},e):Wi}function Ji(t,n){return[t,n]}function Ki(t,n){function e(t,n){var e=o-n,r=i*t;return[e*Fp(r),o-e*Lp(r)]}var r=Lp(t),i=t===n?Fp(t):(r-Lp(n))/(n-t),o=r/i+t;return zp(i)=0;)n+=e[r].value;else n=1;t.value=n}function fo(t,n){var e,r,i,o,u,a=new vo(t),c=+t.value&&(a.value=t.value),s=[a];for(null==n&&(n=lo);e=s.pop();)if(c&&(e.value=+e.data.value),(i=n(e.data))&&(u=i.length))for(e.children=new Array(u),o=u-1;o>=0;--o)s.push(r=e.children[o]=new vo(i[o])),r.parent=e,r.depth=e.depth+1;return a.eachBefore(po)}function lo(t){return t.children}function ho(t){t.data=t.data.data}function po(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function vo(t){this.data=t,this.depth=this.height=0,this.parent=null}function go(t){for(var n,e,r=0,i=(t=function(t){for(var n,e,r=t.length;r;)e=Math.random()*r--|0,n=t[r],t[r]=t[e],t[e]=n;return t}(Wd.call(t))).length,o=[];r0&&e*e>r*r+i*i}function mo(t,n){for(var e=0;ee*e+r*r}function To(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function No(t){this._=t,this.next=null,this.previous=null}function ko(t){if(!(i=t.length))return 0;var n,e,r,i,o,u,a,c,s,f,l;if(n=t[0],n.x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;wo(e,n,r=t[2]),n=new No(n),e=new No(e),r=new No(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(a=3;ah&&(h=a),g=f*f*v,(p=Math.max(h/g,g/l))>d){f-=a;break}d=p}_.push(u={value:f,dice:c1&&Vo(t[e[r-2]],t[e[r-1]],t[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function Zo(t){this._size=t,this._call=this._error=null,this._tasks=[],this._data=[],this._waiting=this._active=this._ended=this._start=0}function Go(t){if(!t._start)try{(function(t){for(;t._start=t._waiting&&t._active=0;)if((e=t._tasks[r])&&(t._tasks[r]=null,e.abort))try{e.abort()}catch(n){}t._active=NaN,Jo(t)}function Jo(t){if(!t._active&&t._call){var n=t._data;t._data=void 0,t._call(t._error,n)}}function Ko(t){if(null==t)t=1/0;else if(!((t=+t)>=1))throw new Error("invalid concurrency");return new Zo(t)}function tu(){return Math.random()}function nu(t,n){function e(t){var n,e=s.status;if(!e&&function(t){var n=t.responseType;return n&&"text"!==n?t.response:t.responseText}(s)||e>=200&&e<300||304===e){if(o)try{n=o.call(r,s)}catch(t){return void a.call("error",r,t)}else n=s;a.call("load",r,n)}else a.call("error",r,t)}var r,i,o,u,a=N("beforesend","progress","load","error"),c=se(),s=new XMLHttpRequest,f=null,l=null,h=0;if("undefined"==typeof XDomainRequest||"withCredentials"in s||!/^(http(s)?:)?\/\//.test(t)||(s=new XDomainRequest),"onload"in s?s.onload=s.onerror=s.ontimeout=e:s.onreadystatechange=function(t){s.readyState>3&&e(t)},s.onprogress=function(t){a.call("progress",r,t)},r={header:function(t,n){return t=(t+"").toLowerCase(),arguments.length<2?c.get(t):(null==n?c.remove(t):c.set(t,n+""),r)},mimeType:function(t){return arguments.length?(i=null==t?null:t+"",r):i},responseType:function(t){return arguments.length?(u=t,r):u},timeout:function(t){return arguments.length?(h=+t,r):h},user:function(t){return arguments.length<1?f:(f=null==t?null:t+"",r)},password:function(t){return arguments.length<1?l:(l=null==t?null:t+"",r)},response:function(t){return o=t,r},get:function(t,n){return r.send("GET",t,n)},post:function(t,n){return r.send("POST",t,n)},send:function(n,e,o){return s.open(n,t,!0,f,l),null==i||c.has("accept")||c.set("accept",i+",*/*"),s.setRequestHeader&&c.each(function(t,n){s.setRequestHeader(n,t)}),null!=i&&s.overrideMimeType&&s.overrideMimeType(i),null!=u&&(s.responseType=u),h>0&&(s.timeout=h),null==o&&"function"==typeof e&&(o=e,e=null),null!=o&&1===o.length&&(o=function(t){return function(n,e){t(null==n?e:null)}}(o)),null!=o&&r.on("error",o).on("load",function(t){o(null,t)}),a.call("beforesend",r,s),s.send(null==e?null:e),r},abort:function(){return s.abort(),r},on:function(){var t=a.on.apply(a,arguments);return t===a?r:t}},null!=n){if("function"!=typeof n)throw new Error("invalid callback: "+n);return r.get(n)}return r}function eu(t,n){return function(e,r){var i=nu(e).mimeType(t).response(n);if(null!=r){if("function"!=typeof r)throw new Error("invalid callback: "+r);return i.get(r)}return i}}function ru(t,n){return function(e,r,i){arguments.length<3&&(i=r,r=null);var o=nu(e).mimeType(t);return o.row=function(t){return arguments.length?o.response(function(t,n){return function(e){return t(e.responseText,n)}}(n,r=t)):r},o.row(r),i?o.get(i):o}}function iu(t){function n(n){var o=n+"",u=e.get(o);if(!u){if(i!==yv)return i;e.set(o,u=r.push(n))}return t[(u-1)%t.length]}var e=se(),r=[],i=yv;return t=null==t?[]:_v.call(t),n.domain=function(t){if(!arguments.length)return r.slice();r=[],e=se();for(var i,o,u=-1,a=t.length;++u2?lu:fu,o=u=null,r}function r(n){return(o||(o=i(a,c,f?function(t){return function(n,e){var r=t(n=+n,e=+e);return function(t){return t<=n?0:t>=e?1:r(t)}}}(t):t,s)))(+n)}var i,o,u,a=mv,c=mv,s=fn,f=!1;return r.invert=function(t){return(u||(u=i(c,a,su,f?function(t){return function(n,e){var r=t(n=+n,e=+e);return function(t){return t<=0?n:t>=1?e:r(t)}}}(n):n)))(+t)},r.domain=function(t){return arguments.length?(a=gv.call(t,cu),e()):a.slice()},r.range=function(t){return arguments.length?(c=_v.call(t),e()):c.slice()},r.rangeRound=function(t){return c=_v.call(t),s=ln,e()},r.clamp=function(t){return arguments.length?(f=!!t,e()):f},r.interpolate=function(t){return arguments.length?(s=t,e()):s},e()}function du(n){var e=n.domain;return n.ticks=function(t){var n=e();return l(n[0],n[n.length-1],null==t?10:t)},n.tickFormat=function(n,r){return function(n,e,r){var i,o=n[0],u=n[n.length-1],a=p(o,u,null==e?10:e);switch((r=De(null==r?",f":r)).type){case"s":var c=Math.max(Math.abs(o),Math.abs(u));return null!=r.precision||isNaN(i=Be(a,c))||(r.precision=i),t.formatPrefix(r,c);case"":case"e":case"g":case"p":case"r":null!=r.precision||isNaN(i=He(a,Math.max(Math.abs(o),Math.abs(u))))||(r.precision=i-("e"===r.type));break;case"f":case"%":null!=r.precision||isNaN(i=Ye(a))||(r.precision=i-2*("%"===r.type))}return t.format(r)}(e(),n,r)},n.nice=function(t){null==t&&(t=10);var r,i=e(),o=0,u=i.length-1,a=i[o],c=i[u];return c0?r=h(a=Math.floor(a/r)*r,c=Math.ceil(c/r)*r,t):r<0&&(r=h(a=Math.ceil(a*r)/r,c=Math.floor(c*r)/r,t)),r>0?(i[o]=Math.floor(a/r)*r,i[u]=Math.ceil(c/r)*r,e(i)):r<0&&(i[o]=Math.ceil(a*r)/r,i[u]=Math.floor(c*r)/r,e(i)),n},n}function vu(){var t=pu(su,an);return t.copy=function(){return hu(t,vu())},du(t)}function gu(){function t(t){return+t}var n=[0,1];return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=gv.call(e,cu),t):n.slice()},t.copy=function(){return gu().domain(n)},du(t)}function _u(t,n){var e,r=0,i=(t=t.slice()).length-1,o=t[r],u=t[i];return u0){for(;pc)break;g.push(h)}}else for(;p=1;--f)if(!((h=s*f)c)break;g.push(h)}}else g=l(p,d,Math.min(d-p,v)).map(u);return n?g.reverse():g},e.tickFormat=function(n,r){if(null==r&&(r=10===i?".0e":","),"function"!=typeof r&&(r=t.format(r)),n===1/0)return r;null==n&&(n=10);var a=Math.max(1,i*n/e.ticks().length);return function(t){var n=t/u(Math.round(o(t)));return n*i0?o[n-1]:r[0],n=i?[o[i-1],r]:[o[n-1],o[n]]},t.copy=function(){return Eu().domain([e,r]).range(u)},du(t)}function Au(){function t(t){if(t<=t)return e[Os(n,t,0,r)]}var n=[.5],e=[0,1],r=1;return t.domain=function(i){return arguments.length?(n=_v.call(i),r=Math.min(n.length,e.length-1),t):n.slice()},t.range=function(i){return arguments.length?(e=_v.call(i),r=Math.min(n.length,e.length-1),t):e.slice()},t.invertExtent=function(t){var r=e.indexOf(t);return[n[r-1],n[r]]},t.copy=function(){return Au().domain(n).range(e)},t}function Cu(t,n,e,r){function i(n){return t(n=new Date(+n)),n}return i.floor=i,i.ceil=function(e){return t(e=new Date(e-1)),n(e,1),t(e),e},i.round=function(t){var n=i(t),e=i.ceil(t);return t-n0))return a;do{a.push(u=new Date(+e)),n(e,o),t(e)}while(u=n)for(;t(n),!e(n);)n.setTime(n-1)},function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;n(t,-1),!e(t););else for(;--r>=0;)for(;n(t,1),!e(t););})},e&&(i.count=function(n,r){return xv.setTime(+n),bv.setTime(+r),t(xv),t(bv),Math.floor(e(xv,bv))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(n){return r(n)%t==0}:function(n){return i.count(0,n)%t==0}):i:null}),i}function zu(t){return Cu(function(n){n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+7*n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Tv)/Nv})}function Pu(t){return Cu(function(n){n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+7*n)},function(t,n){return(n-t)/Nv})}function Ru(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return n.setFullYear(t.y),n}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function Lu(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return n.setUTCFullYear(t.y),n}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function qu(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function Du(t){function n(t,n){return function(e){var r,i,o,u=[],a=-1,c=0,s=t.length;for(e instanceof Date||(e=new Date(+e));++a53)return null;"w"in u||(u.w=1),"Z"in u?(i=(o=(i=Lu(qu(u.y))).getUTCDay())>4||0===o?og.ceil(i):og(i),i=eg.offset(i,7*(u.V-1)),u.y=i.getUTCFullYear(),u.m=i.getUTCMonth(),u.d=i.getUTCDate()+(u.w+6)%7):(i=(o=(i=n(qu(u.y))).getDay())>4||0===o?qv.ceil(i):qv(i),i=Pv.offset(i,7*(u.V-1)),u.y=i.getFullYear(),u.m=i.getMonth(),u.d=i.getDate()+(u.w+6)%7)}else("W"in u||"U"in u)&&("w"in u||(u.w="u"in u?u.u%7:"W"in u?1:0),o="Z"in u?Lu(qu(u.y)).getUTCDay():n(qu(u.y)).getDay(),u.m=0,u.d="W"in u?(u.w+6)%7+7*u.W-(o+5)%7:u.w+7*u.U-(o+6)%7);return"Z"in u?(u.H+=u.Z/100|0,u.M+=u.Z%100,Lu(u)):n(u)}}function r(t,n,e,r){for(var i,o,u=0,a=n.length,c=e.length;u=c)return-1;if(37===(i=n.charCodeAt(u++))){if(i=n.charAt(u++),!(o=T[i in Mg?n.charAt(u++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}var i=t.dateTime,o=t.date,u=t.time,a=t.periods,c=t.days,s=t.shortDays,f=t.months,l=t.shortMonths,h=Fu(a),p=Iu(a),d=Fu(c),v=Iu(c),g=Fu(s),_=Iu(s),y=Fu(f),m=Iu(f),x=Fu(l),b=Iu(l),w={a:function(t){return s[t.getDay()]},A:function(t){return c[t.getDay()]},b:function(t){return l[t.getMonth()]},B:function(t){return f[t.getMonth()]},c:null,d:ua,e:ua,f:la,H:aa,I:ca,j:sa,L:fa,m:ha,M:pa,p:function(t){return a[+(t.getHours()>=12)]},Q:Ya,s:Ba,S:da,u:va,U:ga,V:_a,w:ya,W:ma,x:null,X:null,y:xa,Y:ba,Z:wa,"%":Ia},M={a:function(t){return s[t.getUTCDay()]},A:function(t){return c[t.getUTCDay()]},b:function(t){return l[t.getUTCMonth()]},B:function(t){return f[t.getUTCMonth()]},c:null,d:Ma,e:Ma,f:Ea,H:Ta,I:Na,j:ka,L:Sa,m:Aa,M:Ca,p:function(t){return a[+(t.getUTCHours()>=12)]},Q:Ya,s:Ba,S:za,u:Pa,U:Ra,V:La,w:qa,W:Da,x:null,X:null,y:Ua,Y:Oa,Z:Fa,"%":Ia},T={a:function(t,n,e){var r=g.exec(n.slice(e));return r?(t.w=_[r[0].toLowerCase()],e+r[0].length):-1},A:function(t,n,e){var r=d.exec(n.slice(e));return r?(t.w=v[r[0].toLowerCase()],e+r[0].length):-1},b:function(t,n,e){var r=x.exec(n.slice(e));return r?(t.m=b[r[0].toLowerCase()],e+r[0].length):-1},B:function(t,n,e){var r=y.exec(n.slice(e));return r?(t.m=m[r[0].toLowerCase()],e+r[0].length):-1},c:function(t,n,e){return r(t,i,n,e)},d:Gu,e:Gu,f:ea,H:Ju,I:Ju,j:Qu,L:na,m:Zu,M:Ku,p:function(t,n,e){var r=h.exec(n.slice(e));return r?(t.p=p[r[0].toLowerCase()],e+r[0].length):-1},Q:ia,s:oa,S:ta,u:Bu,U:Hu,V:ju,w:Yu,W:Xu,x:function(t,n,e){return r(t,o,n,e)},X:function(t,n,e){return r(t,u,n,e)},y:$u,Y:Vu,Z:Wu,"%":ra};return w.x=n(o,w),w.X=n(u,w),w.c=n(i,w),M.x=n(o,M),M.X=n(u,M),M.c=n(i,M),{format:function(t){var e=n(t+="",w);return e.toString=function(){return t},e},parse:function(t){var n=e(t+="",Ru);return n.toString=function(){return t},n},utcFormat:function(t){var e=n(t+="",M);return e.toString=function(){return t},e},utcParse:function(t){var n=e(t,Lu);return n.toString=function(){return t},n}}}function Uu(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o68?1900:2e3),e+r[0].length):-1}function Wu(t,n,e){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function Zu(t,n,e){var r=Tg.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function Gu(t,n,e){var r=Tg.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function Qu(t,n,e){var r=Tg.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function Ju(t,n,e){var r=Tg.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function Ku(t,n,e){var r=Tg.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function ta(t,n,e){var r=Tg.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function na(t,n,e){var r=Tg.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function ea(t,n,e){var r=Tg.exec(n.slice(e,e+6));return r?(t.L=Math.floor(r[0]/1e3),e+r[0].length):-1}function ra(t,n,e){var r=Ng.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function ia(t,n,e){var r=Tg.exec(n.slice(e));return r?(t.Q=+r[0],e+r[0].length):-1}function oa(t,n,e){var r=Tg.exec(n.slice(e));return r?(t.Q=1e3*+r[0],e+r[0].length):-1}function ua(t,n){return Uu(t.getDate(),n,2)}function aa(t,n){return Uu(t.getHours(),n,2)}function ca(t,n){return Uu(t.getHours()%12||12,n,2)}function sa(t,n){return Uu(1+Pv.count(Gv(t),t),n,3)}function fa(t,n){return Uu(t.getMilliseconds(),n,3)}function la(t,n){return fa(t,n)+"000"}function ha(t,n){return Uu(t.getMonth()+1,n,2)}function pa(t,n){return Uu(t.getMinutes(),n,2)}function da(t,n){return Uu(t.getSeconds(),n,2)}function va(t){var n=t.getDay();return 0===n?7:n}function ga(t,n){return Uu(Lv.count(Gv(t),t),n,2)}function _a(t,n){var e=t.getDay();return t=e>=4||0===e?Ov(t):Ov.ceil(t),Uu(Ov.count(Gv(t),t)+(4===Gv(t).getDay()),n,2)}function ya(t){return t.getDay()}function ma(t,n){return Uu(qv.count(Gv(t),t),n,2)}function xa(t,n){return Uu(t.getFullYear()%100,n,2)}function ba(t,n){return Uu(t.getFullYear()%1e4,n,4)}function wa(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+Uu(n/60|0,"0",2)+Uu(n%60,"0",2)}function Ma(t,n){return Uu(t.getUTCDate(),n,2)}function Ta(t,n){return Uu(t.getUTCHours(),n,2)}function Na(t,n){return Uu(t.getUTCHours()%12||12,n,2)}function ka(t,n){return Uu(1+eg.count(xg(t),t),n,3)}function Sa(t,n){return Uu(t.getUTCMilliseconds(),n,3)}function Ea(t,n){return Sa(t,n)+"000"}function Aa(t,n){return Uu(t.getUTCMonth()+1,n,2)}function Ca(t,n){return Uu(t.getUTCMinutes(),n,2)}function za(t,n){return Uu(t.getUTCSeconds(),n,2)}function Pa(t){var n=t.getUTCDay();return 0===n?7:n}function Ra(t,n){return Uu(ig.count(xg(t),t),n,2)}function La(t,n){var e=t.getUTCDay();return t=e>=4||0===e?cg(t):cg.ceil(t),Uu(cg.count(xg(t),t)+(4===xg(t).getUTCDay()),n,2)}function qa(t){return t.getUTCDay()}function Da(t,n){return Uu(og.count(xg(t),t),n,2)}function Ua(t,n){return Uu(t.getUTCFullYear()%100,n,2)}function Oa(t,n){return Uu(t.getUTCFullYear()%1e4,n,4)}function Fa(){return"+0000"}function Ia(){return"%"}function Ya(t){return+t}function Ba(t){return Math.floor(+t/1e3)}function Ha(n){return bg=Du(n),t.timeFormat=bg.format,t.timeParse=bg.parse,t.utcFormat=bg.utcFormat,t.utcParse=bg.utcParse,bg}function ja(t){return new Date(t)}function Xa(t){return t instanceof Date?+t:+new Date(+t)}function Va(t,n,r,i,o,u,a,c,s){function f(e){return(a(e)=1?i_:t<=-1?-i_:Math.asin(t)}function Ja(t){return t.innerRadius}function Ka(t){return t.outerRadius}function tc(t){return t.startAngle}function nc(t){return t.endAngle}function ec(t){return t&&t.padAngle}function rc(t,n,e,r,i,o,u){var a=t-e,c=n-r,s=(u?o:-o)/n_(a*a+c*c),f=s*c,l=-s*a,h=t+f,p=n+l,d=e+f,v=r+l,g=(h+d)/2,_=(p+v)/2,y=d-h,m=v-p,x=y*y+m*m,b=i-o,w=h*v-d*p,M=(m<0?-1:1)*n_(Jg(0,b*b*x-w*w)),T=(w*m-y*M)/x,N=(-w*y-m*M)/x,k=(w*m+y*M)/x,S=(-w*y+m*M)/x,E=T-g,A=N-_,C=k-g,z=S-_;return E*E+A*A>C*C+z*z&&(T=k,N=S),{cx:T,cy:N,x01:-f,y01:-l,x11:T*(i/b-1),y11:N*(i/b-1)}}function ic(t){this._context=t}function oc(t){return new ic(t)}function uc(t){return t[0]}function ac(t){return t[1]}function cc(){function t(t){var a,c,s,f=t.length,l=!1;for(null==i&&(u=o(s=ee())),a=0;a<=f;++a)!(a=f;--l)s.point(g[l],_[l]);s.lineEnd(),s.areaEnd()}v&&(g[n]=+e(h,n,t),_[n]=+i(h,n,t),s.point(r?+r(h,n,t):g[n],o?+o(h,n,t):_[n]))}if(p)return s=null,p+""||null}function n(){return cc().defined(u).curve(c).context(a)}var e=uc,r=null,i=Ga(0),o=ac,u=Ga(!0),a=null,c=oc,s=null;return t.x=function(n){return arguments.length?(e="function"==typeof n?n:Ga(+n),r=null,t):e},t.x0=function(n){return arguments.length?(e="function"==typeof n?n:Ga(+n),t):e},t.x1=function(n){return arguments.length?(r=null==n?null:"function"==typeof n?n:Ga(+n),t):r},t.y=function(n){return arguments.length?(i="function"==typeof n?n:Ga(+n),o=null,t):i},t.y0=function(n){return arguments.length?(i="function"==typeof n?n:Ga(+n),t):i},t.y1=function(n){return arguments.length?(o=null==n?null:"function"==typeof n?n:Ga(+n),t):o},t.lineX0=t.lineY0=function(){return n().x(e).y(i)},t.lineY1=function(){return n().x(e).y(o)},t.lineX1=function(){return n().x(r).y(i)},t.defined=function(n){return arguments.length?(u="function"==typeof n?n:Ga(!!n),t):u},t.curve=function(n){return arguments.length?(c=n,null!=a&&(s=c(a)),t):c},t.context=function(n){return arguments.length?(null==n?a=s=null:s=c(a=n),t):a},t}function fc(t,n){return nt?1:n>=t?0:NaN}function lc(t){return t}function hc(t){this._curve=t}function pc(t){function n(n){return new hc(t(n))}return n._curve=t,n}function dc(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(pc(t)):n()._curve},t}function vc(){return dc(cc().curve(u_))}function gc(){var t=sc().curve(u_),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return dc(e())},delete t.lineX0,t.lineEndAngle=function(){return dc(r())},delete t.lineX1,t.lineInnerRadius=function(){return dc(i())},delete t.lineY0,t.lineOuterRadius=function(){return dc(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(pc(t)):n()._curve},t}function _c(t,n){return[(n=+n)*Math.cos(t-=Math.PI/2),n*Math.sin(t)]}function yc(t){return t.source}function mc(t){return t.target}function xc(t){function n(){var n,a=a_.call(arguments),c=e.apply(this,a),s=r.apply(this,a);if(u||(u=n=ee()),t(u,+i.apply(this,(a[0]=c,a)),+o.apply(this,a),+i.apply(this,(a[0]=s,a)),+o.apply(this,a)),n)return u=null,n+""||null}var e=yc,r=mc,i=uc,o=ac,u=null;return n.source=function(t){return arguments.length?(e=t,n):e},n.target=function(t){return arguments.length?(r=t,n):r},n.x=function(t){return arguments.length?(i="function"==typeof t?t:Ga(+t),n):i},n.y=function(t){return arguments.length?(o="function"==typeof t?t:Ga(+t),n):o},n.context=function(t){return arguments.length?(u=null==t?null:t,n):u},n}function bc(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n=(n+r)/2,e,n,i,r,i)}function wc(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n,e=(e+i)/2,r,e,r,i)}function Mc(t,n,e,r,i){var o=_c(n,e),u=_c(n,e=(e+i)/2),a=_c(r,e),c=_c(r,i);t.moveTo(o[0],o[1]),t.bezierCurveTo(u[0],u[1],a[0],a[1],c[0],c[1])}function Tc(){}function Nc(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function kc(t){this._context=t}function Sc(t){this._context=t}function Ec(t){this._context=t}function Ac(t,n){this._basis=new kc(t),this._beta=n}function Cc(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function zc(t,n){this._context=t,this._k=(1-n)/6}function Pc(t,n){this._context=t,this._k=(1-n)/6}function Rc(t,n){this._context=t,this._k=(1-n)/6}function Lc(t,n,e){var r=t._x1,i=t._y1,o=t._x2,u=t._y2;if(t._l01_a>e_){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>e_){var s=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*s+t._x1*t._l23_2a-n*t._l12_2a)/f,u=(u*s+t._y1*t._l23_2a-e*t._l12_2a)/f}t._context.bezierCurveTo(r,i,o,u,t._x2,t._y2)}function qc(t,n){this._context=t,this._alpha=n}function Dc(t,n){this._context=t,this._alpha=n}function Uc(t,n){this._context=t,this._alpha=n}function Oc(t){this._context=t}function Fc(t){return t<0?-1:1}function Ic(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),u=(e-t._y1)/(i||r<0&&-0),a=(o*i+u*r)/(r+i);return(Fc(o)+Fc(u))*Math.min(Math.abs(o),Math.abs(u),.5*Math.abs(a))||0}function Yc(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function Bc(t,n,e){var r=t._x0,i=t._y0,o=t._x1,u=t._y1,a=(o-r)/3;t._context.bezierCurveTo(r+a,i+a*n,o-a,u-a*e,o,u)}function Hc(t){this._context=t}function jc(t){this._context=new Xc(t)}function Xc(t){this._context=t}function Vc(t){this._context=t}function $c(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),u=new Array(r);for(i[0]=0,o[0]=2,u[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(u[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n1)for(var e,r,i,o=1,u=t[n[0]],a=u.length;o=0;)e[n]=n;return e}function Qc(t,n){return t[n]}function Jc(t){var n=t.map(Kc);return Gc(t).sort(function(t,e){return n[t]-n[e]})}function Kc(t){for(var n,e=0,r=-1,i=t.length;++r0)){if(o/=h,h<0){if(o0){if(o>l)return;o>f&&(f=o)}if(o=r-c,h||!(o<0)){if(o/=h,h<0){if(o>l)return;o>f&&(f=o)}else if(h>0){if(o0)){if(o/=p,p<0){if(o0){if(o>l)return;o>f&&(f=o)}if(o=i-s,p||!(o<0)){if(o/=p,p<0){if(o>l)return;o>f&&(f=o)}else if(p>0){if(o0||l<1)||(f>0&&(t[0]=[c+f*h,s+f*p]),l<1&&(t[1]=[c+l*h,s+l*p]),!0)}}}}}function hs(t,n,e,r,i){var o=t[1];if(o)return!0;var u,a,c=t[0],s=t.left,f=t.right,l=s[0],h=s[1],p=f[0],d=f[1],v=(l+p)/2,g=(h+d)/2;if(d===h){if(v=r)return;if(l>p){if(c){if(c[1]>=i)return}else c=[v,e];o=[v,i]}else{if(c){if(c[1]1)if(l>p){if(c){if(c[1]>=i)return}else c=[(e-a)/u,e];o=[(i-a)/u,i]}else{if(c){if(c[1]=r)return}else c=[n,u*n+a];o=[r,u*r+a]}else{if(c){if(c[0]=-I_)){var p=c*c+s*s,d=f*f+l*l,v=(l*p-s*d)/h,g=(c*d-f*p)/h,_=U_.pop()||new function(){is(this),this.x=this.y=this.arc=this.site=this.cy=null};_.arc=t,_.site=i,_.x=v+u,_.y=(_.cy=g+a)+Math.sqrt(v*v+g*g),t.circle=_;for(var y=null,m=q_._;m;)if(_.yF_)a=a.L;else{if(!((i=o-function(t,n){var e=t.N;if(e)return ws(e,n);var r=t.site;return r[1]===n?r[0]:1/0}(a,u))>F_)){r>-F_?(n=a.P,e=a):i>-F_?(n=a,e=a.N):n=e=a;break}if(!a.R){n=a;break}a=a.R}(function(t){L_[t.index]={site:t,halfedges:[]}})(t);var c=ys(t);if(R_.insert(n,c),n||e){if(n===e)return _s(n),e=ys(n.site),R_.insert(c,e),c.edge=e.edge=cs(n.site,c.site),gs(n),void gs(e);if(e){_s(n),_s(e);var s=n.site,f=s[0],l=s[1],h=t[0]-f,p=t[1]-l,d=e.site,v=d[0]-f,g=d[1]-l,_=2*(h*g-p*v),y=h*h+p*p,m=v*v+g*g,x=[(g*y-p*m)/_+f,(h*m-v*y)/_+l];fs(e.edge,s,d,x),c.edge=cs(s,t,null,x),e.edge=cs(t,d,null,x),gs(n),gs(e)}else c.edge=cs(n.site,c.site)}}function ws(t,n){var e=t.site,r=e[0],i=e[1],o=i-n;if(!o)return r;var u=t.P;if(!u)return-1/0;var a=(e=u.site)[0],c=e[1],s=c-n;if(!s)return a;var f=a-r,l=1/o-1/s,h=f/s;return l?(-h+Math.sqrt(h*h-2*l*(f*f/(-2*s)-c+s/2+i-o/2)))/l+r:(r+a)/2}function Ms(t,n,e){return(t[0]-e[0])*(n[1]-t[1])-(t[0]-n[0])*(e[1]-t[1])}function Ts(t,n){return n[1]-t[1]||n[0]-t[0]}function Ns(t,n){var e,r,i,o=t.sort(Ts).pop();for(D_=[],L_=new Array(t.length),R_=new rs,q_=new rs;;)if(i=P_,o&&(!i||o[1]F_||Math.abs(i[0][1]-i[1][1])>F_)||delete D_[o]})(u,a,c,s),function(t,n,e,r){var i,o,u,a,c,s,f,l,h,p,d,v,g=L_.length,_=!0;for(i=0;iF_||Math.abs(v-h)>F_)&&(c.splice(a,0,D_.push(ss(u,p,Math.abs(d-t)F_?[t,Math.abs(l-t)F_?[Math.abs(h-r)F_?[e,Math.abs(l-e)F_?[Math.abs(h-n)r?(r+i)/2:Math.min(0,r)||Math.max(0,i),u>o?(o+u)/2:Math.min(0,o)||Math.max(0,u))}var Us=e(n),Os=Us.right,Fs=Us.left,Is=Array.prototype,Ys=Is.slice,Bs=Is.map,Hs=Math.sqrt(50),js=Math.sqrt(10),Xs=Math.sqrt(2),Vs=Array.prototype.slice,$s=1,Ws=2,Zs=3,Gs=4,Qs=1e-6,Js={value:function(){}};k.prototype=N.prototype={constructor:k,on:function(t,n){var e,r=this._,i=function(t,n){return t.trim().split(/^|\s+/).map(function(t){var e="",r=t.indexOf(".");if(r>=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})}(t+"",r),o=-1,u=i.length;{if(!(arguments.length<2)){if(null!=n&&"function"!=typeof n)throw new Error("invalid callback: "+n);for(;++o0)for(var e,r,i=new Array(e),o=0;o=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var af={};if(t.event=null,"undefined"!=typeof document){"onmouseenter"in document.documentElement||(af={mouseenter:"mouseover",mouseleave:"mouseout"})}var cf=[null];ut.prototype=at.prototype={constructor:ut,select:function(t){"function"!=typeof t&&(t=z(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i=x&&(x=m+1);!(y=g[x])&&++x=0;)(r=i[o])&&(u&&u!==r.nextSibling&&u.parentNode.insertBefore(r,u),u=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=O);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof n?function(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}:function(t,n,e){return function(){this.style.setProperty(t,n,e)}})(t,n,null==e?"":e)):I(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?function(t){return function(){delete this[t]}}:"function"==typeof n?function(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}:function(t,n){return function(){this[t]=n}})(t,n)):this.node()[t]},classed:function(t,n){var e=Y(t+"");if(arguments.length<2){for(var r=B(this.node()),i=-1,o=e.length;++i=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}})}(t+""),u=o.length;if(!(arguments.length<2)){for(a=n?rt:et,null==e&&(e=!1),r=0;r=240?t-240:t+120,i,r),Ut(t,i,r),Ut(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var wf=Math.PI/180,Mf=180/Math.PI,Tf=.95047,Nf=1,kf=1.08883,Sf=4/29,Ef=6/29,Af=3*Ef*Ef,Cf=Ef*Ef*Ef;Nt(It,Ft,kt(St,{brighter:function(t){return new It(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new It(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,n=isNaN(this.a)?t:t+this.a/500,e=isNaN(this.b)?t:t-this.b/200;return t=Nf*Bt(t),n=Tf*Bt(n),e=kf*Bt(e),new Rt(Ht(3.2404542*n-1.5371385*t-.4985314*e),Ht(-.969266*n+1.8760108*t+.041556*e),Ht(.0556434*n-.2040259*t+1.0572252*e),this.opacity)}})),Nt(Vt,Xt,kt(St,{brighter:function(t){return new Vt(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new Vt(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return Ot(this).rgb()}}));var zf=-.29227,Pf=-.90649,Rf=1.97294,Lf=Rf*Pf,qf=1.78277*Rf,Df=1.78277*zf- -.14861*Pf;Nt(Wt,$t,kt(St,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Wt(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Wt(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*wf,n=+this.l,e=isNaN(this.s)?0:this.s*n*(1-n),r=Math.cos(t),i=Math.sin(t);return new Rt(255*(n+e*(-.14861*r+1.78277*i)),255*(n+e*(zf*r+Pf*i)),255*(n+e*(Rf*r)),this.opacity)}}));var Uf,Of,Ff,If,Yf,Bf,Hf=function t(n){function e(t,n){var e=r((t=Pt(t)).r,(n=Pt(n)).r),i=r(t.g,n.g),o=r(t.b,n.b),u=en(t.opacity,n.opacity);return function(n){return t.r=e(n),t.g=i(n),t.b=o(n),t.opacity=u(n),t+""}}var r=nn(n);return e.gamma=t,e}(1),jf=rn(Gt),Xf=rn(Qt),Vf=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,$f=new RegExp(Vf.source,"g"),Wf=180/Math.PI,Zf={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1},Gf=pn(function(t){return"none"===t?Zf:(Uf||(Uf=document.createElement("DIV"),Of=document.documentElement,Ff=document.defaultView),Uf.style.transform=t,t=Ff.getComputedStyle(Of.appendChild(Uf),null).getPropertyValue("transform"),Of.removeChild(Uf),t=t.slice(7,-1).split(","),hn(+t[0],+t[1],+t[2],+t[3],+t[4],+t[5]))},"px, ","px)","deg)"),Qf=pn(function(t){return null==t?Zf:(If||(If=document.createElementNS("http://www.w3.org/2000/svg","g")),If.setAttribute("transform",t),(t=If.transform.baseVal.consolidate())?(t=t.matrix,hn(t.a,t.b,t.c,t.d,t.e,t.f)):Zf)},", ",")",")"),Jf=Math.SQRT2,Kf=2,tl=4,nl=1e-12,el=gn(tn),rl=gn(en),il=_n(tn),ol=_n(en),ul=yn(tn),al=yn(en),cl=0,sl=0,fl=0,ll=1e3,hl=0,pl=0,dl=0,vl="object"==typeof performance&&performance.now?performance:Date,gl="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};bn.prototype=wn.prototype={constructor:bn,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?mn():+e)+(null==n?0:+n),this._next||Bf===this||(Bf?Bf._next=this:Yf=this,Bf=this),this._call=t,this._time=e,kn()},stop:function(){this._call&&(this._call=null,this._time=1/0,kn())}};var _l=N("start","end","interrupt"),yl=[],ml=0,xl=1,bl=2,wl=3,Ml=4,Tl=5,Nl=6,kl=at.prototype.constructor,Sl=0,El=at.prototype;qn.prototype=Dn.prototype={constructor:qn,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=z(t));for(var r=this._groups,i=r.length,o=new Array(i),u=0;u=0&&(t=t.slice(0,n)),!t||"start"===t})}(n)?An:Cn;return function(){var u=o(this,t),a=u.on;a!==r&&(i=(r=a).copy()).on(n,e),u.on=i}}(e,t,n))},attr:function(t,n){var e=E(t),r="transform"===e?Qf:Ln;return this.attrTween(t,"function"==typeof n?(e.local?function(t,n,e){var r,i,o;return function(){var u,a=e(this);if(null!=a)return(u=this.getAttributeNS(t.space,t.local))===a?null:u===r&&a===i?o:o=n(r=u,i=a);this.removeAttributeNS(t.space,t.local)}}:function(t,n,e){var r,i,o;return function(){var u,a=e(this);if(null!=a)return(u=this.getAttribute(t))===a?null:u===r&&a===i?o:o=n(r=u,i=a);this.removeAttribute(t)}})(e,r,Rn(this,"attr."+t,n)):null==n?(e.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(e):(e.local?function(t,n,e){var r,i;return function(){var o=this.getAttributeNS(t.space,t.local);return o===e?null:o===r?i:i=n(r=o,e)}}:function(t,n,e){var r,i;return function(){var o=this.getAttribute(t);return o===e?null:o===r?i:i=n(r=o,e)}})(e,r,n+""))},attrTween:function(t,n){var e="attr."+t;if(arguments.length<2)return(e=this.tween(e))&&e._value;if(null==n)return this.tween(e,null);if("function"!=typeof n)throw new Error;var r=E(t);return this.tween(e,(r.local?function(t,n){function e(){var e=this,r=n.apply(e,arguments);return r&&function(n){e.setAttributeNS(t.space,t.local,r(n))}}return e._value=n,e}:function(t,n){function e(){var e=this,r=n.apply(e,arguments);return r&&function(n){e.setAttribute(t,r(n))}}return e._value=n,e})(r,n))},style:function(t,n,e){var r="transform"==(t+="")?Gf:Ln;return null==n?this.styleTween(t,function(t,n){var e,r,i;return function(){var o=I(this,t),u=(this.style.removeProperty(t),I(this,t));return o===u?null:o===e&&u===r?i:i=n(e=o,r=u)}}(t,r)).on("end.style."+t,function(t){return function(){this.style.removeProperty(t)}}(t)):this.styleTween(t,"function"==typeof n?function(t,n,e){var r,i,o;return function(){var u=I(this,t),a=e(this);return null==a&&(this.style.removeProperty(t),a=I(this,t)),u===a?null:u===r&&a===i?o:o=n(r=u,i=a)}}(t,r,Rn(this,"style."+t,n)):function(t,n,e){var r,i;return function(){var o=I(this,t);return o===e?null:o===r?i:i=n(r=o,e)}}(t,r,n+""),e)},styleTween:function(t,n,e){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==n)return this.tween(r,null);if("function"!=typeof n)throw new Error;return this.tween(r,function(t,n,e){function r(){var r=this,i=n.apply(r,arguments);return i&&function(n){r.style.setProperty(t,i(n),e)}}return r._value=n,r}(t,n,null==e?"":e))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var n=t(this);this.textContent=null==n?"":n}}(Rn(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},remove:function(){return this.on("end.remove",function(t){return function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}}(this._id))},tween:function(t,n){var e=this._id;if(t+="",arguments.length<2){for(var r,i=zn(this.node(),e).tween,o=0,u=i.length;o1e-6)if(Math.abs(f*a-c*s)>1e-6&&i){var h=e-o,p=r-u,d=a*a+c*c,v=h*h+p*p,g=Math.sqrt(d),_=Math.sqrt(l),y=i*Math.tan((yh-Math.acos((d+l-v)/(2*g*_)))/2),m=y/_,x=y/g;Math.abs(m-1)>1e-6&&(this._+="L"+(t+m*s)+","+(n+m*f)),this._+="A"+i+","+i+",0,0,"+ +(f*h>s*p)+","+(this._x1=t+x*a)+","+(this._y1=n+x*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n;var u=(e=+e)*Math.cos(r),a=e*Math.sin(r),c=t+u,s=n+a,f=1^o,l=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+s:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-s)>1e-6)&&(this._+="L"+c+","+s),e&&(l<0&&(l=l%mh+mh),l>xh?this._+="A"+e+","+e+",0,1,"+f+","+(t-u)+","+(n-a)+"A"+e+","+e+",0,1,"+f+","+(this._x1=c)+","+(this._y1=s):l>1e-6&&(this._+="A"+e+","+e+",0,"+ +(l>=yh)+","+f+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};ce.prototype=se.prototype={constructor:ce,has:function(t){return"$"+t in this},get:function(t){return this["$"+t]},set:function(t,n){return this["$"+t]=n,this},remove:function(t){var n="$"+t;return n in this&&delete this[n]},clear:function(){for(var t in this)"$"===t[0]&&delete this[t]},keys:function(){var t=[];for(var n in this)"$"===n[0]&&t.push(n.slice(1));return t},values:function(){var t=[];for(var n in this)"$"===n[0]&&t.push(this[n]);return t},entries:function(){var t=[];for(var n in this)"$"===n[0]&&t.push({key:n.slice(1),value:this[n]});return t},size:function(){var t=0;for(var n in this)"$"===n[0]&&++t;return t},empty:function(){for(var t in this)if("$"===t[0])return!1;return!0},each:function(t){for(var n in this)"$"===n[0]&&t(this[n],n.slice(1),this)}};var bh=se.prototype;de.prototype=ve.prototype={constructor:de,has:bh.has,add:function(t){return t+="",this["$"+t]=t,this},remove:bh.remove,clear:bh.clear,values:bh.keys,size:bh.size,empty:bh.empty,each:bh.each};var wh={},Mh={},Th=34,Nh=10,kh=13,Sh=_e(","),Eh=Sh.parse,Ah=Sh.parseRows,Ch=Sh.format,zh=Sh.formatRows,Ph=_e("\t"),Rh=Ph.parse,Lh=Ph.parseRows,qh=Ph.format,Dh=Ph.formatRows,Uh=Te.prototype=Ne.prototype;Uh.copy=function(){var t,n,e=new Ne(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=ke(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=ke(n));return e},Uh.add=function(t){var n=+this._x.call(null,t),e=+this._y.call(null,t);return xe(this.cover(n,e),n,e,t)},Uh.addAll=function(t){var n,e,r,i,o=t.length,u=new Array(o),a=new Array(o),c=1/0,s=1/0,f=-1/0,l=-1/0;for(e=0;ef&&(f=r),il&&(l=i));for(ft||t>i||r>n||n>o))return this;var u,a,c=i-e,s=this._root;switch(a=(n<(r+o)/2)<<1|t<(e+i)/2){case 0:do{u=new Array(4),u[a]=s,s=u}while(c*=2,i=e+c,o=r+c,t>i||n>o);break;case 1:do{u=new Array(4),u[a]=s,s=u}while(c*=2,e=i-c,o=r+c,e>t||n>o);break;case 2:do{u=new Array(4),u[a]=s,s=u}while(c*=2,i=e+c,r=o-c,t>i||r>n);break;case 3:do{u=new Array(4),u[a]=s,s=u}while(c*=2,e=i-c,r=o-c,e>t||r>n)}this._root&&this._root.length&&(this._root=s)}return this._x0=e,this._y0=r,this._x1=i,this._y1=o,this},Uh.data=function(){var t=[];return this.visit(function(n){if(!n.length)do{t.push(n.data)}while(n=n.next)}),t},Uh.extent=function(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},Uh.find=function(t,n,e){var r,i,o,u,a,c,s,f=this._x0,l=this._y0,h=this._x1,p=this._y1,d=[],v=this._root;for(v&&d.push(new be(v,f,l,h,p)),null==e?e=1/0:(f=t-e,l=n-e,h=t+e,p=n+e,e*=e);c=d.pop();)if(!(!(v=c.node)||(i=c.x0)>h||(o=c.y0)>p||(u=c.x1)=_)<<1|t>=g)&&(c=d[d.length-1],d[d.length-1]=d[d.length-1-s],d[d.length-1-s]=c)}else{var y=t-+this._x.call(null,v.data),m=n-+this._y.call(null,v.data),x=y*y+m*m;if(x=(a=(d+g)/2))?d=a:g=a,(f=u>=(c=(v+_)/2))?v=c:_=c,n=p,!(p=p[l=f<<1|s]))return this;if(!p.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;p.data!==t;)if(r=p,!(p=p.next))return this;return(i=p.next)&&delete p.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(p=n[0]||n[1]||n[2]||n[3])&&p===(n[3]||n[2]||n[1]||n[0])&&!p.length&&(e?e[h]=p:this._root=p),this):(this._root=i,this)},Uh.removeAll=function(t){for(var n=0,e=t.length;n0&&(o=0)}return o>0?t.slice(0,o)+t.slice(e+1):t},"%":function(t,n){return(100*t).toFixed(n)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},g:function(t,n){return t.toPrecision(n)},o:function(t){return Math.round(t).toString(8)},p:function(t,n){return qe(100*t,n)},r:qe,s:function(t,n){var e=Re(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(Oh=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,u=r.length;return o===u?r:o>u?r+new Array(o-u+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+Re(t,Math.max(0,n+o-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}},Bh=/^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;De.prototype=Ue.prototype,Ue.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+this.type};var Hh,jh=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];Ie({decimal:".",thousands:",",grouping:[3],currency:["$",""]}),Xe.prototype={constructor:Xe,reset:function(){this.s=this.t=0},add:function(t){Ve(wp,t,this.t),Ve(this,wp.s,this.s),this.s?this.t+=wp.t:this.s=wp.t},valueOf:function(){return this.s}};var Xh,Vh,$h,Wh,Zh,Gh,Qh,Jh,Kh,tp,np,ep,rp,ip,op,up,ap,cp,sp,fp,lp,hp,pp,dp,vp,gp,_p,yp,mp,xp,bp,wp=new Xe,Mp=1e-6,Tp=1e-12,Np=Math.PI,kp=Np/2,Sp=Np/4,Ep=2*Np,Ap=180/Np,Cp=Np/180,zp=Math.abs,Pp=Math.atan,Rp=Math.atan2,Lp=Math.cos,qp=Math.ceil,Dp=Math.exp,Up=Math.log,Op=Math.pow,Fp=Math.sin,Ip=Math.sign||function(t){return t>0?1:t<0?-1:0},Yp=Math.sqrt,Bp=Math.tan,Hp={Feature:function(t,n){Qe(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++rMp?Kh=90:Wp<-Mp&&(Qh=-90),op[0]=Gh,op[1]=Jh}},Gp={sphere:Ge,point:wr,lineStart:Tr,lineEnd:Sr,polygonStart:function(){Gp.lineStart=Er,Gp.lineEnd=Ar},polygonEnd:function(){Gp.lineStart=Tr,Gp.lineEnd=Sr}};Lr.invert=Lr;var Qp,Jp,Kp,td,nd,ed,rd,id,od,ud,ad,cd=je(),sd=Wr(function(){return!0},function(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,u){var a=o>0?Np:-Np,c=zp(o-e);zp(c-Np)0?kp:-kp),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),t.point(o,r),n=0):i!==a&&c>=Np&&(zp(e-i)Mp?Pp((Fp(n)*(o=Lp(r))*Fp(e)-Fp(r)*(i=Lp(n))*Fp(t))/(i*o*u)):(n+r)/2}(e,r,o,u),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),n=0),t.point(e=o,r=u),i=a},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}},function(t,n,e,r){var i;if(null==t)i=e*kp,r.point(-Np,i),r.point(0,i),r.point(Np,i),r.point(Np,0),r.point(Np,-i),r.point(0,-i),r.point(-Np,-i),r.point(-Np,0),r.point(-Np,i);else if(zp(t[0]-n[0])>Mp){var o=t[0]Md&&(Md=t),nTd&&(Td=n)},lineStart:Ge,lineEnd:Ge,polygonStart:Ge,polygonEnd:Ge,result:function(){var t=[[bd,wd],[Md,Td]];return Md=Td=-(wd=bd=1/0),t}},kd=0,Sd=0,Ed=0,Ad=0,Cd=0,zd=0,Pd=0,Rd=0,Ld=0,qd={point:yi,lineStart:mi,lineEnd:wi,polygonStart:function(){qd.lineStart=Mi,qd.lineEnd=Ti},polygonEnd:function(){qd.point=yi,qd.lineStart=mi,qd.lineEnd=wi},result:function(){var t=Ld?[Pd/Ld,Rd/Ld]:zd?[Ad/zd,Cd/zd]:Ed?[kd/Ed,Sd/Ed]:[NaN,NaN];return kd=Sd=Ed=Ad=Cd=zd=Pd=Rd=Ld=0,t}};Si.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._context.moveTo(t,n),this._point=1;break;case 1:this._context.lineTo(t,n);break;default:this._context.moveTo(t+this._radius,n),this._context.arc(t,n,this._radius,0,Ep)}},result:Ge};var Dd,Ud,Od,Fd,Id,Yd=je(),Bd={point:Ge,lineStart:function(){Bd.point=Ei},lineEnd:function(){Dd&&Ai(Ud,Od),Bd.point=Ge},polygonStart:function(){Dd=!0},polygonEnd:function(){Dd=null},result:function(){var t=+Yd;return Yd.reset(),t}};Ci.prototype={_radius:4.5,_circle:zi(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._string.push("M",t,",",n),this._point=1;break;case 1:this._string.push("L",t,",",n);break;default:null==this._circle&&(this._circle=zi(this._radius)),this._string.push("M",t,",",n,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},Ri.prototype={constructor:Ri,point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Hd=16,jd=Lp(30*Cp),Xd=Pi({point:function(t,n){this.stream.point(t*Cp,n*Cp)}}),Vd=Vi(function(t){return Yp(2/(1+t))});Vd.invert=$i(function(t){return 2*We(t/2)});var $d=Vi(function(t){return(t=$e(t))&&t/Fp(t)});$d.invert=$i(function(t){return t}),Wi.invert=function(t,n){return[t,2*Pp(Dp(n))-kp]},Ji.invert=Ji,to.invert=$i(Pp),eo.invert=function(t,n){var e,r=n,i=25;do{var o=r*r,u=o*o;r-=e=(r*(1.007226+o*(.015085+u*(.028874*o-.044475-.005916*u)))-n)/(1.007226+o*(.045255+u*(.259866*o-.311325-.005916*11*u)))}while(zp(e)>Mp&&--i>0);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},ro.invert=$i(We),io.invert=$i(function(t){return 2*Pp(t)}),oo.invert=function(t,n){return[-n,2*Pp(Dp(t))-kp]},vo.prototype=fo.prototype={constructor:vo,count:function(){return this.eachAfter(so)},each:function(t){var n,e,r,i,o=this,u=[o];do{for(n=u.reverse(),u=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r=0;--e)i.push(n[e]);return this},sum:function(t){return this.eachAfter(function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e})},sort:function(t){return this.eachBefore(function(n){n.children&&n.children.sort(t)})},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;for(t=e.pop(),n=r.pop();t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){var t=[];return this.each(function(n){t.push(n)}),t},leaves:function(){var t=[];return this.eachBefore(function(n){n.children||t.push(n)}),t},links:function(){var t=this,n=[];return t.each(function(e){e!==t&&n.push({source:e.parent,target:e})}),n},copy:function(){return fo(this).eachBefore(ho)}};var Wd=Array.prototype.slice,Zd="$",Gd={depth:-1},Qd={};Ho.prototype=Object.create(vo.prototype);var Jd=(1+Math.sqrt(5))/2,Kd=function t(n){function e(t,e,r,i,o){Xo(n,t,e,r,i,o)}return e.ratio=function(n){return t((n=+n)>1?n:1)},e}(Jd),tv=function t(n){function e(t,e,r,i,o){if((u=t._squarify)&&u.ratio===n)for(var u,a,c,s,f,l=-1,h=u.length,p=t.value;++l1?n:1)},e}(Jd),nv=[].slice,ev={};Zo.prototype=Ko.prototype={constructor:Zo,defer:function(t){if("function"!=typeof t)throw new Error("invalid callback");if(this._call)throw new Error("defer after await");if(null!=this._error)return this;var n=nv.call(arguments,1);return n.push(t),++this._waiting,this._tasks.push(n),Go(this),this},abort:function(){return null==this._error&&Qo(this,new Error("abort")),this},await:function(t){if("function"!=typeof t)throw new Error("invalid callback");if(this._call)throw new Error("multiple await");return this._call=function(n,e){t.apply(null,[n].concat(e))},Jo(this),this},awaitAll:function(t){if("function"!=typeof t)throw new Error("invalid callback");if(this._call)throw new Error("multiple await");return this._call=t,Jo(this),this}};var rv=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.length?(e=t,t=0):e-=t,function(){return n()*e+t}}return e.source=t,e}(tu),iv=function t(n){function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){var o;if(null!=r)o=r,r=null;else do{r=2*n()-1,o=2*n()-1,i=r*r+o*o}while(!i||i>1);return t+e*o*Math.sqrt(-2*Math.log(i)/i)}}return e.source=t,e}(tu),ov=function t(n){function e(){var t=iv.source(n).apply(this,arguments);return function(){return Math.exp(t())}}return e.source=t,e}(tu),uv=function t(n){function e(t){return function(){for(var e=0,r=0;r0?t>1?Cu(function(n){n.setTime(Math.floor(n/t)*t)},function(n,e){n.setTime(+n+e*t)},function(n,e){return(e-n)/t}):wv:null};var Mv=wv.range,Tv=6e4,Nv=6048e5,kv=Cu(function(t){t.setTime(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(+t+1e3*n)},function(t,n){return(n-t)/1e3},function(t){return t.getUTCSeconds()}),Sv=kv.range,Ev=Cu(function(t){t.setTime(Math.floor(t/Tv)*Tv)},function(t,n){t.setTime(+t+n*Tv)},function(t,n){return(n-t)/Tv},function(t){return t.getMinutes()}),Av=Ev.range,Cv=Cu(function(t){var n=t.getTimezoneOffset()*Tv%36e5;n<0&&(n+=36e5),t.setTime(36e5*Math.floor((+t-n)/36e5)+n)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getHours()}),zv=Cv.range,Pv=Cu(function(t){t.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Tv)/864e5},function(t){return t.getDate()-1}),Rv=Pv.range,Lv=zu(0),qv=zu(1),Dv=zu(2),Uv=zu(3),Ov=zu(4),Fv=zu(5),Iv=zu(6),Yv=Lv.range,Bv=qv.range,Hv=Dv.range,jv=Uv.range,Xv=Ov.range,Vv=Fv.range,$v=Iv.range,Wv=Cu(function(t){t.setDate(1),t.setHours(0,0,0,0)},function(t,n){t.setMonth(t.getMonth()+n)},function(t,n){return n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())},function(t){return t.getMonth()}),Zv=Wv.range,Gv=Cu(function(t){t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t,n){return n.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});Gv.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Cu(function(n){n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)},function(n,e){n.setFullYear(n.getFullYear()+e*t)}):null};var Qv=Gv.range,Jv=Cu(function(t){t.setUTCSeconds(0,0)},function(t,n){t.setTime(+t+n*Tv)},function(t,n){return(n-t)/Tv},function(t){return t.getUTCMinutes()}),Kv=Jv.range,tg=Cu(function(t){t.setUTCMinutes(0,0,0)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getUTCHours()}),ng=tg.range,eg=Cu(function(t){t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+n)},function(t,n){return(n-t)/864e5},function(t){return t.getUTCDate()-1}),rg=eg.range,ig=Pu(0),og=Pu(1),ug=Pu(2),ag=Pu(3),cg=Pu(4),sg=Pu(5),fg=Pu(6),lg=ig.range,hg=og.range,pg=ug.range,dg=ag.range,vg=cg.range,gg=sg.range,_g=fg.range,yg=Cu(function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCMonth(t.getUTCMonth()+n)},function(t,n){return n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())},function(t){return t.getUTCMonth()}),mg=yg.range,xg=Cu(function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n)},function(t,n){return n.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});xg.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Cu(function(n){n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)},function(n,e){n.setUTCFullYear(n.getUTCFullYear()+e*t)}):null};var bg,wg=xg.range,Mg={"-":"",_:" ",0:"0"},Tg=/^\s*\d+/,Ng=/^%/,kg=/[\\^$*+?|[\]().{}]/g;Ha({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Sg="%Y-%m-%dT%H:%M:%S.%LZ",Eg=Date.prototype.toISOString?function(t){return t.toISOString()}:t.utcFormat(Sg),Ag=+new Date("2000-01-01T00:00:00.000Z")?function(t){var n=new Date(t);return isNaN(n)?null:n}:t.utcParse(Sg),Cg=1e3,zg=60*Cg,Pg=60*zg,Rg=24*Pg,Lg=7*Rg,qg=30*Rg,Dg=365*Rg,Ug=$a("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),Og=$a("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"),Fg=$a("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"),Ig=$a("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"),Yg=al($t(300,.5,0),$t(-240,.5,1)),Bg=al($t(-100,.75,.35),$t(80,1.5,.8)),Hg=al($t(260,.75,.35),$t(80,1.5,.8)),jg=$t(),Xg=Wa($a("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),Vg=Wa($a("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),$g=Wa($a("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),Wg=Wa($a("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")),Zg=Math.abs,Gg=Math.atan2,Qg=Math.cos,Jg=Math.max,Kg=Math.min,t_=Math.sin,n_=Math.sqrt,e_=1e-12,r_=Math.PI,i_=r_/2,o_=2*r_;ic.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._context.lineTo(t,n)}}};var u_=pc(oc);hc.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};var a_=Array.prototype.slice,c_={draw:function(t,n){var e=Math.sqrt(n/r_);t.moveTo(e,0),t.arc(0,0,e,0,o_)}},s_={draw:function(t,n){var e=Math.sqrt(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}},f_=Math.sqrt(1/3),l_=2*f_,h_={draw:function(t,n){var e=Math.sqrt(n/l_),r=e*f_;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},p_=Math.sin(r_/10)/Math.sin(7*r_/10),d_=Math.sin(o_/10)*p_,v_=-Math.cos(o_/10)*p_,g_={draw:function(t,n){var e=Math.sqrt(.8908130915292852*n),r=d_*e,i=v_*e;t.moveTo(0,-e),t.lineTo(r,i);for(var o=1;o<5;++o){var u=o_*o/5,a=Math.cos(u),c=Math.sin(u);t.lineTo(c*e,-a*e),t.lineTo(a*r-c*i,c*r+a*i)}t.closePath()}},__={draw:function(t,n){var e=Math.sqrt(n),r=-e/2;t.rect(r,r,e,e)}},y_=Math.sqrt(3),m_={draw:function(t,n){var e=-Math.sqrt(n/(3*y_));t.moveTo(0,2*e),t.lineTo(-y_*e,-e),t.lineTo(y_*e,-e),t.closePath()}},x_=Math.sqrt(3)/2,b_=1/Math.sqrt(12),w_=3*(b_/2+1),M_={draw:function(t,n){var e=Math.sqrt(n/w_),r=e/2,i=e*b_,o=r,u=e*b_+e,a=-o,c=u;t.moveTo(r,i),t.lineTo(o,u),t.lineTo(a,c),t.lineTo(-.5*r-x_*i,x_*r+-.5*i),t.lineTo(-.5*o-x_*u,x_*o+-.5*u),t.lineTo(-.5*a-x_*c,x_*a+-.5*c),t.lineTo(-.5*r+x_*i,-.5*i-x_*r),t.lineTo(-.5*o+x_*u,-.5*u-x_*o),t.lineTo(-.5*a+x_*c,-.5*c-x_*a),t.closePath()}},T_=[c_,s_,h_,__,g_,m_,M_];kc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Nc(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Nc(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},Sc.prototype={areaStart:Tc,areaEnd:Tc,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:Nc(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},Ec.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:Nc(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},Ac.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],u=t[e]-i,a=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*u),this._beta*n[c]+(1-this._beta)*(o+r*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var N_=function t(n){function e(t){return 1===n?new kc(t):new Ac(t,n)}return e.beta=function(n){return t(+n)},e}(.85);zc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Cc(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:Cc(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var k_=function t(n){function e(t){return new zc(t,n)}return e.tension=function(n){return t(+n)},e}(0);Pc.prototype={areaStart:Tc,areaEnd:Tc,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Cc(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var S_=function t(n){function e(t){return new Pc(t,n)}return e.tension=function(n){return t(+n)},e}(0);Rc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Cc(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var E_=function t(n){function e(t){return new Rc(t,n)}return e.tension=function(n){return t(+n)},e}(0);qc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:Lc(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var A_=function t(n){function e(t){return n?new qc(t,n):new zc(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);Dc.prototype={areaStart:Tc,areaEnd:Tc,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Lc(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var C_=function t(n){function e(t){return n?new Dc(t,n):new Pc(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);Uc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Lc(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var z_=function t(n){function e(t){return n?new Uc(t,n):new Rc(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);Oc.prototype={areaStart:Tc,areaEnd:Tc,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,n){t=+t,n=+n,this._point?this._context.lineTo(t,n):(this._point=1,this._context.moveTo(t,n))}},Hc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Bc(this,this._t0,Yc(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){var e=NaN;if(t=+t,n=+n,t!==this._x1||n!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,Bc(this,Yc(this,e=Ic(this,t,n)),e);break;default:Bc(this,this._t0,e=Ic(this,t,n))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n,this._t0=e}}},(jc.prototype=Object.create(Hc.prototype)).point=function(t,n){Hc.prototype.point.call(this,n,t)},Xc.prototype={moveTo:function(t,n){this._context.moveTo(n,t)},closePath:function(){this._context.closePath()},lineTo:function(t,n){this._context.lineTo(n,t)},bezierCurveTo:function(t,n,e,r,i,o){this._context.bezierCurveTo(n,t,r,e,o,i)}},Vc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,n=this._y,e=t.length;if(e)if(this._line?this._context.lineTo(t[0],n[0]):this._context.moveTo(t[0],n[0]),2===e)this._context.lineTo(t[1],n[1]);else for(var r=$c(t),i=$c(n),o=0,u=1;u=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}},rs.prototype={constructor:rs,insert:function(t,n){var e,r,i;if(t){if(n.P=t,n.N=t.N,t.N&&(t.N.P=n),t.N=n,t.R){for(t=t.R;t.L;)t=t.L;t.L=n}else t.R=n;e=t}else this._?(t=as(this._),n.P=null,n.N=t,t.P=t.L=n,e=t):(n.P=n.N=null,this._=n,e=null);for(n.L=n.R=null,n.U=e,n.C=!0,t=n;e&&e.C;)e===(r=e.U).L?(i=r.R)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.R&&(os(this,e),e=(t=e).U),e.C=!1,r.C=!0,us(this,r)):(i=r.L)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.L&&(us(this,e),e=(t=e).U),e.C=!1,r.C=!0,os(this,r)),e=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var n,e,r,i=t.U,o=t.L,u=t.R;if(e=o?u?as(u):o:u,i?i.L===t?i.L=e:i.R=e:this._=e,o&&u?(r=e.C,e.C=t.C,e.L=o,o.U=e,e!==u?(i=e.U,e.U=t.U,t=e.R,i.L=t,e.R=u,u.U=e):(e.U=i,i=e,t=e.R)):(r=t.C,t=e),t&&(t.U=i),!r)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((n=i.R).C&&(n.C=!1,i.C=!0,os(this,i),n=i.R),n.L&&n.L.C||n.R&&n.R.C){n.R&&n.R.C||(n.L.C=!1,n.C=!0,us(this,n),n=i.R),n.C=i.C,i.C=n.R.C=!1,os(this,i),t=this._;break}}else if((n=i.L).C&&(n.C=!1,i.C=!0,us(this,i),n=i.L),n.L&&n.L.C||n.R&&n.R.C){n.L&&n.L.C||(n.R.C=!1,n.C=!0,os(this,n),n=i.L),n.C=i.C,i.C=n.L.C=!1,us(this,i),t=this._;break}n.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}};var P_,R_,L_,q_,D_,U_=[],O_=[],F_=1e-6,I_=1e-12;Ns.prototype={constructor:Ns,polygons:function(){var t=this.edges;return this.cells.map(function(n){var e=n.halfedges.map(function(e){return ds(n,t[e])});return e.data=n.site.data,e})},triangles:function(){var t=[],n=this.edges;return this.cells.forEach(function(e,r){if(o=(i=e.halfedges).length)for(var i,o,u,a=e.site,c=-1,s=n[i[o-1]],f=s.left===a?s.right:s.left;++c=a)return null;var c=t-i.site[0],s=n-i.site[1],f=c*c+s*s;do{i=o.cells[r=u],u=null,i.halfedges.forEach(function(e){var r=o.edges[e],a=r.left;if(a!==i.site&&a||(a=r.right)){var c=t-a[0],s=n-a[1],l=c*c+s*s;lt?1:n>=t?0:NaN},t.deviation=u,t.extent=a,t.histogram=function(){function t(t){var i,o,u=t.length,a=new Array(u);for(i=0;il;)h.pop(),--d;var v,g=new Array(d+1);for(i=0;i<=d;++i)(v=g[i]=[]).x0=i>0?h[i-1]:s,v.x1=i=e)for(r=e;++or&&(r=e)}else for(;++o=e)for(r=e;++or&&(r=e);return r},t.mean=function(t,n){var e,r=t.length,o=r,u=-1,a=0;if(null==n)for(;++u=o.length)return null!=e&&n.sort(e),null!=r?r(n):n;for(var c,s,f,l=-1,h=n.length,p=o[i++],d=se(),v=u();++lo.length)return t;var i,a=u[e-1];return null!=r&&e>=o.length?i=t.entries():(i=[],t.each(function(t,r){i.push({key:r,values:n(t,e)})})),null!=a?i.sort(function(t,n){return a(t.key,n.key)}):i}var e,r,i,o=[],u=[];return i={object:function(n){return t(n,0,fe,le)},map:function(n){return t(n,0,he,pe)},entries:function(e){return n(t(e,0,he,pe),0)},key:function(t){return o.push(t),i},sortKeys:function(t){return u[o.length-1]=t,i},sortValues:function(t){return e=t,i},rollup:function(t){return r=t,i}}},t.set=ve,t.map=se,t.keys=function(t){var n=[];for(var e in t)n.push(e);return n},t.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},t.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},t.color=Et,t.rgb=Pt,t.hsl=qt,t.lab=Ft,t.hcl=Xt,t.cubehelix=$t,t.dispatch=N,t.drag=function(){function n(t){t.on("mousedown.drag",e).filter(g).on("touchstart.drag",o).on("touchmove.drag",u).on("touchend.drag touchcancel.drag",a).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function e(){if(!h&&p.apply(this,arguments)){var n=c("mouse",d.apply(this,arguments),pt,this,arguments);n&&(ct(t.event.view).on("mousemove.drag",r,!0).on("mouseup.drag",i,!0),_t(t.event.view),vt(),l=!1,s=t.event.clientX,f=t.event.clientY,n("start"))}}function r(){if(gt(),!l){var n=t.event.clientX-s,e=t.event.clientY-f;l=n*n+e*e>x}_.mouse("drag")}function i(){ct(t.event.view).on("mousemove.drag mouseup.drag",null),yt(t.event.view,l),gt(),_.mouse("end")}function o(){if(p.apply(this,arguments)){var n,e,r=t.event.changedTouches,i=d.apply(this,arguments),o=r.length;for(n=0;nc+p||is+p||or.index){var d=c-a.x-a.vx,v=s-a.y-a.vy,g=d*d+v*v;gt.r&&(t.r=t[n].r)}function r(){if(i){var n,e,r=i.length;for(o=new Array(r),n=0;n=f)){(t.data!==o||t.next)&&(0===i&&(i=me(),p+=i*i),0===c&&(c=me(),p+=c*c),p1?(null==n?l.remove(t):l.set(t,i(n)),o):l.get(t)},find:function(n,e,r){var i,o,u,a,c,s=0,f=t.length;for(null==r?r=1/0:r*=r,s=0;s1?(p.on(t,n),o):p.on(t)}}},t.forceX=function(t){function n(t){for(var n,e=0,u=r.length;emr(r[0],r[1])&&(r[1]=i[1]),mr(i[0],r[1])>mr(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(u=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(a=mr(r[1],i[0]))>u&&(u=a,Gh=i[0],Jh=r[1])}return ip=op=null,Gh===1/0||Qh===1/0?[[NaN,NaN],[NaN,NaN]]:[[Gh,Qh],[Jh,Kh]]},t.geoCentroid=function(t){up=ap=cp=sp=fp=lp=hp=pp=dp=vp=gp=0,tr(t,Gp);var n=dp,e=vp,r=gp,i=n*n+e*e+r*r;return i=.12&&i<.234&&r>=-.425&&r<-.214?s:i>=.166&&i<.234&&r>=-.214&&r<-.115?f:c).invert(t)},t.stream=function(t){return e&&r===t?e:e=function(t){var n=t.length;return{point:function(e,r){for(var i=-1;++i2?t[2]+90:90]):(t=e(),[t[0],t[1],t[2]-90])},e([0,0,90]).scale(159.155)},t.geoTransverseMercatorRaw=oo,t.geoRotation=Fr,t.geoStream=tr,t.geoTransform=function(t){return{stream:Pi(t)}},t.cluster=function(){function t(t){var o,u=0;t.eachAfter(function(t){var e=t.children;e?(t.x=function(t){return t.reduce(ao,0)/t.length}(e),t.y=function(t){return 1+t.reduce(co,0)}(e)):(t.x=o?u+=n(t,o):0,t.y=0,o=t)});var a=function(t){for(var n;n=t.children;)t=n[0];return t}(t),c=function(t){for(var n;n=t.children;)t=n[n.length-1];return t}(t),s=a.x-n(a,c)/2,f=c.x+n(c,a)/2;return t.eachAfter(i?function(n){n.x=(n.x-t.x)*e,n.y=(t.y-n.y)*r}:function(n){n.x=(n.x-s)/(f-s)*e,n.y=(1-(t.y?n.y/t.y:1))*r})}var n=uo,e=1,r=1,i=!1;return t.separation=function(e){return arguments.length?(n=e,t):n},t.size=function(n){return arguments.length?(i=!1,e=+n[0],r=+n[1],t):i?null:[e,r]},t.nodeSize=function(n){return arguments.length?(i=!0,e=+n[0],r=+n[1],t):i?[e,r]:null},t},t.hierarchy=fo,t.pack=function(){function t(t){return t.x=e/2,t.y=r/2,n?t.eachBefore(zo(n)).eachAfter(Po(i,.5)).eachBefore(Ro(1)):t.eachBefore(zo(Co)).eachAfter(Po(Eo,1)).eachAfter(Po(i,t.r/Math.min(e,r))).eachBefore(Ro(Math.min(e,r)/(2*t.r))),t}var n=null,e=1,r=1,i=Eo;return t.radius=function(e){return arguments.length?(n=function(t){return null==t?null:So(t)}(e),t):n},t.size=function(n){return arguments.length?(e=+n[0],r=+n[1],t):[e,r]},t.padding=function(n){return arguments.length?(i="function"==typeof n?n:Ao(+n),t):i},t},t.packSiblings=function(t){return ko(t),t},t.packEnclose=go,t.partition=function(){function t(t){var o=t.height+1;return t.x0=t.y0=r,t.x1=n,t.y1=e/o,t.eachBefore(function(t,n){return function(e){e.children&&qo(e,e.x0,t*(e.depth+1)/n,e.x1,t*(e.depth+2)/n);var i=e.x0,o=e.y0,u=e.x1-r,a=e.y1-r;u0)throw new Error("cycle");return o}var n=Do,e=Uo;return t.id=function(e){return arguments.length?(n=So(e),t):n},t.parentId=function(n){return arguments.length?(e=So(n),t):e},t},t.tree=function(){function t(t){var c=function(t){for(var n,e,r,i,o,u=new Ho(t,0),a=[u];n=a.pop();)if(r=n._.children)for(n.children=new Array(o=r.length),i=o-1;i>=0;--i)a.push(e=n.children[i]=new Ho(r[i],i)),e.parent=n;return(u.parent=new Ho(null,0)).children=[u],u}(t);if(c.eachAfter(n),c.parent.m=-c.z,c.eachBefore(e),a)t.eachBefore(r);else{var s=t,f=t,l=t;t.eachBefore(function(t){t.xf.x&&(f=t),t.depth>l.depth&&(l=t)});var h=s===f?1:i(s,f)/2,p=h-s.x,d=o/(f.x+h+p),v=u/(l.depth||1);t.eachBefore(function(t){t.x=(t.x+p)*d,t.y=t.depth*v})}return t}function n(t){var n=t.children,e=t.parent.children,r=t.i?e[t.i-1]:null;if(n){(function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)})(t);var o=(n[0].z+n[n.length-1].z)/2;r?(t.z=r.z+i(t._,r._),t.m=t.z-o):t.z=o}else r&&(t.z=r.z+i(t._,r._));t.parent.A=function(t,n,e){if(n){for(var r,o=t,u=t,a=n,c=o.parent.children[0],s=o.m,f=u.m,l=a.m,h=c.m;a=Io(a),o=Fo(o),a&&o;)c=Fo(c),(u=Io(u)).a=t,(r=a.z+l-o.z-s+i(a._,o._))>0&&(Yo(Bo(a,t,e),t,r),s+=r,f+=r),l+=a.m,s+=o.m,h+=c.m,f+=u.m;a&&!Io(u)&&(u.t=a,u.m+=l-f),o&&!Fo(c)&&(c.t=o,c.m+=s-h,e=t)}return e}(t,r,t.parent.A||e[0])}function e(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function r(t){t.x*=o,t.y=t.depth*u}var i=Oo,o=1,u=1,a=null;return t.separation=function(n){return arguments.length?(i=n,t):i},t.size=function(n){return arguments.length?(a=!1,o=+n[0],u=+n[1],t):a?null:[o,u]},t.nodeSize=function(n){return arguments.length?(a=!0,o=+n[0],u=+n[1],t):a?[o,u]:null},t},t.treemap=function(){function t(t){return t.x0=t.y0=0,t.x1=i,t.y1=o,t.eachBefore(n),u=[0],r&&t.eachBefore(Lo),t}function n(t){var n=u[t.depth],r=t.x0+n,i=t.y0+n,o=t.x1-n,h=t.y1-n;o=n-1){var s=c[t];return s.x0=r,s.y0=i,s.x1=u,void(s.y1=a)}for(var l=f[t],h=e/2+l,p=t+1,d=n-1;p>>1;f[v]a-i){var y=(r*_+u*g)/e;o(t,p,g,r,i,y,a),o(p,n,_,y,i,u,a)}else{var m=(i*_+a*g)/e;o(t,p,g,r,i,u,m),o(p,n,_,r,m,u,a)}}var u,a,c=t.children,s=c.length,f=new Array(s+1);for(f[0]=a=u=0;u=0;--n)s.push(t[r[o[n]][2]]);for(n=+a;na!=s>a&&u<(c-e)*(a-r)/(s-r)+e&&(f=!f),c=e,s=r;return f},t.polygonLength=function(t){for(var n,e,r=-1,i=t.length,o=t[i-1],u=o[0],a=o[1],c=0;++r1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return jg.h=360*t-100,jg.s=1.5-1.5*n,jg.l=.8-.9*n,jg+""},t.interpolateWarm=Bg,t.interpolateCool=Hg,t.interpolateViridis=Xg,t.interpolateMagma=Vg,t.interpolateInferno=$g,t.interpolatePlasma=Wg,t.scaleSequential=Za,t.create=function(t){return ct(A(t).call(document.documentElement))},t.creator=A,t.local=st,t.matcher=of,t.mouse=pt,t.namespace=E,t.namespaces=tf,t.clientPoint=ht,t.select=ct,t.selectAll=function(t){return"string"==typeof t?new ut([document.querySelectorAll(t)],[document.documentElement]):new ut([null==t?[]:t],cf)},t.selection=at,t.selector=z,t.selectorAll=R,t.style=I,t.touch=dt,t.touches=function(t,n){null==n&&(n=lt().touches);for(var e=0,r=n?n.length:0,i=new Array(r);eh;if(c||(c=t=ee()),le_)if(d>o_-e_)c.moveTo(l*Qg(h),l*t_(h)),c.arc(0,0,l,h,p,!v),f>e_&&(c.moveTo(f*Qg(p),f*t_(p)),c.arc(0,0,f,p,h,v));else{var g,_,y=h,m=p,x=h,b=p,w=d,M=d,T=a.apply(this,arguments)/2,N=T>e_&&(i?+i.apply(this,arguments):n_(f*f+l*l)),k=Kg(Zg(l-f)/2,+r.apply(this,arguments)),S=k,E=k;if(N>e_){var A=Qa(N/f*t_(T)),C=Qa(N/l*t_(T));(w-=2*A)>e_?(A*=v?1:-1,x+=A,b-=A):(w=0,x=b=(h+p)/2),(M-=2*C)>e_?(C*=v?1:-1,y+=C,m-=C):(M=0,y=m=(h+p)/2)}var z=l*Qg(y),P=l*t_(y),R=f*Qg(b),L=f*t_(b);if(k>e_){var q=l*Qg(m),D=l*t_(m),U=f*Qg(x),O=f*t_(x);if(de_?function(t,n,e,r,i,o,u,a){var c=e-t,s=r-n,f=u-i,l=a-o,h=(f*(n-o)-l*(t-i))/(l*c-f*s);return[t+h*c,n+h*s]}(z,P,U,O,q,D,R,L):[R,L],I=z-F[0],Y=P-F[1],B=q-F[0],H=D-F[1],j=1/t_(function(t){return t>1?0:t<-1?r_:Math.acos(t)}((I*B+Y*H)/(n_(I*I+Y*Y)*n_(B*B+H*H)))/2),X=n_(F[0]*F[0]+F[1]*F[1]);S=Kg(k,(f-X)/(j-1)),E=Kg(k,(l-X)/(j+1))}}M>e_?E>e_?(g=rc(U,O,z,P,l,E,v),_=rc(q,D,R,L,l,E,v),c.moveTo(g.cx+g.x01,g.cy+g.y01),Ee_&&w>e_?S>e_?(g=rc(R,L,q,D,f,-S,v),_=rc(z,P,U,O,f,-S,v),c.lineTo(g.cx+g.x01,g.cy+g.y01),S0&&(p+=l);for(null!=e?d.sort(function(t,n){return e(v[t],v[n])}):null!=r&&d.sort(function(n,e){return r(t[n],t[e])}),a=0,s=p?(_-h*m)/p:0;a0?l*s:0)+m,v[c]={data:t[c],index:a,value:l,startAngle:g,endAngle:f,padAngle:y};return v}var n=lc,e=fc,r=null,i=Ga(0),o=Ga(o_),u=Ga(0);return t.value=function(e){return arguments.length?(n="function"==typeof e?e:Ga(+e),t):n},t.sortValues=function(n){return arguments.length?(e=n,r=null,t):e},t.sort=function(n){return arguments.length?(r=n,e=null,t):r},t.startAngle=function(n){return arguments.length?(i="function"==typeof n?n:Ga(+n),t):i},t.endAngle=function(n){return arguments.length?(o="function"==typeof n?n:Ga(+n),t):o},t.padAngle=function(n){return arguments.length?(u="function"==typeof n?n:Ga(+n),t):u},t},t.areaRadial=gc,t.radialArea=gc,t.lineRadial=vc,t.radialLine=vc,t.pointRadial=_c,t.linkHorizontal=function(){return xc(bc)},t.linkVertical=function(){return xc(wc)},t.linkRadial=function(){var t=xc(Mc);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t},t.symbol=function(){function t(){var t;if(r||(r=t=ee()),n.apply(this,arguments).draw(r,+e.apply(this,arguments)),t)return r=null,t+""||null}var n=Ga(c_),e=Ga(64),r=null;return t.type=function(e){return arguments.length?(n="function"==typeof e?e:Ga(e),t):n},t.size=function(n){return arguments.length?(e="function"==typeof n?n:Ga(+n),t):e},t.context=function(n){return arguments.length?(r=null==n?null:n,t):r},t},t.symbols=T_,t.symbolCircle=c_,t.symbolCross=s_,t.symbolDiamond=h_,t.symbolSquare=__,t.symbolStar=g_,t.symbolTriangle=m_,t.symbolWye=M_,t.curveBasisClosed=function(t){return new Sc(t)},t.curveBasisOpen=function(t){return new Ec(t)},t.curveBasis=function(t){return new kc(t)},t.curveBundle=N_,t.curveCardinalClosed=S_,t.curveCardinalOpen=E_,t.curveCardinal=k_,t.curveCatmullRomClosed=C_,t.curveCatmullRomOpen=z_,t.curveCatmullRom=A_,t.curveLinearClosed=function(t){return new Oc(t)},t.curveLinear=oc,t.curveMonotoneX=function(t){return new Hc(t)},t.curveMonotoneY=function(t){return new jc(t)},t.curveNatural=function(t){return new Vc(t)},t.curveStep=function(t){return new Wc(t,.5)},t.curveStepAfter=function(t){return new Wc(t,1)},t.curveStepBefore=function(t){return new Wc(t,0)},t.stack=function(){function t(t){var o,u,a=n.apply(this,arguments),c=t.length,s=a.length,f=new Array(s);for(o=0;o0){for(var e,r,i,o=0,u=t[0].length;o1)for(var e,r,i,o,u,a,c=0,s=t[n[0]].length;c=0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=u,r[0]=u+=i):r[0]=o},t.stackOffsetNone=Zc,t.stackOffsetSilhouette=function(t,n){if((e=t.length)>0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,u=1;uxl&&e.name===n)return new qn([[t]],Jl,n,+r)}return null},t.interrupt=Pn,t.voronoi=function(){function t(t){return new Ns(t.map(function(r,i){var o=[Math.round(n(r,i,t)/F_)*F_,Math.round(e(r,i,t)/F_)*F_];return o.index=i,o.data=r,o}),r)}var n=ns,e=es,r=null;return t.polygons=function(n){return t(n).polygons()},t.links=function(n){return t(n).links()},t.triangles=function(n){return t(n).triangles()},t.x=function(e){return arguments.length?(n="function"==typeof e?e:ts(+e),t):n},t.y=function(n){return arguments.length?(e="function"==typeof n?n:ts(+n),t):e},t.extent=function(n){return arguments.length?(r=null==n?null:[[+n[0][0],+n[0][1]],[+n[1][0],+n[1][1]]],t):r&&[[r[0][0],r[0][1]],[r[1][0],r[1][1]]]},t.size=function(n){return arguments.length?(r=null==n?null:[[0,0],[+n[0],+n[1]]],t):r&&[r[1][0]-r[0][0],r[1][1]-r[0][1]]},t},t.zoom=function(){function n(t){t.property("__zoom",Rs).on("wheel.zoom",c).on("mousedown.zoom",s).on("dblclick.zoom",f).filter(x).on("touchstart.zoom",l).on("touchmove.zoom",h).on("touchend.zoom touchcancel.zoom",p).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function e(t,n){return(n=Math.max(b[0],Math.min(b[1],n)))===t.k?t:new Ss(n,t.x,t.y)}function r(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new Ss(t.k,r,i)}function i(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function o(t,n,e){t.on("start.zoom",function(){u(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){u(this,arguments).end()}).tween("zoom",function(){var t=arguments,r=u(this,t),o=_.apply(this,t),a=e||i(o),c=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),s=this.__zoom,f="function"==typeof n?n.apply(this,t):n,l=T(s.invert(a).concat(c/s.k),f.invert(a).concat(c/f.k));return function(t){if(1===t)t=f;else{var n=l(t),e=c/n[2];t=new Ss(e,a[0]-n[0]*e,a[1]-n[1]*e)}r.zoom(null,t)}})}function u(t,n){for(var e,r=0,i=k.length;rC}n.zoom("mouse",y(r(n.that.__zoom,n.mouse[0]=pt(n.that),n.mouse[1]),n.extent,w))},!0).on("mouseup.zoom",function(){e.on("mousemove.zoom mouseup.zoom",null),yt(t.event.view,n.moved),Cs(),n.end()},!0),i=pt(this),o=t.event.clientX,a=t.event.clientY;_t(t.event.view),As(),n.mouse=[i,this.__zoom.invert(i)],Pn(this),n.start()}}function f(){if(g.apply(this,arguments)){var i=this.__zoom,u=pt(this),a=i.invert(u),c=i.k*(t.event.shiftKey?.5:2),s=y(r(e(i,c),u,a),_.apply(this,arguments),w);Cs(),M>0?ct(this).transition().duration(M).call(o,s,u):ct(this).call(n.transform,s)}}function l(){if(g.apply(this,arguments)){var n,e,r,i,o=u(this,arguments),a=t.event.changedTouches,c=a.length;for(As(),e=0;e=0}function B(t,i,e,n){return"touchstart"===i?O(t,e,n):"touchmove"===i?W(t,e,n):"touchend"===i&&H(t,e,n),this}function I(t,i,e){var n=t["_leaflet_"+i+e];return"touchstart"===i?t.removeEventListener(te,n,!1):"touchmove"===i?t.removeEventListener(ie,n,!1):"touchend"===i&&(t.removeEventListener(ee,n,!1),t.removeEventListener(ne,n,!1)),this}function O(t,i,n){var o=e(function(t){if("mouse"!==t.pointerType&&t.MSPOINTER_TYPE_MOUSE&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE){if(!(oe.indexOf(t.target.tagName)<0))return;Pt(t)}j(t,i)});t["_leaflet_touchstart"+n]=o,t.addEventListener(te,o,!1),re||(document.documentElement.addEventListener(te,R,!0),document.documentElement.addEventListener(ie,N,!0),document.documentElement.addEventListener(ee,D,!0),document.documentElement.addEventListener(ne,D,!0),re=!0)}function R(t){se[t.pointerId]=t,ae++}function N(t){se[t.pointerId]&&(se[t.pointerId]=t)}function D(t){delete se[t.pointerId],ae--}function j(t,i){t.touches=[];for(var e in se)t.touches.push(se[e]);t.changedTouches=[t],i(t)}function W(t,i,e){var n=function(t){(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons)&&j(t,i)};t["_leaflet_touchmove"+e]=n,t.addEventListener(ie,n,!1)}function H(t,i,e){var n=function(t){j(t,i)};t["_leaflet_touchend"+e]=n,t.addEventListener(ee,n,!1),t.addEventListener(ne,n,!1)}function F(t,i,e){function n(t){var i;if(Vi){if(!bi||"mouse"===t.pointerType)return;i=ae}else i=t.touches.length;if(!(i>1)){var e=Date.now(),n=e-(s||e);r=t.touches?t.touches[0]:t,a=n>0&&n<=h,s=e}}function o(t){if(a&&!r.cancelBubble){if(Vi){if(!bi||"mouse"===t.pointerType)return;var e,n,o={};for(n in r)e=r[n],o[n]=e&&e.bind?e.bind(r):e;r=o}r.type="dblclick",i(r),s=null}}var s,r,a=!1,h=250;return t[le+he+e]=n,t[le+ue+e]=o,t[le+"dblclick"+e]=i,t.addEventListener(he,n,!1),t.addEventListener(ue,o,!1),t.addEventListener("dblclick",i,!1),this}function U(t,i){var e=t[le+he+i],n=t[le+ue+i],o=t[le+"dblclick"+i];return t.removeEventListener(he,e,!1),t.removeEventListener(ue,n,!1),bi||t.removeEventListener("dblclick",o,!1),this}function V(t){return"string"==typeof t?document.getElementById(t):t}function q(t,i){var e=t.style[i]||t.currentStyle&&t.currentStyle[i];if((!e||"auto"===e)&&document.defaultView){var n=document.defaultView.getComputedStyle(t,null);e=n?n[i]:null}return"auto"===e?null:e}function G(t,i,e){var n=document.createElement(t);return n.className=i||"",e&&e.appendChild(n),n}function K(t){var i=t.parentNode;i&&i.removeChild(t)}function Y(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function X(t){var i=t.parentNode;i.lastChild!==t&&i.appendChild(t)}function J(t){var i=t.parentNode;i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function $(t,i){if(void 0!==t.classList)return t.classList.contains(i);var e=et(t);return e.length>0&&new RegExp("(^|\\s)"+i+"(\\s|$)").test(e)}function Q(t,i){if(void 0!==t.classList)for(var e=u(i),n=0,o=e.length;n100&&n<500||t.target._simulatedClick&&!t._simulated?Lt(t):(ge=e,i(t))}function Zt(t,i){if(!i||!t.length)return t.slice();var e=i*i;return t=Bt(t,e),t=kt(t,e)}function Et(t,i,e){return Math.sqrt(Dt(t,i,e,!0))}function kt(t,i){var e=t.length,n=new(typeof Uint8Array!=void 0+""?Uint8Array:Array)(e);n[0]=n[e-1]=1,At(t,n,i,0,e-1);var o,s=[];for(o=0;oh&&(s=r,h=a);h>e&&(i[s]=1,At(t,i,e,n,s),At(t,i,e,s,o))}function Bt(t,i){for(var e=[t[0]],n=1,o=0,s=t.length;ni&&(e.push(t[n]),o=n);return oi.max.x&&(e|=2),t.yi.max.y&&(e|=8),e}function Nt(t,i){var e=i.x-t.x,n=i.y-t.y;return e*e+n*n}function Dt(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return u>0&&((o=((t.x-s)*a+(t.y-r)*h)/u)>1?(s=e.x,r=e.y):o>0&&(s+=a*o,r+=h*o)),a=t.x-s,h=t.y-r,n?a*a+h*h:new x(s,r)}function jt(t){return!oi(t[0])||"object"!=typeof t[0][0]&&void 0!==t[0][0]}function Wt(t){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),jt(t)}function Ht(t,i,e){var n,o,s,r,a,h,u,l,c,_=[1,4,2,8];for(o=0,u=t.length;o0?Math.floor(t):Math.ceil(t)};x.prototype={clone:function(){return new x(this.x,this.y)},add:function(t){return this.clone()._add(w(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(w(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new x(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new x(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=_i(this.x),this.y=_i(this.y),this},distanceTo:function(t){var i=(t=w(t)).x-this.x,e=t.y-this.y;return Math.sqrt(i*i+e*e)},equals:function(t){return(t=w(t)).x===this.x&&t.y===this.y},contains:function(t){return t=w(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+a(this.x)+", "+a(this.y)+")"}},P.prototype={extend:function(t){return t=w(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new x((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new x(this.min.x,this.max.y)},getTopRight:function(){return new x(this.max.x,this.min.y)},getTopLeft:function(){return this.min},getBottomRight:function(){return this.max},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var i,e;return(t="number"==typeof t[0]||t instanceof x?w(t):b(t))instanceof P?(i=t.min,e=t.max):i=e=t,i.x>=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=b(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=b(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.xi.y&&n.y=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=z(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=z(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lati.lng&&n.lng1,Xi=!!document.createElement("canvas").getContext,Ji=!(!document.createElementNS||!E("svg").createSVGRect),$i=!Ji&&function(){try{var t=document.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}(),Qi=(Object.freeze||Object)({ie:Pi,ielt9:Li,edge:bi,webkit:Ti,android:zi,android23:Mi,androidStock:Si,opera:Zi,chrome:Ei,gecko:ki,safari:Ai,phantom:Bi,opera12:Ii,win:Oi,ie3d:Ri,webkit3d:Ni,gecko3d:Di,any3d:ji,mobile:Wi,mobileWebkit:Hi,mobileWebkit3d:Fi,msPointer:Ui,pointer:Vi,touch:qi,mobileOpera:Gi,mobileGecko:Ki,retina:Yi,canvas:Xi,svg:Ji,vml:$i}),te=Ui?"MSPointerDown":"pointerdown",ie=Ui?"MSPointerMove":"pointermove",ee=Ui?"MSPointerUp":"pointerup",ne=Ui?"MSPointerCancel":"pointercancel",oe=["INPUT","SELECT","OPTION"],se={},re=!1,ae=0,he=Ui?"MSPointerDown":Vi?"pointerdown":"touchstart",ue=Ui?"MSPointerUp":Vi?"pointerup":"touchend",le="_leaflet_",ce=st(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),_e=st(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===_e||"OTransition"===_e?_e+"End":"transitionend";if("onselectstart"in document)fi=function(){mt(window,"selectstart",Pt)},gi=function(){ft(window,"selectstart",Pt)};else{var pe=st(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);fi=function(){if(pe){var t=document.documentElement.style;vi=t[pe],t[pe]="none"}},gi=function(){pe&&(document.documentElement.style[pe]=vi,vi=void 0)}}var me,fe,ge,ve=(Object.freeze||Object)({TRANSFORM:ce,TRANSITION:_e,TRANSITION_END:de,get:V,getStyle:q,create:G,remove:K,empty:Y,toFront:X,toBack:J,hasClass:$,addClass:Q,removeClass:tt,setClass:it,getClass:et,setOpacity:nt,testProp:st,setTransform:rt,setPosition:at,getPosition:ht,disableTextSelection:fi,enableTextSelection:gi,disableImageDrag:ut,enableImageDrag:lt,preventOutline:ct,restoreOutline:_t,getSizedParentNode:dt,getScale:pt}),ye="_leaflet_events",xe=Oi&&Ei?2*window.devicePixelRatio:ki?window.devicePixelRatio:1,we={},Pe=(Object.freeze||Object)({on:mt,off:ft,stopPropagation:yt,disableScrollPropagation:xt,disableClickPropagation:wt,preventDefault:Pt,stop:Lt,getMousePosition:bt,getWheelDelta:Tt,fakeStop:zt,skipped:Mt,isExternalTarget:Ct,addListener:mt,removeListener:ft}),Le=ci.extend({run:function(t,i,e,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=e||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=ht(t),this._offset=i.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=f(this._animate,this),this._step()},_step:function(t){var i=+new Date-this._startTime,e=1e3*this._duration;ithis.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,z(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},invalidateSize:function(t){if(!this._loaded)return this;t=i({animate:!1,pan:!0},!0===t?{animate:!0}:t);var n=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var o=this.getSize(),s=n.divideBy(2).round(),r=o.divideBy(2).round(),a=s.subtract(r);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(e(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:n,newSize:o})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){if(t=this._locateOptions=i({timeout:1e4,watch:!1},t),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var n=e(this._handleGeolocationResponse,this),o=e(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(n,o,t):navigator.geolocation.getCurrentPosition(n,o,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var i=t.code,e=t.message||(1===i?"permission denied":2===i?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:i,message:"Geolocation error: "+e+"."})},_handleGeolocationResponse:function(t){var i=new M(t.coords.latitude,t.coords.longitude),e=i.toBounds(2*t.coords.accuracy),n=this._locateOptions;if(n.setView){var o=this.getBoundsZoom(e);this.setView(i,n.maxZoom?Math.min(o,n.maxZoom):o)}var s={latlng:i,bounds:e,timestamp:t.timestamp};for(var r in t.coords)"number"==typeof t.coords[r]&&(s[r]=t.coords[r]);this.fire("locationfound",s)},addHandler:function(t,i){if(!i)return this;var e=this[t]=new i(this);return this._handlers.push(e),this.options[t]&&e.enable(),this},remove:function(){if(this._initEvents(!0),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),K(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(g(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload");var t;for(t in this._layers)this._layers[t].remove();for(t in this._panes)K(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,i){var e=G("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),i||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new T(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,i,e){t=z(t),e=w(e||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),a=t.getSouthEast(),h=this.getSize().subtract(e),u=b(this.project(a,n),this.project(r,n)).getSize(),l=ji?this.options.zoomSnap:1,c=h.x/u.x,_=h.y/u.y,d=i?Math.max(c,_):Math.min(c,_);return n=this.getScaleZoom(d,n),l&&(n=Math.round(n/(l/100))*(l/100),n=i?Math.ceil(n/l)*l:Math.floor(n/l)*l),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new x(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,i){var e=this._getTopLeftPoint(t,i);return new P(e,e.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,i){var e=this.options.crs;return i=void 0===i?this._zoom:i,e.scale(t)/e.scale(i)},getScaleZoom:function(t,i){var e=this.options.crs;i=void 0===i?this._zoom:i;var n=e.zoom(t*e.scale(i));return isNaN(n)?1/0:n},project:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.latLngToPoint(C(t),i)},unproject:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.pointToLatLng(w(t),i)},layerPointToLatLng:function(t){var i=w(t).add(this.getPixelOrigin());return this.unproject(i)},latLngToLayerPoint:function(t){return this.project(C(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(C(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(z(t))},distance:function(t,i){return this.options.crs.distance(C(t),C(i))},containerPointToLayerPoint:function(t){return w(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return w(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var i=this.containerPointToLayerPoint(w(t));return this.layerPointToLatLng(i)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(C(t)))},mouseEventToContainerPoint:function(t){return bt(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var i=this._container=V(t);if(!i)throw new Error("Map container not found.");if(i._leaflet_id)throw new Error("Map container is already initialized.");mt(i,"scroll",this._onScroll,this),this._containerId=n(i)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&ji,Q(t,"leaflet-container"+(qi?" leaflet-touch":"")+(Yi?" leaflet-retina":"")+(Li?" leaflet-oldie":"")+(Ai?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=q(t,"position");"absolute"!==i&&"relative"!==i&&"fixed"!==i&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),at(this._mapPane,new x(0,0)),this.createPane("tilePane"),this.createPane("shadowPane"),this.createPane("overlayPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(Q(t.markerPane,"leaflet-zoom-hide"),Q(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,i){at(this._mapPane,new x(0,0));var e=!this._loaded;this._loaded=!0,i=this._limitZoom(i),this.fire("viewprereset");var n=this._zoom!==i;this._moveStart(n,!1)._move(t,i)._moveEnd(n),this.fire("viewreset"),e&&this.fire("load")},_moveStart:function(t,i){return t&&this.fire("zoomstart"),i||this.fire("movestart"),this},_move:function(t,i,e){void 0===i&&(i=this._zoom);var n=this._zoom!==i;return this._zoom=i,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(n||e&&e.pinch)&&this.fire("zoom",e),this.fire("move",e)},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return g(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){at(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={},this._targets[n(this._container)]=this;var i=t?ft:mt;i(this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress",this._handleDOMEvent,this),this.options.trackResize&&i(window,"resize",this._onResize,this),ji&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){g(this._resizeRequest),this._resizeRequest=f(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,o=[],s="mouseout"===i||"mouseover"===i,r=t.target||t.srcElement,a=!1;r;){if((e=this._targets[n(r)])&&("click"===i||"preclick"===i)&&!t._simulated&&this._draggableMoved(e)){a=!0;break}if(e&&e.listens(i,!0)){if(s&&!Ct(r,t))break;if(o.push(e),s)break}if(r===this._container)break;r=r.parentNode}return o.length||a||s||!Ct(r,t)||(o=[this]),o},_handleDOMEvent:function(t){if(this._loaded&&!Mt(t)){var i=t.type;"mousedown"!==i&&"keypress"!==i||ct(t.target||t.srcElement),this._fireDOMEvent(t,i)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,n){if("click"===t.type){var o=i({},t);o.type="preclick",this._fireDOMEvent(o,o.type,n)}if(!t._stopped&&(n=(n||[]).concat(this._findEventTargets(t,e))).length){var s=n[0];"contextmenu"===e&&s.listens(e,!0)&&Pt(t);var r={originalEvent:t};if("keypress"!==t.type){var a=s.getLatLng&&(!s._radius||s._radius<=10);r.containerPoint=a?this.latLngToContainerPoint(s.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=a?s.getLatLng():this.layerPointToLatLng(r.layerPoint)}for(var h=0;h0?Math.round(t-i)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(i))},_limitZoom:function(t){var i=this.getMinZoom(),e=this.getMaxZoom(),n=ji?this.options.zoomSnap:1;return n&&(t=Math.round(t/n)*n),Math.max(i,Math.min(e,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){tt(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,i){var e=this._getCenterOffset(t)._trunc();return!(!0!==(i&&i.animate)&&!this.getSize().contains(e))&&(this.panBy(e,i),!0)},_createAnimProxy:function(){var t=this._proxy=G("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",function(t){var i=ce,e=this._proxy.style[i];rt(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),e===this._proxy.style[i]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on("load moveend",function(){var t=this.getCenter(),i=this.getZoom();rt(this._proxy,this.project(t,i),this.getZoomScale(i,1))},this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){K(this._proxy),delete this._proxy},_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,i,e){if(this._animatingZoom)return!0;if(e=e||{},!this._zoomAnimated||!1===e.animate||this._nothingToAnimate()||Math.abs(i-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(f(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,n,o){this._mapPane&&(n&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,Q(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:o}),setTimeout(e(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&tt(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),f(function(){this._moveEnd(!0)},this))}}),Te=v.extend({options:{position:"topright"},initialize:function(t){l(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return Q(i,"leaflet-control"),-1!==e.indexOf("bottom")?n.insertBefore(i,n.firstChild):n.appendChild(i),this},remove:function(){return this._map?(K(this._container),this.onRemove&&this.onRemove(this._map),this._map=null,this):this},_refocusOnMap:function(t){this._map&&t&&t.screenX>0&&t.screenY>0&&this._map.getContainer().focus()}}),ze=function(t){return new Te(t)};be.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){function t(t,o){var s=e+t+" "+e+o;i[t+o]=G("div",s,n)}var i=this._controlCorners={},e="leaflet-",n=this._controlContainer=G("div",e+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){for(var t in this._controlCorners)K(this._controlCorners[t]);K(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var Me=Te.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,i,e,n){return e1,this._baseLayersList.style.display=t?"":"none"),this._separator.style.display=i&&t?"":"none",this},_onLayerChange:function(t){this._handlingClick||this._update();var i=this._getLayer(n(t.target)),e=i.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;e&&this._map.fire(e,i)},_createRadioElement:function(t,i){var e='",n=document.createElement("div");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement("label"),o=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=o):i=this._createRadioElement("leaflet-base-layers",o),this._layerControlInputs.push(i),i.layerId=n(t.layer),mt(i,"click",this._onInputClick,this);var s=document.createElement("span");s.innerHTML=" "+t.name;var r=document.createElement("div");return e.appendChild(r),r.appendChild(i),r.appendChild(s),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;s>=0;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;s=0;o--)t=e[o],i=this._getLayer(t.layerId).layer,t.disabled=void 0!==i.options.minZoom&&ni.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),Ce=Te.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"−",zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=G("div",i+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=G("a",e,n);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),wt(s),mt(s,"click",Lt),mt(s,"click",o,this),mt(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";tt(this._zoomInButton,i),tt(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMinZoom())&&Q(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMaxZoom())&&Q(this._zoomInButton,i)}});be.mergeOptions({zoomControl:!0}),be.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new Ce,this.addControl(this.zoomControl))});var Se=Te.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i=G("div","leaflet-control-scale"),e=this.options;return this._addScales(e,"leaflet-control-scale-line",i),t.on(e.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=G("div",i,e)),t.imperial&&(this._iScale=G("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+" m":i/1e3+" km";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;o>5280?(i=o/5280,e=this._getRoundNum(i),this._updateScale(this._iScale,e+" mi",e/i)):(n=this._getRoundNum(o),this._updateScale(this._iScale,n+" ft",n/o))},_updateScale:function(t,i,e){t.style.width=Math.round(this.options.maxWidth*e)+"px",t.innerHTML=i},_getRoundNum:function(t){var i=Math.pow(10,(Math.floor(t)+"").length-1),e=t/i;return e=e>=10?10:e>=5?5:e>=3?3:e>=2?2:1,i*e}}),Ze=Te.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){l(this,t),this._attributions={}},onAdd:function(t){t.attributionControl=this,this._container=G("div","leaflet-control-attribution"),wt(this._container);for(var i in t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):this},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(", ")),this._container.innerHTML=e.join(" | ")}}});be.mergeOptions({attributionControl:!0}),be.addInitHook(function(){this.options.attributionControl&&(new Ze).addTo(this)});Te.Layers=Me,Te.Zoom=Ce,Te.Scale=Se,Te.Attribution=Ze,ze.layers=function(t,i,e){return new Me(t,i,e)},ze.zoom=function(t){return new Ce(t)},ze.scale=function(t){return new Se(t)},ze.attribution=function(t){return new Ze(t)};var Ee=v.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled?this:(this._enabled=!0,this.addHooks(),this)},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});Ee.addTo=function(t,i){return t.addHandler(i,this),this};var ke,Ae={Events:li},Be=qi?"touchstart mousedown":"mousedown",Ie={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},Oe={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},Re=ci.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){l(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(mt(this._dragStartTarget,Be,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Re._dragging===this&&this.finishDrag(),ft(this._dragStartTarget,Be,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!$(this._element,"leaflet-zoom-anim")&&!(Re._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(Re._dragging=this,this._preventOutline&&ct(this._element),ut(),fi(),this._moving)))){this.fire("down");var i=t.touches?t.touches[0]:t,e=dt(this._element);this._startPoint=new x(i.clientX,i.clientY),this._parentScale=pt(e),mt(document,Oe[t.type],this._onMove,this),mt(document,Ie[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&t.touches.length>1)this._moved=!0;else{var i=t.touches&&1===t.touches.length?t.touches[0]:t,e=new x(i.clientX,i.clientY)._subtract(this._startPoint);(e.x||e.y)&&(Math.abs(e.x)+Math.abs(e.y)1e-7;h++)i=s*Math.sin(a),i=Math.pow((1-i)/(1+i),s/2),a+=u=Math.PI/2-2*Math.atan(r*i)-a;return new M(a*e,t.x*e/n)}},He=(Object.freeze||Object)({LonLat:je,Mercator:We,SphericalMercator:mi}),Fe=i({},pi,{code:"EPSG:3395",projection:We,transformation:function(){var t=.5/(Math.PI*We.R);return Z(t,.5,-t,.5)}()}),Ue=i({},pi,{code:"EPSG:4326",projection:je,transformation:Z(1/180,1,-1/180,.5)}),Ve=i({},di,{projection:je,transformation:Z(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,i){var e=i.lng-t.lng,n=i.lat-t.lat;return Math.sqrt(e*e+n*n)},infinite:!0});di.Earth=pi,di.EPSG3395=Fe,di.EPSG3857=yi,di.EPSG900913=xi,di.EPSG4326=Ue,di.Simple=Ve;var qe=ci.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[n(t)]=this,this},removeInteractiveTarget:function(t){return delete this._map._targets[n(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var i=t.target;if(i.hasLayer(this)){if(this._map=i,this._zoomAnimated=i._zoomAnimated,this.getEvents){var e=this.getEvents();i.on(e,this),this.once("remove",function(){i.off(e,this)},this)}this.onAdd(i),this.getAttribution&&i.attributionControl&&i.attributionControl.addAttribution(this.getAttribution()),this.fire("add"),i.fire("layeradd",{layer:this})}}});be.include({addLayer:function(t){if(!t._layerAdd)throw new Error("The provided object is not a Layer.");var i=n(t);return this._layers[i]?this:(this._layers[i]=t,t._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t),this)},removeLayer:function(t){var i=n(t);return this._layers[i]?(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[i],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null,this):this},hasLayer:function(t){return!!t&&n(t)in this._layers},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},_addLayers:function(t){for(var i=0,e=(t=t?oi(t)?t:[t]:[]).length;ithis._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()i)return r=(n-i)/e,this._map.layerPointToLatLng([s.x-r*(s.x-o.x),s.y-r*(s.y-o.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,i){return i=i||this._defaultShape(),t=C(t),i.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new T,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return jt(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var i=[],e=jt(t),n=0,o=t.length;n=2&&i[0]instanceof M&&i[0].equals(i[e-1])&&i.pop(),i},_setLatLngs:function(t){nn.prototype._setLatLngs.call(this,t),jt(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return jt(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,i=this.options.weight,e=new x(i,i);if(t=new P(t.min.subtract(e),t.max.add(e)),this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var n,o=0,s=this._rings.length;ot.y!=n.y>t.y&&t.x<(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||nn.prototype._containsPoint.call(this,t,!0)}}),sn=Ke.extend({initialize:function(t,i){l(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=oi(t)?t:t.features;if(o){for(i=0,e=o.length;i0?o:[i.src]}else{oi(this._url)||(this._url=[this._url]),i.autoplay=!!this.options.autoplay,i.loop=!!this.options.loop;for(var a=0;ao?(i.height=o+"px",Q(t,"leaflet-popup-scrolled")):tt(t,"leaflet-popup-scrolled"),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),e=this._getAnchor();at(this._container,i.add(e))},_adjustPan:function(){if(!(!this.options.autoPan||this._map._panAnim&&this._map._panAnim._inProgress)){var t=this._map,i=parseInt(q(this._container,"marginBottom"),10)||0,e=this._container.offsetHeight+i,n=this._containerWidth,o=new x(this._containerLeft,-e-this._containerBottom);o._add(ht(this._container));var s=t.layerPointToContainerPoint(o),r=w(this.options.autoPanPadding),a=w(this.options.autoPanPaddingTopLeft||r),h=w(this.options.autoPanPaddingBottomRight||r),u=t.getSize(),l=0,c=0;s.x+n+h.x>u.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire("autopanstart").panBy([l,c])}},_onCloseButtonClick:function(t){this._close(),Lt(t)},_getAnchor:function(){return w(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});be.mergeOptions({closePopupOnClick:!0}),be.include({openPopup:function(t,i,e){return t instanceof cn||(t=new cn(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),qe.include({bindPopup:function(t,i){return t instanceof cn?(l(t,i),this._popup=t,t._source=this):(this._popup&&!i||(this._popup=new cn(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){if(t instanceof qe||(i=t,t=this),t instanceof Ke)for(var e in this._layers){t=this._layers[e];break}return i||(i=t.getCenter?t.getCenter():t.getLatLng()),this._popup&&this._map&&(this._popup._source=t,this._popup.update(),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Lt(t),i instanceof Qe?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var _n=ln.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){ln.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){ln.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=ln.prototype.getEvents.call(this);return qi&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=G("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i=this._map,e=this._container,n=i.latLngToContainerPoint(i.getCenter()),o=i.layerPointToContainerPoint(t),s=this.options.direction,r=e.offsetWidth,a=e.offsetHeight,h=w(this.options.offset),u=this._getAnchor();"top"===s?t=t.add(w(-r/2+h.x,-a+h.y+u.y,!0)):"bottom"===s?t=t.subtract(w(r/2-h.x,-h.y,!0)):"center"===s?t=t.subtract(w(r/2+h.x,a/2-u.y+h.y,!0)):"right"===s||"auto"===s&&o.xthis.options.maxZoom||en&&this._retainParent(o,s,r,n))},_retainChildren:function(t,i,e,n){for(var o=2*t;o<2*t+2;o++)for(var s=2*i;s<2*i+2;s++){var r=new x(o,s);r.z=e+1;var a=this._tileCoordsToKey(r),h=this._tiles[a];h&&h.active?h.retain=!0:(h&&h.loaded&&(h.retain=!0),e+1this.options.maxZoom||void 0!==this.options.minZoom&&o1)this._setView(t,e);else{for(var c=o.min.y;c<=o.max.y;c++)for(var _=o.min.x;_<=o.max.x;_++){var d=new x(_,c);if(d.z=this._tileZoom,this._isValidTile(d)){var p=this._tiles[this._tileCoordsToKey(d)];p?p.current=!0:r.push(d)}}if(r.sort(function(t,i){return t.distanceTo(s)-i.distanceTo(s)}),0!==r.length){this._loading||(this._loading=!0,this.fire("loading"));var m=document.createDocumentFragment();for(_=0;_e.max.x)||!i.wrapLat&&(t.ye.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return z(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new T(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),e=new x(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(K(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){Q(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=r,t.onmousemove=r,Li&&this.options.opacity<1&&nt(t,this.options.opacity),zi&&!Mi&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,i){var n=this._getTilePos(t),o=this._tileCoordsToKey(t),s=this.createTile(this._wrapCoords(t),e(this._tileReady,this,t));this._initTile(s),this.createTile.length<2&&f(e(this._tileReady,this,t,null,s)),at(s,n),this._tiles[o]={el:s,coords:t,current:!0},i.appendChild(s),this.fire("tileloadstart",{tile:s,coords:t})},_tileReady:function(t,i,n){i&&this.fire("tileerror",{error:i,tile:n,coords:t});var o=this._tileCoordsToKey(t);(n=this._tiles[o])&&(n.loaded=+new Date,this._map._fadeAnimated?(nt(n.el,0),g(this._fadeFrame),this._fadeFrame=f(this._updateOpacity,this)):(n.active=!0,this._pruneTiles()),i||(Q(n.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:n.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),Li||!this._map._fadeAnimated?f(this._pruneTiles,this):setTimeout(e(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new x(this._wrapX?s(t.x,this._wrapX):t.x,this._wrapY?s(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new P(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}}),mn=pn.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=l(this,i)).detectRetina&&Yi&&i.maxZoom>0&&(i.tileSize=Math.floor(i.tileSize/2),i.zoomReverse?(i.zoomOffset--,i.minZoom++):(i.zoomOffset++,i.maxZoom--),i.minZoom=Math.max(0,i.minZoom)),"string"==typeof i.subdomains&&(i.subdomains=i.subdomains.split("")),zi||this.on("tileunload",this._onTileRemove)},setUrl:function(t,i){return this._url=t,i||this.redraw(),this},createTile:function(t,i){var n=document.createElement("img");return mt(n,"load",e(this._tileOnLoad,this,i,n)),mt(n,"error",e(this._tileOnError,this,i,n)),(this.options.crossOrigin||""===this.options.crossOrigin)&&(n.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),n.alt="",n.setAttribute("role","presentation"),n.src=this.getTileUrl(t),n},getTileUrl:function(t){var e={r:Yi?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var n=this._globalTileRange.max.y-t.y;this.options.tms&&(e.y=n),e["-y"]=n}return _(this._url,i(e,this.options))},_tileOnLoad:function(t,i){Li?setTimeout(e(t,this,null,i),0):t(null,i)},_tileOnError:function(t,i,e){var n=this.options.errorTileUrl;n&&i.getAttribute("src")!==n&&(i.src=n),t(e,i)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,i=this.options.maxZoom,e=this.options.zoomReverse,n=this.options.zoomOffset;return e&&(t=i-t),t+n},_getSubdomain:function(t){var i=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var t,i;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((i=this._tiles[t].el).onload=r,i.onerror=r,i.complete||(i.src=si,K(i),delete this._tiles[t]))},_removeTile:function(t){var i=this._tiles[t];if(i)return Si||i.el.setAttribute("src",si),pn.prototype._removeTile.call(this,t)},_tileReady:function(t,i,e){if(this._map&&(!e||e.getAttribute("src")!==si))return pn.prototype._tileReady.call(this,t,i,e)}}),fn=mn.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var n=i({},this.defaultWmsParams);for(var o in e)o in this.options||(n[o]=e[o]);var s=(e=l(this,e)).detectRetina&&Yi?2:1,r=this.getTileSize();n.width=r.x*s,n.height=r.y*s,this.wmsParams=n},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var i=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[i]=this._crs.code,mn.prototype.onAdd.call(this,t)},getTileUrl:function(t){var i=this._tileCoordsToNwSe(t),e=this._crs,n=b(e.project(i[0]),e.project(i[1])),o=n.min,s=n.max,r=(this._wmsVersion>=1.3&&this._crs===Ue?[o.y,o.x,s.y,s.x]:[o.x,o.y,s.x,s.y]).join(","),a=mn.prototype.getTileUrl.call(this,t);return a+c(this.wmsParams,a,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+r},setParams:function(t,e){return i(this.wmsParams,t),e||this.redraw(),this}});mn.WMS=fn,Jt.wms=function(t,i){return new fn(t,i)};var gn=qe.extend({options:{padding:.1,tolerance:0},initialize:function(t){l(this,t),n(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),this._zoomAnimated&&Q(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,i){var e=this._map.getZoomScale(i,this._zoom),n=ht(this._container),o=this._map.getSize().multiplyBy(.5+this.options.padding),s=this._map.project(this._center,i),r=this._map.project(t,i).subtract(s),a=o.multiplyBy(-e).add(n).add(o).subtract(r);ji?rt(this._container,a,e):at(this._container,a)},_reset:function(){this._update(),this._updateTransform(this._center,this._zoom);for(var t in this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,i=this._map.getSize(),e=this._map.containerPointToLayerPoint(i.multiplyBy(-t)).round();this._bounds=new P(e,e.add(i.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),vn=gn.extend({getEvents:function(){var t=gn.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){gn.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement("canvas");mt(t,"mousemove",o(this._onMouseMove,32,this),this),mt(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this),mt(t,"mouseout",this._handleMouseOut,this),this._ctx=t.getContext("2d")},_destroyContainer:function(){g(this._redrawRequest),delete this._ctx,K(this._container),ft(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){this._redrawBounds=null;for(var t in this._layers)this._layers[t]._update();this._redraw()}},_update:function(){if(!this._map._animatingZoom||!this._bounds){this._drawnLayers={},gn.prototype._update.call(this);var t=this._bounds,i=this._container,e=t.getSize(),n=Yi?2:1;at(i,t.min),i.width=n*e.x,i.height=n*e.y,i.style.width=e.x+"px",i.style.height=e.y+"px",Yi&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update")}},_reset:function(){gn.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t),this._layers[n(t)]=t;var i=t._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=i),this._drawLast=i,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var i=t._order,e=i.next,o=i.prev;e?e.prev=o:this._drawLast=o,o?o.next=e:this._drawFirst=e,delete this._drawnLayers[t._leaflet_id],delete t._order,delete this._layers[n(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if("string"==typeof t.options.dashArray){var i,e=t.options.dashArray.split(/[, ]+/),n=[];for(i=0;i')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),xn={_initContainer:function(){this._container=G("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(gn.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=yn("shape");Q(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=yn("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[n(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;K(i),t.removeInteractiveTarget(i),delete this._layers[n(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i||(i=t._stroke=yn("stroke")),o.appendChild(i),i.weight=n.weight+"px",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=oi(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=n.lineCap.replace("butt","flat"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e||(e=t._fill=yn("fill")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+n+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){X(t._container)},_bringToBack:function(t){J(t._container)}},wn=$i?yn:E,Pn=gn.extend({getEvents:function(){var t=gn.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=wn("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=wn("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){K(this._container),ft(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){gn.prototype._update.call(this);var t=this._bounds,i=t.getSize(),e=this._container;this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),at(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update")}},_initPath:function(t){var i=t._path=wn("path");t.options.className&&Q(i,t.options.className),t.options.interactive&&Q(i,"leaflet-interactive"),this._updateStyle(t),this._layers[n(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){K(t._path),t.removeInteractiveTarget(t._path),delete this._layers[n(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute("stroke",e.color),i.setAttribute("stroke-opacity",e.opacity),i.setAttribute("stroke-width",e.weight),i.setAttribute("stroke-linecap",e.lineCap),i.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?i.setAttribute("stroke-dasharray",e.dashArray):i.removeAttribute("stroke-dasharray"),e.dashOffset?i.setAttribute("stroke-dashoffset",e.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),e.fill?(i.setAttribute("fill",e.fillColor||e.color),i.setAttribute("fill-opacity",e.fillOpacity),i.setAttribute("fill-rule",e.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,k(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+n+2*e+",0 "+n+2*-e+",0 ";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){X(t._path)},_bringToBack:function(t){J(t._path)}});$i&&Pn.include(xn),be.include({getRenderer:function(t){var i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return i||(i=this._renderer=this._createRenderer()),this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&$t(t)||Qt(t)}});var Ln=on.extend({initialize:function(t,i){on.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=z(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});Pn.create=wn,Pn.pointsToPath=k,sn.geometryToLayer=Ft,sn.coordsToLatLng=Ut,sn.coordsToLatLngs=Vt,sn.latLngToCoords=qt,sn.latLngsToCoords=Gt,sn.getFeature=Kt,sn.asFeature=Yt,be.mergeOptions({boxZoom:!0});var bn=Ee.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){mt(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){ft(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){K(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),fi(),ut(),this._startPoint=this._map.mouseEventToContainerPoint(t),mt(document,{contextmenu:Lt,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=G("div","leaflet-zoom-box",this._container),Q(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new P(this._point,this._startPoint),e=i.getSize();at(this._box,i.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(K(this._box),tt(this._container,"leaflet-crosshair")),gi(),lt(),ft(document,{contextmenu:Lt,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(e(this._resetState,this),0);var i=new T(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});be.addInitHook("addHandler","boxZoom",bn),be.mergeOptions({doubleClickZoom:!0});var Tn=Ee.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;"center"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});be.addInitHook("addHandler","doubleClickZoom",Tn),be.mergeOptions({dragging:!0,inertia:!Mi,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var zn=Ee.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new Re(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}Q(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){tt(this._map._container,"leaflet-grab"),tt(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=z(this._map.options.maxBounds);this._offsetLimit=b(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(e),this._times.push(i),this._prunePositions(i)}this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;this._positions.length>1&&t-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,i){return t-(t-i)*this._viscosity},_onPreDragLimit:function(){if(this._viscosity&&this._offsetLimit){var t=this._draggable._newPos.subtract(this._draggable._startPos),i=this._offsetLimit;t.xi.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)0?s:-s))-i;this._delta=0,this._startTime=null,r&&("center"===t.options.scrollWheelZoom?t.setZoom(i+r):t.setZoomAround(this._lastMousePos,i+r))}});be.addInitHook("addHandler","scrollWheelZoom",Cn),be.mergeOptions({tap:!0,tapTolerance:15});var Sn=Ee.extend({addHooks:function(){mt(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){ft(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(Pt(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new x(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&Q(n,"leaflet-active"),this._holdTimeout=setTimeout(e(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),this._simulateEvent("mousedown",i),mt(document,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),ft(document,{touchmove:this._onMove,touchend:this._onUp},this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],e=i.target;e&&e.tagName&&"a"===e.tagName.toLowerCase()&&tt(e,"leaflet-active"),this._simulateEvent("mouseup",i),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var i=t.touches[0];this._newPos=new x(i.clientX,i.clientY),this._simulateEvent("mousemove",i)},_simulateEvent:function(t,i){var e=document.createEvent("MouseEvents");e._simulated=!0,i.target._simulatedClick=!0,e.initMouseEvent(t,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),i.target.dispatchEvent(e)}});qi&&!Vi&&be.addInitHook("addHandler","tap",Sn),be.mergeOptions({touchZoom:qi&&!Mi,bounceAtZoomLimits:!0});var Zn=Ee.extend({addHooks:function(){Q(this._map._container,"leaflet-touch-zoom"),mt(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){tt(this._map._container,"leaflet-touch-zoom"),ft(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var e=i.mouseEventToContainerPoint(t.touches[0]),n=i.mouseEventToContainerPoint(t.touches[1]);this._centerPoint=i.getSize()._divideBy(2),this._startLatLng=i.containerPointToLatLng(this._centerPoint),"center"!==i.options.touchZoom&&(this._pinchStartLatLng=i.containerPointToLatLng(e.add(n)._divideBy(2))),this._startDist=e.distanceTo(n),this._startZoom=i.getZoom(),this._moved=!1,this._zooming=!0,i._stop(),mt(document,"touchmove",this._onTouchMove,this),mt(document,"touchend",this._onTouchEnd,this),Pt(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var i=this._map,n=i.mouseEventToContainerPoint(t.touches[0]),o=i.mouseEventToContainerPoint(t.touches[1]),s=n.distanceTo(o)/this._startDist;if(this._zoom=i.getScaleZoom(s,this._startZoom),!i.options.bounceAtZoomLimits&&(this._zoomi.getMaxZoom()&&s>1)&&(this._zoom=i._limitZoom(this._zoom)),"center"===i.options.touchZoom){if(this._center=this._startLatLng,1===s)return}else{var r=n._add(o)._divideBy(2)._subtract(this._centerPoint);if(1===s&&0===r.x&&0===r.y)return;this._center=i.unproject(i.project(this._pinchStartLatLng,this._zoom).subtract(r),this._zoom)}this._moved||(i._moveStart(!0,!1),this._moved=!0),g(this._animRequest);var a=e(i._move,i,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=f(a,this,!0),Pt(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,g(this._animRequest),ft(document,"touchmove",this._onTouchMove),ft(document,"touchend",this._onTouchEnd),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}});be.addInitHook("addHandler","touchZoom",Zn),be.BoxZoom=bn,be.DoubleClickZoom=Tn,be.Drag=zn,be.Keyboard=Mn,be.ScrollWheelZoom=Cn,be.Tap=Sn,be.TouchZoom=Zn,Object.freeze=ti,t.version="1.3.4+HEAD.0e566b2",t.Control=Te,t.control=ze,t.Browser=Qi,t.Evented=ci,t.Mixin=Ae,t.Util=ui,t.Class=v,t.Handler=Ee,t.extend=i,t.bind=e,t.stamp=n,t.setOptions=l,t.DomEvent=Pe,t.DomUtil=ve,t.PosAnimation=Le,t.Draggable=Re,t.LineUtil=Ne,t.PolyUtil=De,t.Point=x,t.point=w,t.Bounds=P,t.bounds=b,t.Transformation=S,t.transformation=Z,t.Projection=He,t.LatLng=M,t.latLng=C,t.LatLngBounds=T,t.latLngBounds=z,t.CRS=di,t.GeoJSON=sn,t.geoJSON=Xt,t.geoJson=an,t.Layer=qe,t.LayerGroup=Ge,t.layerGroup=function(t,i){return new Ge(t,i)},t.FeatureGroup=Ke,t.featureGroup=function(t){return new Ke(t)},t.ImageOverlay=hn,t.imageOverlay=function(t,i,e){return new hn(t,i,e)},t.VideoOverlay=un,t.videoOverlay=function(t,i,e){return new un(t,i,e)},t.DivOverlay=ln,t.Popup=cn,t.popup=function(t,i){return new cn(t,i)},t.Tooltip=_n,t.tooltip=function(t,i){return new _n(t,i)},t.Icon=Ye,t.icon=function(t){return new Ye(t)},t.DivIcon=dn,t.divIcon=function(t){return new dn(t)},t.Marker=$e,t.marker=function(t,i){return new $e(t,i)},t.TileLayer=mn,t.tileLayer=Jt,t.GridLayer=pn,t.gridLayer=function(t){return new pn(t)},t.SVG=Pn,t.svg=Qt,t.Renderer=gn,t.Canvas=vn,t.canvas=$t,t.Path=Qe,t.CircleMarker=tn,t.circleMarker=function(t,i){return new tn(t,i)},t.Circle=en,t.circle=function(t,i,e){return new en(t,i,e)},t.Polyline=nn,t.polyline=function(t,i){return new nn(t,i)},t.Polygon=on,t.polygon=function(t,i){return new on(t,i)},t.Rectangle=Ln,t.rectangle=function(t,i){return new Ln(t,i)},t.Map=be,t.map=function(t,i){return new be(t,i)};var En=window.L;t.noConflict=function(){return window.L=En,this},window.L=t}); \ No newline at end of file diff --git a/user/themes/r2c/js/leaflet.js.map b/user/themes/r2c/js/leaflet.js.map new file mode 100644 index 0000000..e4298b3 --- /dev/null +++ b/user/themes/r2c/js/leaflet.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["dist/leaflet-src.js"],"names":["global","factory","exports","module","define","amd","L","this","extend","dest","i","j","len","src","arguments","length","bind","fn","obj","slice","Array","prototype","apply","call","args","concat","stamp","_leaflet_id","lastId","throttle","time","context","lock","wrapperFn","later","setTimeout","wrapNum","x","range","includeMax","max","min","d","falseFn","formatNum","num","digits","pow","Math","undefined","round","trim","str","replace","splitWords","split","setOptions","options","hasOwnProperty","create","getParamString","existingUrl","uppercase","params","push","encodeURIComponent","toUpperCase","indexOf","join","template","data","templateRe","key","value","Error","array","el","getPrefixed","name","window","timeoutDefer","Date","timeToCall","lastTime","requestAnimFrame","immediate","requestFn","cancelAnimFrame","id","cancelFn","Class","checkDeprecatedMixinEvents","includes","Mixin","isArray","Events","console","warn","stack","Point","y","toPoint","Bounds","a","b","points","toBounds","LatLngBounds","corner1","corner2","latlngs","toLatLngBounds","LatLng","lat","lng","alt","isNaN","toLatLng","c","lon","Transformation","_a","_b","_c","_d","toTransformation","svgCreate","document","createElementNS","pointsToPath","rings","closed","len2","p","svg","userAgentContains","navigator","userAgent","toLowerCase","addPointerListener","type","handler","_addPointerStart","_addPointerMove","_addPointerEnd","removePointerListener","removeEventListener","POINTER_DOWN","POINTER_MOVE","POINTER_UP","POINTER_CANCEL","onDown","e","pointerType","MSPOINTER_TYPE_MOUSE","TAG_WHITE_LIST","target","tagName","preventDefault","_handlePointer","addEventListener","_pointerDocListener","documentElement","_globalPointerDown","_globalPointerMove","_globalPointerUp","_pointers","pointerId","_pointersCount","touches","changedTouches","onMove","buttons","onUp","addDoubleTapListener","onTouchStart","count","pointer","edge","now","delta","last","touch$$1","doubleTap","delay","onTouchEnd","cancelBubble","prop","newTouch","_pre","_touchstart","_touchend","removeDoubleTapListener","touchstart","touchend","dblclick","get","getElementById","getStyle","style","currentStyle","defaultView","css","getComputedStyle","create$1","className","container","createElement","appendChild","remove","parent","parentNode","removeChild","empty","firstChild","toFront","lastChild","toBack","insertBefore","hasClass","classList","contains","getClass","RegExp","test","addClass","classes","add","setClass","removeClass","baseVal","setOpacity","opacity","_setOpacityIE","filter","filterName","filters","item","Enabled","Opacity","testProp","props","setTransform","offset","scale","pos","TRANSFORM","ie3d","setPosition","point","_leaflet_pos","any3d","left","top","getPosition","disableImageDrag","on","enableImageDrag","off","preventOutline","element","tabIndex","restoreOutline","_outlineElement","_outlineStyle","outline","getSizedParentNode","offsetWidth","offsetHeight","body","getScale","rect","getBoundingClientRect","width","height","boundingClientRect","types","addOne","removeOne","eventsKey","event","originalHandler","touch","chrome","isExternalTarget","android","filterClick","attachEvent","detachEvent","stopPropagation","originalEvent","_stopped","skipped","disableScrollPropagation","disableClickPropagation","fakeStop","returnValue","stop","getMousePosition","clientX","clientY","clientLeft","clientTop","getWheelDelta","wheelDeltaY","deltaY","deltaMode","wheelPxFactor","deltaX","deltaZ","wheelDelta","detail","abs","skipEvents","events","related","relatedTarget","err","timeStamp","elapsed","lastClick","_simulatedClick","_simulated","simplify","tolerance","sqTolerance","_reducePoints","_simplifyDP","pointToSegmentDistance","p1","p2","sqrt","_sqClosestPointOnSegment","markers","Uint8Array","_simplifyDPStep","newPoints","first","index","sqDist","maxSqDist","reducedPoints","prev","_sqDist","clipSegment","bounds","useLastCode","codeOut","newCode","codeA","_lastCode","_getBitCode","codeB","_getEdgeIntersection","code","dx","dy","t","dot","isFlat","_flat","clipPolygon","clippedPoints","k","edges","_code","geometryToLayer","geojson","latlng","geometry","coords","coordinates","layers","pointToLayer","_coordsToLatLng","coordsToLatLng","Marker","FeatureGroup","coordsToLatLngs","Polyline","Polygon","geometries","layer","properties","levelsDeep","latLngToCoords","precision","latLngsToCoords","getFeature","newGeometry","feature","asFeature","geoJSON","GeoJSON","tileLayer","url","TileLayer","canvas$1","canvas","Canvas","svg$1","vml","SVG","freeze","Object","F","proto","toString","emptyImageUrl","requestAnimationFrame","cancelAnimationFrame","clearTimeout","Util","NewClass","initialize","callInitHooks","parentProto","__super__","constructor","statics","_initHooks","_initHooksCalled","include","mergeOptions","addInitHook","init","_on","_off","_events","typeListeners","newListener","ctx","listeners","l","_firingCount","splice","fire","propagate","listens","sourceTarget","_propagateEvent","_eventParents","once","addEventParent","removeEventParent","propagatedFrom","clearAllEventListeners","addOneTimeEventListener","fireEvent","hasEventListeners","Evented","trunc","v","floor","ceil","clone","_add","subtract","_subtract","divideBy","_divideBy","multiplyBy","_multiplyBy","scaleBy","unscaleBy","_round","_floor","_ceil","_trunc","distanceTo","equals","getCenter","getBottomLeft","getTopRight","getTopLeft","getBottomRight","getSize","intersects","min2","max2","xIntersects","yIntersects","overlaps","xOverlaps","yOverlaps","isValid","sw2","ne2","sw","_southWest","ne","_northEast","pad","bufferRatio","heightBuffer","widthBuffer","getSouthWest","getNorthEast","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","latIntersects","lngIntersects","latOverlaps","lngOverlaps","toBBoxString","maxMargin","other","Earth","distance","wrap","wrapLatLng","sizeInMeters","latAccuracy","lngAccuracy","cos","PI","CRS","latLngToPoint","zoom","projectedPoint","projection","project","transformation","_transform","pointToLatLng","untransformedPoint","untransform","unproject","log","LN2","getProjectedBounds","infinite","s","transform","wrapLng","wrapLat","wrapLatLngBounds","center","newCenter","latShift","lngShift","R","latlng1","latlng2","rad","lat1","lat2","sinDLat","sin","sinDLon","atan2","SphericalMercator","MAX_LATITUDE","atan","exp","disableTextSelection","enableTextSelection","_userSelect","EPSG3857","EPSG900913","style$1","ie","ielt9","webkit","android23","webkitVer","parseInt","exec","androidStock","opera","gecko","safari","phantom","opera12","win","platform","webkit3d","WebKitCSSMatrix","gecko3d","L_DISABLE_3D","mobile","orientation","mobileWebkit","mobileWebkit3d","msPointer","PointerEvent","MSPointerEvent","L_NO_TOUCH","DocumentTouch","mobileOpera","mobileGecko","retina","devicePixelRatio","screen","deviceXDPI","logicalXDPI","getContext","createSVGRect","div","innerHTML","shape","behavior","adj","Browser","TRANSITION","TRANSITION_END","userSelectProperty","DomUtil","DomEvent","addListener","removeListener","PosAnimation","run","newPos","duration","easeLinearity","_el","_inProgress","_duration","_easeOutPower","_startPos","_offset","_startTime","_animate","_step","_complete","_animId","_runFrame","_easeOut","progress","Map","crs","minZoom","maxZoom","maxBounds","renderer","zoomAnimation","zoomAnimationThreshold","fadeAnimation","markerZoomAnimation","transform3DLimit","zoomSnap","zoomDelta","trackResize","_initContainer","_initLayout","_onResize","_initEvents","setMaxBounds","_zoom","_limitZoom","setView","reset","_handlers","_layers","_zoomBoundLayers","_sizeChanged","_zoomAnimated","_createAnimProxy","_proxy","_catchTransitionEnd","_addLayers","_limitCenter","_stop","_loaded","animate","pan","_tryAnimatedZoom","_tryAnimatedPan","_sizeTimer","_resetView","setZoom","zoomIn","zoomOut","setZoomAround","getZoomScale","viewHalf","centerOffset","latLngToContainerPoint","containerPointToLatLng","_getBoundsCenterZoom","getBounds","paddingTL","paddingTopLeft","padding","paddingBR","paddingBottomRight","getBoundsZoom","Infinity","paddingOffset","swPoint","nePoint","fitBounds","fitWorld","panTo","panBy","getZoom","_panAnim","step","_onPanTransitionStep","end","_onPanTransitionEnd","noMoveStart","_mapPane","_getMapPanePos","_rawPanBy","flyTo","targetCenter","targetZoom","r","w1","w0","rho2","u1","sq","sinh","n","cosh","tanh","w","r0","rho","u","easeOut","frame","start","S","_flyToFrame","_move","from","to","startZoom","getScaleZoom","_moveEnd","size","_moveStart","flyToBounds","_panInsideMaxBounds","setMinZoom","oldZoom","setMaxZoom","panInsideBounds","_enforcingBounds","invalidateSize","oldSize","_lastCenter","newSize","oldCenter","debounceMoveend","locate","_locateOptions","timeout","watch","_handleGeolocationError","message","onResponse","_handleGeolocationResponse","onError","_locationWatchId","geolocation","watchPosition","getCurrentPosition","stopLocate","clearWatch","error","latitude","longitude","accuracy","timestamp","addHandler","HandlerClass","enable","_containerId","_container","_clearControlPos","_resizeRequest","_clearHandlers","_panes","_renderer","createPane","pane","_checkIfLoaded","_moved","layerPointToLatLng","_getCenterLayerPoint","getPixelBounds","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","inside","nw","se","boundsSize","snap","scalex","scaley","_size","clientWidth","clientHeight","topLeftPoint","_getTopLeftPoint","getPixelOrigin","_pixelOrigin","getPixelWorldBounds","getPane","getPanes","getContainer","toZoom","fromZoom","latLngToLayerPoint","containerPointToLayerPoint","layerPointToContainerPoint","layerPoint","mouseEventToContainerPoint","mouseEventToLayerPoint","mouseEventToLatLng","_onScroll","_fadeAnimated","position","_initPanes","_initControlPos","panes","_paneRenderers","markerPane","shadowPane","loading","zoomChanged","_getNewPixelOrigin","pinch","_getZoomSpan","remove$$1","_targets","onOff","_handleDOMEvent","_onMoveEnd","scrollTop","scrollLeft","_findEventTargets","targets","isHover","srcElement","dragging","_draggableMoved","_fireDOMEvent","_mouseEvents","synth","isMarker","getLatLng","_radius","containerPoint","bubblingMouseEvents","enabled","moved","boxZoom","disable","whenReady","callback","_latLngToNewLayerPoint","topLeft","_latLngBoundsToNewLayerBounds","latLngBounds","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","_limitOffset","newBounds","pxBounds","projectedMaxBounds","minOffset","maxOffset","_rebound","right","proxy","mapPane","_animatingZoom","_onZoomTransitionEnd","z","_destroyAnimProxy","propertyName","_nothingToAnimate","getElementsByClassName","_animateZoom","startAnim","noUpdate","_animateToCenter","_animateToZoom","Control","map","_map","removeControl","addControl","addTo","onAdd","corner","_controlCorners","onRemove","_refocusOnMap","screenX","screenY","focus","control","createCorner","vSide","hSide","corners","_controlContainer","Layers","collapsed","autoZIndex","hideSingleBase","sortLayers","sortFunction","layerA","layerB","nameA","nameB","baseLayers","overlays","_layerControlInputs","_lastZIndex","_handlingClick","_addLayer","_update","_checkDisabledLayers","_onLayerChange","_expandIfNotCollapsed","addBaseLayer","addOverlay","removeLayer","_getLayer","expand","_form","acceptableHeight","offsetTop","collapse","setAttribute","form","mouseenter","mouseleave","link","_layersLink","href","title","_baseLayersList","_separator","_overlaysList","overlay","sort","setZIndex","baseLayersPresent","overlaysPresent","baseLayersCount","_addItem","display","_createRadioElement","checked","radioHtml","radioFragment","input","label","hasLayer","defaultChecked","layerId","_onInputClick","holder","inputs","addedLayers","removedLayers","addLayer","disabled","_expand","_collapse","Zoom","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","zoomName","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","_disabled","shiftKey","html","zoomControl","Scale","maxWidth","metric","imperial","_addScales","updateWhenIdle","_mScale","_iScale","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_updateScale","maxMiles","miles","feet","maxFeet","text","ratio","pow10","Attribution","prefix","_attributions","attributionControl","getAttribution","addAttribution","setPrefix","removeAttribution","attribs","prefixAndAttribs","attribution","Handler","_enabled","addHooks","removeHooks","START","END","mousedown","pointerdown","MSPointerDown","MOVE","Draggable","clickTolerance","dragStartTarget","preventOutline$$1","_element","_dragStartTarget","_preventOutline","_onDown","_dragging","finishDrag","which","button","_moving","sizedParent","_startPoint","_parentScale","_onMove","_onUp","_lastTarget","SVGElementInstance","correspondingUseElement","_newPos","_animRequest","_lastEvent","_updatePosition","LineUtil","closestPointOnSegment","PolyUtil","LonLat","Mercator","R_MINOR","tmp","con","ts","tan","phi","dphi","EPSG3395","EPSG4326","Simple","Layer","removeFrom","_mapToAdd","addInteractiveTarget","targetEl","removeInteractiveTarget","_layerAdd","getEvents","beforeAdd","eachLayer","method","_addZoomLimit","_updateZoomLevels","_removeZoomLimit","oldZoomSpan","LayerGroup","getLayerId","clearLayers","invoke","methodName","getLayer","getLayers","zIndex","setStyle","bringToFront","bringToBack","Icon","popupAnchor","tooltipAnchor","createIcon","oldIcon","_createIcon","createShadow","_getIconUrl","img","_createImg","_setIconStyles","sizeOption","anchor","shadowAnchor","iconAnchor","marginLeft","marginTop","IconDefault","iconUrl","iconRetinaUrl","shadowUrl","iconSize","shadowSize","imagePath","_detectIconPath","path","MarkerDrag","marker","_marker","icon","_icon","_draggable","dragstart","_onDragStart","predrag","_onPreDrag","drag","_onDrag","dragend","_onDragEnd","_adjustPan","speed","autoPanSpeed","autoPanPadding","iconPos","origin","panBounds","movement","_panRequest","_oldLatLng","closePopup","autoPan","shadow","_shadow","_latlng","oldLatLng","interactive","keyboard","zIndexOffset","riseOnHover","riseOffset","draggable","_initIcon","update","_removeIcon","_removeShadow","viewreset","setLatLng","setZIndexOffset","setIcon","_popup","bindPopup","getElement","_setPos","classToAdd","addIcon","mouseover","_bringToFront","mouseout","_resetZIndex","newShadow","addShadow","_updateOpacity","_initInteraction","_zIndex","_updateZIndex","opt","_getPopupAnchor","_getTooltipAnchor","Path","stroke","color","weight","lineCap","lineJoin","dashArray","dashOffset","fill","fillColor","fillOpacity","fillRule","getRenderer","_initPath","_reset","_addPath","_removePath","redraw","_updatePath","_updateStyle","_bringToBack","_path","_project","_clickTolerance","CircleMarker","radius","setRadius","getRadius","_point","_updateBounds","r2","_radiusY","_pxBounds","_updateCircle","_empty","_bounds","_containsPoint","Circle","legacyOptions","_mRadius","half","latR","bottom","lngR","acos","smoothFactor","noClip","_setLatLngs","getLatLngs","_latlngs","setLatLngs","isEmpty","closestLayerPoint","minDistance","minPoint","closest","jLen","_parts","halfDist","segDist","dist","_rings","addLatLng","_defaultShape","_convertLatLngs","result","flat","_projectLatlngs","projectedBounds","ring","_clipPoints","segment","parts","_simplifyPoints","_updatePoly","part","f","area","pop","clipped","addData","features","defaultOptions","resetStyle","onEachFeature","_setLayerStyle","PointToGeoJSON","toGeoJSON","multi","holes","toMultiPoint","isGeometryCollection","jsons","json","geoJson","ImageOverlay","crossOrigin","errorOverlayUrl","_url","_image","_initImage","styleOpts","setUrl","setBounds","zoomanim","wasElementSupplied","onselectstart","onmousemove","onload","onerror","_overlayOnError","image","errorUrl","VideoOverlay","autoplay","loop","vid","onloadeddata","sourceElements","getElementsByTagName","sources","source","DivOverlay","_source","_removeTimeout","getContent","_content","setContent","content","visibility","_updateContent","_updateLayout","isOpen","node","_contentNode","hasChildNodes","_getAnchor","_containerBottom","_containerLeft","_containerWidth","Popup","minWidth","maxHeight","autoPanPaddingTopLeft","autoPanPaddingBottomRight","keepInView","closeButton","autoClose","closeOnEscapeKey","openOn","openPopup","popup","closeOnClick","closePopupOnClick","preclick","_close","moveend","wrapper","_wrapper","_tipContainer","_tip","_closeButton","_onCloseButtonClick","whiteSpace","marginBottom","containerHeight","containerWidth","layerPos","containerPos","_popupHandlersAdded","click","_openPopup","keypress","_onKeyPress","move","_movePopup","unbindPopup","togglePopup","isPopupOpen","setPopupContent","getPopup","keyCode","Tooltip","direction","permanent","sticky","tooltip","closeTooltip","_setPosition","tooltipPoint","tooltipWidth","tooltipHeight","openTooltip","bindTooltip","_tooltip","_initTooltipInteractions","unbindTooltip","_tooltipHandlersAdded","_moveTooltip","_openTooltip","mousemove","toggleTooltip","isTooltipOpen","setTooltipContent","getTooltip","DivIcon","bgPos","backgroundPosition","Default","GridLayer","tileSize","updateWhenZooming","updateInterval","maxNativeZoom","minNativeZoom","noWrap","keepBuffer","_levels","_tiles","_removeAllTiles","_tileZoom","_setAutoZIndex","isLoading","_loading","viewprereset","_invalidateAll","createTile","getTileSize","compare","children","edgeZIndex","isFinite","nextFrame","willPrune","tile","current","loaded","fade","active","_onOpaqueTile","_noPrune","_pruneTiles","_fadeFrame","_updateLevels","_onUpdateLevel","_removeTilesAtZoom","_onRemoveLevel","level","_setZoomTransform","_onCreateLevel","_level","retain","_retainParent","_retainChildren","_removeTile","x2","y2","z2","coords2","_tileCoordsToKey","animating","_setView","_clampZoom","noPrune","tileZoom","tileZoomChanged","_abortLoading","_resetGrid","_setZoomTransforms","translate","_tileSize","_globalTileRange","_pxBoundsToTileRange","_wrapX","_wrapY","_getTiledPixelBounds","mapZoom","pixelCenter","halfSize","pixelBounds","tileRange","tileCenter","queue","margin","noPruneRange","_isValidTile","fragment","createDocumentFragment","_addTile","tileBounds","_tileCoordsToBounds","_keyToBounds","_keyToTileCoords","_tileCoordsToNwSe","nwPoint","sePoint","bp","_initTile","WebkitBackfaceVisibility","tilePos","_getTilePos","_wrapCoords","_tileReady","_noTilesToLoad","newCoords","subdomains","errorTileUrl","zoomOffset","tms","zoomReverse","detectRetina","_onTileRemove","noRedraw","done","_tileOnLoad","_tileOnError","getTileUrl","_getSubdomain","_getZoomForUrl","invertedY","getAttribute","tilePoint","complete","TileLayerWMS","defaultWmsParams","service","request","styles","format","transparent","version","wmsParams","realRetina","_crs","_wmsVersion","parseFloat","projectionKey","bbox","setParams","WMS","wms","Renderer","_updatePaths","_destroyContainer","_onZoom","zoomend","_onZoomEnd","_onAnimZoom","ev","_updateTransform","currentCenterPoint","_center","topLeftOffset","_onViewPreReset","_postponeUpdatePaths","_draw","_onMouseMove","_onClick","_handleMouseOut","_ctx","_redrawRequest","_redrawBounds","_redraw","_drawnLayers","m","_updateDashArray","order","_order","_drawLast","next","_drawFirst","_requestRedraw","_extendRedrawBounds","Number","_dashArray","_clear","clearRect","save","beginPath","clip","_drawing","restore","closePath","_fillStroke","arc","globalAlpha","fillStyle","setLineDash","lineWidth","strokeStyle","clickedLayer","_fireEvent","moving","_handleMouseHover","_hoveredLayer","candidateHoveredLayer","vmlCreate","namespaces","vmlMixin","coordsize","_stroke","_fill","stroked","filled","dashStyle","endcap","joinstyle","_setPath","create$2","zoomstart","_onZoomStart","_rootGroup","_svgSize","removeAttribute","_getPaneRenderer","_createRenderer","preferCanvas","Rectangle","_boundsToLatLngs","BoxZoom","_pane","overlayPane","_resetStateTimeout","_destroy","_onMouseDown","_resetState","_clearDeferredResetState","contextmenu","mouseup","_onMouseUp","keydown","_onKeyDown","_box","_finish","boxZoomBounds","doubleClickZoom","DoubleClickZoom","_onDoubleClick","inertia","inertiaDeceleration","inertiaMaxSpeed","worldCopyJump","maxBoundsViscosity","Drag","_onPreDragLimit","_onPreDragWrap","_positions","_times","_offsetLimit","_viscosity","_lastTime","_lastPos","_absPos","_prunePositions","shift","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","_viscousLimit","threshold","limit","worldWidth","halfWidth","newX1","newX2","newX","noInertia","ease","speedVector","limitedSpeed","limitedSpeedVector","decelerationDuration","keyboardPanDelta","Keyboard","keyCodes","down","up","_setPanDelta","_setZoomDelta","_onFocus","blur","_onBlur","_addHooks","_removeHooks","_focused","docEl","scrollTo","panDelta","keys","_panKeys","codes","_zoomKeys","altKey","ctrlKey","metaKey","scrollWheelZoom","wheelDebounceTime","wheelPxPerZoomLevel","ScrollWheelZoom","_onWheelScroll","_delta","debounce","_lastMousePos","_timer","_performZoom","d2","d3","d4","tap","tapTolerance","Tap","_fireClick","_holdTimeout","_isTapValid","_simulateEvent","touchmove","simulatedEvent","createEvent","initMouseEvent","dispatchEvent","touchZoom","bounceAtZoomLimits","TouchZoom","_onTouchStart","_zooming","_centerPoint","_startLatLng","_pinchStartLatLng","_startDist","_startZoom","_onTouchMove","_onTouchEnd","moveFn","Projection","latLng","layerGroup","featureGroup","imageOverlay","videoOverlay","video","divIcon","gridLayer","circleMarker","circle","polyline","polygon","rectangle","oldL","noConflict"],"mappings":"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","file":"dist/leaflet.js.map"} \ No newline at end of file diff --git a/user/themes/r2c/js/paper_full.js b/user/themes/r2c/js/paper_full.js new file mode 100644 index 0000000..ca645b1 --- /dev/null +++ b/user/themes/r2c/js/paper_full.js @@ -0,0 +1,16494 @@ +/*! + * Paper.js v0.11.5 - The Swiss Army Knife of Vector Graphics Scripting. + * http://paperjs.org/ + * + * Copyright (c) 2011 - 2016, Juerg Lehni & Jonathan Puckey + * http://scratchdisk.com/ & http://jonathanpuckey.com/ + * + * Distributed under the MIT license. See LICENSE file for details. + * + * All rights reserved. + * + * Date: Thu Oct 5 16:16:29 2017 +0200 + * + *** + * + * Straps.js - Class inheritance library with support for bean-style accessors + * + * Copyright (c) 2006 - 2016 Juerg Lehni + * http://scratchdisk.com/ + * + * Distributed under the MIT license. + * + *** + * + * Acorn.js + * http://marijnhaverbeke.nl/acorn/ + * + * Acorn is a tiny, fast JavaScript parser written in JavaScript, + * created by Marijn Haverbeke and released under an MIT license. + * + */ + +var paper = function(self, undefined) { + +self = self || require('./node/self.js'); +var window = self.window, + document = self.document; + +var Base = new function() { + var hidden = /^(statics|enumerable|beans|preserve)$/, + array = [], + slice = array.slice, + create = Object.create, + describe = Object.getOwnPropertyDescriptor, + define = Object.defineProperty, + + forEach = array.forEach || function(iter, bind) { + for (var i = 0, l = this.length; i < l; i++) { + iter.call(bind, this[i], i, this); + } + }, + + forIn = function(iter, bind) { + for (var i in this) { + if (this.hasOwnProperty(i)) + iter.call(bind, this[i], i, this); + } + }, + + set = Object.assign || function(dst) { + for (var i = 1, l = arguments.length; i < l; i++) { + var src = arguments[i]; + for (var key in src) { + if (src.hasOwnProperty(key)) + dst[key] = src[key]; + } + } + return dst; + }, + + each = function(obj, iter, bind) { + if (obj) { + var desc = describe(obj, 'length'); + (desc && typeof desc.value === 'number' ? forEach : forIn) + .call(obj, iter, bind = bind || obj); + } + return bind; + }; + + function inject(dest, src, enumerable, beans, preserve) { + var beansNames = {}; + + function field(name, val) { + val = val || (val = describe(src, name)) + && (val.get ? val : val.value); + if (typeof val === 'string' && val[0] === '#') + val = dest[val.substring(1)] || val; + var isFunc = typeof val === 'function', + res = val, + prev = preserve || isFunc && !val.base + ? (val && val.get ? name in dest : dest[name]) + : null, + bean; + if (!preserve || !prev) { + if (isFunc && prev) + val.base = prev; + if (isFunc && beans !== false + && (bean = name.match(/^([gs]et|is)(([A-Z])(.*))$/))) + beansNames[bean[3].toLowerCase() + bean[4]] = bean[2]; + if (!res || isFunc || !res.get || typeof res.get !== 'function' + || !Base.isPlainObject(res)) { + res = { value: res, writable: true }; + } + if ((describe(dest, name) + || { configurable: true }).configurable) { + res.configurable = true; + res.enumerable = enumerable != null ? enumerable : !bean; + } + define(dest, name, res); + } + } + if (src) { + for (var name in src) { + if (src.hasOwnProperty(name) && !hidden.test(name)) + field(name); + } + for (var name in beansNames) { + var part = beansNames[name], + set = dest['set' + part], + get = dest['get' + part] || set && dest['is' + part]; + if (get && (beans === true || get.length === 0)) + field(name, { get: get, set: set }); + } + } + return dest; + } + + function Base() { + for (var i = 0, l = arguments.length; i < l; i++) { + var src = arguments[i]; + if (src) + set(this, src); + } + return this; + } + + return inject(Base, { + inject: function(src) { + if (src) { + var statics = src.statics === true ? src : src.statics, + beans = src.beans, + preserve = src.preserve; + if (statics !== src) + inject(this.prototype, src, src.enumerable, beans, preserve); + inject(this, statics, null, beans, preserve); + } + for (var i = 1, l = arguments.length; i < l; i++) + this.inject(arguments[i]); + return this; + }, + + extend: function() { + var base = this, + ctor, + proto; + for (var i = 0, obj, l = arguments.length; + i < l && !(ctor && proto); i++) { + obj = arguments[i]; + ctor = ctor || obj.initialize; + proto = proto || obj.prototype; + } + ctor = ctor || function() { + base.apply(this, arguments); + }; + proto = ctor.prototype = proto || create(this.prototype); + define(proto, 'constructor', + { value: ctor, writable: true, configurable: true }); + inject(ctor, this); + if (arguments.length) + this.inject.apply(ctor, arguments); + ctor.base = base; + return ctor; + } + }).inject({ + enumerable: false, + + initialize: Base, + + set: Base, + + inject: function() { + for (var i = 0, l = arguments.length; i < l; i++) { + var src = arguments[i]; + if (src) { + inject(this, src, src.enumerable, src.beans, src.preserve); + } + } + return this; + }, + + extend: function() { + var res = create(this); + return res.inject.apply(res, arguments); + }, + + each: function(iter, bind) { + return each(this, iter, bind); + }, + + clone: function() { + return new this.constructor(this); + }, + + statics: { + set: set, + each: each, + create: create, + define: define, + describe: describe, + + clone: function(obj) { + return set(new obj.constructor(), obj); + }, + + isPlainObject: function(obj) { + var ctor = obj != null && obj.constructor; + return ctor && (ctor === Object || ctor === Base + || ctor.name === 'Object'); + }, + + pick: function(a, b) { + return a !== undefined ? a : b; + }, + + slice: function(list, begin, end) { + return slice.call(list, begin, end); + } + } + }); +}; + +if (typeof module !== 'undefined') + module.exports = Base; + +Base.inject({ + enumerable: false, + + toString: function() { + return this._id != null + ? (this._class || 'Object') + (this._name + ? " '" + this._name + "'" + : ' @' + this._id) + : '{ ' + Base.each(this, function(value, key) { + if (!/^_/.test(key)) { + var type = typeof value; + this.push(key + ': ' + (type === 'number' + ? Formatter.instance.number(value) + : type === 'string' ? "'" + value + "'" : value)); + } + }, []).join(', ') + ' }'; + }, + + getClassName: function() { + return this._class || ''; + }, + + importJSON: function(json) { + return Base.importJSON(json, this); + }, + + exportJSON: function(options) { + return Base.exportJSON(this, options); + }, + + toJSON: function() { + return Base.serialize(this); + }, + + set: function(props, exclude) { + if (props) + Base.filter(this, props, exclude, this._prioritize); + return this; + } +}, { + +beans: false, +statics: { + exports: {}, + + extend: function extend() { + var res = extend.base.apply(this, arguments), + name = res.prototype._class; + if (name && !Base.exports[name]) + Base.exports[name] = res; + return res; + }, + + equals: function(obj1, obj2) { + if (obj1 === obj2) + return true; + if (obj1 && obj1.equals) + return obj1.equals(obj2); + if (obj2 && obj2.equals) + return obj2.equals(obj1); + if (obj1 && obj2 + && typeof obj1 === 'object' && typeof obj2 === 'object') { + if (Array.isArray(obj1) && Array.isArray(obj2)) { + var length = obj1.length; + if (length !== obj2.length) + return false; + while (length--) { + if (!Base.equals(obj1[length], obj2[length])) + return false; + } + } else { + var keys = Object.keys(obj1), + length = keys.length; + if (length !== Object.keys(obj2).length) + return false; + while (length--) { + var key = keys[length]; + if (!(obj2.hasOwnProperty(key) + && Base.equals(obj1[key], obj2[key]))) + return false; + } + } + return true; + } + return false; + }, + + read: function(list, start, options, amount) { + if (this === Base) { + var value = this.peek(list, start); + list.__index++; + return value; + } + var proto = this.prototype, + readIndex = proto._readIndex, + begin = start || readIndex && list.__index || 0, + length = list.length, + obj = list[begin]; + amount = amount || length - begin; + if (obj instanceof this + || options && options.readNull && obj == null && amount <= 1) { + if (readIndex) + list.__index = begin + 1; + return obj && options && options.clone ? obj.clone() : obj; + } + obj = Base.create(proto); + if (readIndex) + obj.__read = true; + obj = obj.initialize.apply(obj, begin > 0 || begin + amount < length + ? Base.slice(list, begin, begin + amount) + : list) || obj; + if (readIndex) { + list.__index = begin + obj.__read; + var filtered = obj.__filtered; + if (filtered) { + list.__filtered = filtered; + obj.__filtered = undefined; + } + obj.__read = undefined; + } + return obj; + }, + + peek: function(list, start) { + return list[list.__index = start || list.__index || 0]; + }, + + remain: function(list) { + return list.length - (list.__index || 0); + }, + + readList: function(list, start, options, amount) { + var res = [], + entry, + begin = start || 0, + end = amount ? begin + amount : list.length; + for (var i = begin; i < end; i++) { + res.push(Array.isArray(entry = list[i]) + ? this.read(entry, 0, options) + : this.read(list, i, options, 1)); + } + return res; + }, + + readNamed: function(list, name, start, options, amount) { + var value = this.getNamed(list, name), + hasObject = value !== undefined; + if (hasObject) { + var filtered = list.__filtered; + if (!filtered) { + filtered = list.__filtered = Base.create(list[0]); + filtered.__unfiltered = list[0]; + } + filtered[name] = undefined; + } + var l = hasObject ? [value] : list, + res = this.read(l, start, options, amount); + return res; + }, + + getNamed: function(list, name) { + var arg = list[0]; + if (list._hasObject === undefined) + list._hasObject = list.length === 1 && Base.isPlainObject(arg); + if (list._hasObject) + return name ? arg[name] : list.__filtered || arg; + }, + + hasNamed: function(list, name) { + return !!this.getNamed(list, name); + }, + + filter: function(dest, source, exclude, prioritize) { + var processed; + + function handleKey(key) { + if (!(exclude && key in exclude) && + !(processed && key in processed)) { + var value = source[key]; + if (value !== undefined) + dest[key] = value; + } + } + + if (prioritize) { + var keys = {}; + for (var i = 0, key, l = prioritize.length; i < l; i++) { + if ((key = prioritize[i]) in source) { + handleKey(key); + keys[key] = true; + } + } + processed = keys; + } + + Object.keys(source.__unfiltered || source).forEach(handleKey); + return dest; + }, + + isPlainValue: function(obj, asString) { + return Base.isPlainObject(obj) || Array.isArray(obj) + || asString && typeof obj === 'string'; + }, + + serialize: function(obj, options, compact, dictionary) { + options = options || {}; + + var isRoot = !dictionary, + res; + if (isRoot) { + options.formatter = new Formatter(options.precision); + dictionary = { + length: 0, + definitions: {}, + references: {}, + add: function(item, create) { + var id = '#' + item._id, + ref = this.references[id]; + if (!ref) { + this.length++; + var res = create.call(item), + name = item._class; + if (name && res[0] !== name) + res.unshift(name); + this.definitions[id] = res; + ref = this.references[id] = [id]; + } + return ref; + } + }; + } + if (obj && obj._serialize) { + res = obj._serialize(options, dictionary); + var name = obj._class; + if (name && !obj._compactSerialize && (isRoot || !compact) + && res[0] !== name) { + res.unshift(name); + } + } else if (Array.isArray(obj)) { + res = []; + for (var i = 0, l = obj.length; i < l; i++) + res[i] = Base.serialize(obj[i], options, compact, dictionary); + } else if (Base.isPlainObject(obj)) { + res = {}; + var keys = Object.keys(obj); + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + res[key] = Base.serialize(obj[key], options, compact, + dictionary); + } + } else if (typeof obj === 'number') { + res = options.formatter.number(obj, options.precision); + } else { + res = obj; + } + return isRoot && dictionary.length > 0 + ? [['dictionary', dictionary.definitions], res] + : res; + }, + + deserialize: function(json, create, _data, _setDictionary, _isRoot) { + var res = json, + isFirst = !_data, + hasDictionary = isFirst && json && json.length + && json[0][0] === 'dictionary'; + _data = _data || {}; + if (Array.isArray(json)) { + var type = json[0], + isDictionary = type === 'dictionary'; + if (json.length == 1 && /^#/.test(type)) { + return _data.dictionary[type]; + } + type = Base.exports[type]; + res = []; + for (var i = type ? 1 : 0, l = json.length; i < l; i++) { + res.push(Base.deserialize(json[i], create, _data, + isDictionary, hasDictionary)); + } + if (type) { + var args = res; + if (create) { + res = create(type, args, isFirst || _isRoot); + } else { + res = Base.create(type.prototype); + type.apply(res, args); + } + } + } else if (Base.isPlainObject(json)) { + res = {}; + if (_setDictionary) + _data.dictionary = res; + for (var key in json) + res[key] = Base.deserialize(json[key], create, _data); + } + return hasDictionary ? res[1] : res; + }, + + exportJSON: function(obj, options) { + var json = Base.serialize(obj, options); + return options && options.asString == false + ? json + : JSON.stringify(json); + }, + + importJSON: function(json, target) { + return Base.deserialize( + typeof json === 'string' ? JSON.parse(json) : json, + function(ctor, args, isRoot) { + var useTarget = isRoot && target + && target.constructor === ctor, + obj = useTarget ? target + : Base.create(ctor.prototype); + if (args.length === 1 && obj instanceof Item + && (useTarget || !(obj instanceof Layer))) { + var arg = args[0]; + if (Base.isPlainObject(arg)) + arg.insert = false; + } + (useTarget ? obj.set : ctor).apply(obj, args); + if (useTarget) + target = null; + return obj; + }); + }, + + splice: function(list, items, index, remove) { + var amount = items && items.length, + append = index === undefined; + index = append ? list.length : index; + if (index > list.length) + index = list.length; + for (var i = 0; i < amount; i++) + items[i]._index = index + i; + if (append) { + list.push.apply(list, items); + return []; + } else { + var args = [index, remove]; + if (items) + args.push.apply(args, items); + var removed = list.splice.apply(list, args); + for (var i = 0, l = removed.length; i < l; i++) + removed[i]._index = undefined; + for (var i = index + amount, l = list.length; i < l; i++) + list[i]._index = i; + return removed; + } + }, + + capitalize: function(str) { + return str.replace(/\b[a-z]/g, function(match) { + return match.toUpperCase(); + }); + }, + + camelize: function(str) { + return str.replace(/-(.)/g, function(match, chr) { + return chr.toUpperCase(); + }); + }, + + hyphenate: function(str) { + return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); + } +}}); + +var Emitter = { + on: function(type, func) { + if (typeof type !== 'string') { + Base.each(type, function(value, key) { + this.on(key, value); + }, this); + } else { + var types = this._eventTypes, + entry = types && types[type], + handlers = this._callbacks = this._callbacks || {}; + handlers = handlers[type] = handlers[type] || []; + if (handlers.indexOf(func) === -1) { + handlers.push(func); + if (entry && entry.install && handlers.length === 1) + entry.install.call(this, type); + } + } + return this; + }, + + off: function(type, func) { + if (typeof type !== 'string') { + Base.each(type, function(value, key) { + this.off(key, value); + }, this); + return; + } + var types = this._eventTypes, + entry = types && types[type], + handlers = this._callbacks && this._callbacks[type], + index; + if (handlers) { + if (!func || (index = handlers.indexOf(func)) !== -1 + && handlers.length === 1) { + if (entry && entry.uninstall) + entry.uninstall.call(this, type); + delete this._callbacks[type]; + } else if (index !== -1) { + handlers.splice(index, 1); + } + } + return this; + }, + + once: function(type, func) { + return this.on(type, function() { + func.apply(this, arguments); + this.off(type, func); + }); + }, + + emit: function(type, event) { + var handlers = this._callbacks && this._callbacks[type]; + if (!handlers) + return false; + var args = Base.slice(arguments, 1), + setTarget = event && event.target && !event.currentTarget; + handlers = handlers.slice(); + if (setTarget) + event.currentTarget = this; + for (var i = 0, l = handlers.length; i < l; i++) { + if (handlers[i].apply(this, args) == false) { + if (event && event.stop) + event.stop(); + break; + } + } + if (setTarget) + delete event.currentTarget; + return true; + }, + + responds: function(type) { + return !!(this._callbacks && this._callbacks[type]); + }, + + attach: '#on', + detach: '#off', + fire: '#emit', + + _installEvents: function(install) { + var types = this._eventTypes, + handlers = this._callbacks, + key = install ? 'install' : 'uninstall'; + if (types) { + for (var type in handlers) { + if (handlers[type].length > 0) { + var entry = types[type], + func = entry && entry[key]; + if (func) + func.call(this, type); + } + } + } + }, + + statics: { + inject: function inject(src) { + var events = src._events; + if (events) { + var types = {}; + Base.each(events, function(entry, key) { + var isString = typeof entry === 'string', + name = isString ? entry : key, + part = Base.capitalize(name), + type = name.substring(2).toLowerCase(); + types[type] = isString ? {} : entry; + name = '_' + name; + src['get' + part] = function() { + return this[name]; + }; + src['set' + part] = function(func) { + var prev = this[name]; + if (prev) + this.off(type, prev); + if (func) + this.on(type, func); + this[name] = func; + }; + }); + src._eventTypes = types; + } + return inject.base.apply(this, arguments); + } + } +}; + +var PaperScope = Base.extend({ + _class: 'PaperScope', + + initialize: function PaperScope() { + paper = this; + this.settings = new Base({ + applyMatrix: true, + insertItems: true, + handleSize: 4, + hitTolerance: 0 + }); + this.project = null; + this.projects = []; + this.tools = []; + this._id = PaperScope._id++; + PaperScope._scopes[this._id] = this; + var proto = PaperScope.prototype; + if (!this.support) { + var ctx = CanvasProvider.getContext(1, 1) || {}; + proto.support = { + nativeDash: 'setLineDash' in ctx || 'mozDash' in ctx, + nativeBlendModes: BlendMode.nativeModes + }; + CanvasProvider.release(ctx); + } + if (!this.agent) { + var user = self.navigator.userAgent.toLowerCase(), + os = (/(darwin|win|mac|linux|freebsd|sunos)/.exec(user)||[])[0], + platform = os === 'darwin' ? 'mac' : os, + agent = proto.agent = proto.browser = { platform: platform }; + if (platform) + agent[platform] = true; + user.replace( + /(opera|chrome|safari|webkit|firefox|msie|trident|atom|node)\/?\s*([.\d]+)(?:.*version\/([.\d]+))?(?:.*rv\:v?([.\d]+))?/g, + function(match, n, v1, v2, rv) { + if (!agent.chrome) { + var v = n === 'opera' ? v2 : + /^(node|trident)$/.test(n) ? rv : v1; + agent.version = v; + agent.versionNumber = parseFloat(v); + n = n === 'trident' ? 'msie' : n; + agent.name = n; + agent[n] = true; + } + } + ); + if (agent.chrome) + delete agent.webkit; + if (agent.atom) + delete agent.chrome; + } + }, + + version: "0.11.5", + + getView: function() { + var project = this.project; + return project && project._view; + }, + + getPaper: function() { + return this; + }, + + execute: function(code, options) { + paper.PaperScript.execute(code, this, options); + View.updateFocus(); + }, + + install: function(scope) { + var that = this; + Base.each(['project', 'view', 'tool'], function(key) { + Base.define(scope, key, { + configurable: true, + get: function() { + return that[key]; + } + }); + }); + for (var key in this) + if (!/^_/.test(key) && this[key]) + scope[key] = this[key]; + }, + + setup: function(element) { + paper = this; + this.project = new Project(element); + return this; + }, + + createCanvas: function(width, height) { + return CanvasProvider.getCanvas(width, height); + }, + + activate: function() { + paper = this; + }, + + clear: function() { + var projects = this.projects, + tools = this.tools; + for (var i = projects.length - 1; i >= 0; i--) + projects[i].remove(); + for (var i = tools.length - 1; i >= 0; i--) + tools[i].remove(); + }, + + remove: function() { + this.clear(); + delete PaperScope._scopes[this._id]; + }, + + statics: new function() { + function handleAttribute(name) { + name += 'Attribute'; + return function(el, attr) { + return el[name](attr) || el[name]('data-paper-' + attr); + }; + } + + return { + _scopes: {}, + _id: 0, + + get: function(id) { + return this._scopes[id] || null; + }, + + getAttribute: handleAttribute('get'), + hasAttribute: handleAttribute('has') + }; + } +}); + +var PaperScopeItem = Base.extend(Emitter, { + + initialize: function(activate) { + this._scope = paper; + this._index = this._scope[this._list].push(this) - 1; + if (activate || !this._scope[this._reference]) + this.activate(); + }, + + activate: function() { + if (!this._scope) + return false; + var prev = this._scope[this._reference]; + if (prev && prev !== this) + prev.emit('deactivate'); + this._scope[this._reference] = this; + this.emit('activate', prev); + return true; + }, + + isActive: function() { + return this._scope[this._reference] === this; + }, + + remove: function() { + if (this._index == null) + return false; + Base.splice(this._scope[this._list], null, this._index, 1); + if (this._scope[this._reference] == this) + this._scope[this._reference] = null; + this._scope = null; + return true; + }, + + getView: function() { + return this._scope.getView(); + } +}); + +var Formatter = Base.extend({ + initialize: function(precision) { + this.precision = Base.pick(precision, 5); + this.multiplier = Math.pow(10, this.precision); + }, + + number: function(val) { + return this.precision < 16 + ? Math.round(val * this.multiplier) / this.multiplier : val; + }, + + pair: function(val1, val2, separator) { + return this.number(val1) + (separator || ',') + this.number(val2); + }, + + point: function(val, separator) { + return this.number(val.x) + (separator || ',') + this.number(val.y); + }, + + size: function(val, separator) { + return this.number(val.width) + (separator || ',') + + this.number(val.height); + }, + + rectangle: function(val, separator) { + return this.point(val, separator) + (separator || ',') + + this.size(val, separator); + } +}); + +Formatter.instance = new Formatter(); + +var Numerical = new function() { + + var abscissas = [ + [ 0.5773502691896257645091488], + [0,0.7745966692414833770358531], + [ 0.3399810435848562648026658,0.8611363115940525752239465], + [0,0.5384693101056830910363144,0.9061798459386639927976269], + [ 0.2386191860831969086305017,0.6612093864662645136613996,0.9324695142031520278123016], + [0,0.4058451513773971669066064,0.7415311855993944398638648,0.9491079123427585245261897], + [ 0.1834346424956498049394761,0.5255324099163289858177390,0.7966664774136267395915539,0.9602898564975362316835609], + [0,0.3242534234038089290385380,0.6133714327005903973087020,0.8360311073266357942994298,0.9681602395076260898355762], + [ 0.1488743389816312108848260,0.4333953941292471907992659,0.6794095682990244062343274,0.8650633666889845107320967,0.9739065285171717200779640], + [0,0.2695431559523449723315320,0.5190961292068118159257257,0.7301520055740493240934163,0.8870625997680952990751578,0.9782286581460569928039380], + [ 0.1252334085114689154724414,0.3678314989981801937526915,0.5873179542866174472967024,0.7699026741943046870368938,0.9041172563704748566784659,0.9815606342467192506905491], + [0,0.2304583159551347940655281,0.4484927510364468528779129,0.6423493394403402206439846,0.8015780907333099127942065,0.9175983992229779652065478,0.9841830547185881494728294], + [ 0.1080549487073436620662447,0.3191123689278897604356718,0.5152486363581540919652907,0.6872929048116854701480198,0.8272013150697649931897947,0.9284348836635735173363911,0.9862838086968123388415973], + [0,0.2011940939974345223006283,0.3941513470775633698972074,0.5709721726085388475372267,0.7244177313601700474161861,0.8482065834104272162006483,0.9372733924007059043077589,0.9879925180204854284895657], + [ 0.0950125098376374401853193,0.2816035507792589132304605,0.4580167776572273863424194,0.6178762444026437484466718,0.7554044083550030338951012,0.8656312023878317438804679,0.9445750230732325760779884,0.9894009349916499325961542] + ]; + + var weights = [ + [1], + [0.8888888888888888888888889,0.5555555555555555555555556], + [0.6521451548625461426269361,0.3478548451374538573730639], + [0.5688888888888888888888889,0.4786286704993664680412915,0.2369268850561890875142640], + [0.4679139345726910473898703,0.3607615730481386075698335,0.1713244923791703450402961], + [0.4179591836734693877551020,0.3818300505051189449503698,0.2797053914892766679014678,0.1294849661688696932706114], + [0.3626837833783619829651504,0.3137066458778872873379622,0.2223810344533744705443560,0.1012285362903762591525314], + [0.3302393550012597631645251,0.3123470770400028400686304,0.2606106964029354623187429,0.1806481606948574040584720,0.0812743883615744119718922], + [0.2955242247147528701738930,0.2692667193099963550912269,0.2190863625159820439955349,0.1494513491505805931457763,0.0666713443086881375935688], + [0.2729250867779006307144835,0.2628045445102466621806889,0.2331937645919904799185237,0.1862902109277342514260976,0.1255803694649046246346943,0.0556685671161736664827537], + [0.2491470458134027850005624,0.2334925365383548087608499,0.2031674267230659217490645,0.1600783285433462263346525,0.1069393259953184309602547,0.0471753363865118271946160], + [0.2325515532308739101945895,0.2262831802628972384120902,0.2078160475368885023125232,0.1781459807619457382800467,0.1388735102197872384636018,0.0921214998377284479144218,0.0404840047653158795200216], + [0.2152638534631577901958764,0.2051984637212956039659241,0.1855383974779378137417166,0.1572031671581935345696019,0.1215185706879031846894148,0.0801580871597602098056333,0.0351194603317518630318329], + [0.2025782419255612728806202,0.1984314853271115764561183,0.1861610000155622110268006,0.1662692058169939335532009,0.1395706779261543144478048,0.1071592204671719350118695,0.0703660474881081247092674,0.0307532419961172683546284], + [0.1894506104550684962853967,0.1826034150449235888667637,0.1691565193950025381893121,0.1495959888165767320815017,0.1246289712555338720524763,0.0951585116824927848099251,0.0622535239386478928628438,0.0271524594117540948517806] + ]; + + var abs = Math.abs, + sqrt = Math.sqrt, + pow = Math.pow, + log2 = Math.log2 || function(x) { + return Math.log(x) * Math.LOG2E; + }, + EPSILON = 1e-12, + MACHINE_EPSILON = 1.12e-16; + + function clamp(value, min, max) { + return value < min ? min : value > max ? max : value; + } + + function getDiscriminant(a, b, c) { + function split(v) { + var x = v * 134217729, + y = v - x, + hi = y + x, + lo = v - hi; + return [hi, lo]; + } + + var D = b * b - a * c, + E = b * b + a * c; + if (abs(D) * 3 < E) { + var ad = split(a), + bd = split(b), + cd = split(c), + p = b * b, + dp = (bd[0] * bd[0] - p + 2 * bd[0] * bd[1]) + bd[1] * bd[1], + q = a * c, + dq = (ad[0] * cd[0] - q + ad[0] * cd[1] + ad[1] * cd[0]) + + ad[1] * cd[1]; + D = (p - q) + (dp - dq); + } + return D; + } + + function getNormalizationFactor() { + var norm = Math.max.apply(Math, arguments); + return norm && (norm < 1e-8 || norm > 1e8) + ? pow(2, -Math.round(log2(norm))) + : 0; + } + + return { + EPSILON: EPSILON, + MACHINE_EPSILON: MACHINE_EPSILON, + CURVETIME_EPSILON: 1e-8, + GEOMETRIC_EPSILON: 1e-7, + TRIGONOMETRIC_EPSILON: 1e-8, + KAPPA: 4 * (sqrt(2) - 1) / 3, + + isZero: function(val) { + return val >= -EPSILON && val <= EPSILON; + }, + + clamp: clamp, + + integrate: function(f, a, b, n) { + var x = abscissas[n - 2], + w = weights[n - 2], + A = (b - a) * 0.5, + B = A + a, + i = 0, + m = (n + 1) >> 1, + sum = n & 1 ? w[i++] * f(B) : 0; + while (i < m) { + var Ax = A * x[i]; + sum += w[i++] * (f(B + Ax) + f(B - Ax)); + } + return A * sum; + }, + + findRoot: function(f, df, x, a, b, n, tolerance) { + for (var i = 0; i < n; i++) { + var fx = f(x), + dx = fx / df(x), + nx = x - dx; + if (abs(dx) < tolerance) { + x = nx; + break; + } + if (fx > 0) { + b = x; + x = nx <= a ? (a + b) * 0.5 : nx; + } else { + a = x; + x = nx >= b ? (a + b) * 0.5 : nx; + } + } + return clamp(x, a, b); + }, + + solveQuadratic: function(a, b, c, roots, min, max) { + var x1, x2 = Infinity; + if (abs(a) < EPSILON) { + if (abs(b) < EPSILON) + return abs(c) < EPSILON ? -1 : 0; + x1 = -c / b; + } else { + b *= -0.5; + var D = getDiscriminant(a, b, c); + if (D && abs(D) < MACHINE_EPSILON) { + var f = getNormalizationFactor(abs(a), abs(b), abs(c)); + if (f) { + a *= f; + b *= f; + c *= f; + D = getDiscriminant(a, b, c); + } + } + if (D >= -MACHINE_EPSILON) { + var Q = D < 0 ? 0 : sqrt(D), + R = b + (b < 0 ? -Q : Q); + if (R === 0) { + x1 = c / a; + x2 = -x1; + } else { + x1 = R / a; + x2 = c / R; + } + } + } + var count = 0, + boundless = min == null, + minB = min - EPSILON, + maxB = max + EPSILON; + if (isFinite(x1) && (boundless || x1 > minB && x1 < maxB)) + roots[count++] = boundless ? x1 : clamp(x1, min, max); + if (x2 !== x1 + && isFinite(x2) && (boundless || x2 > minB && x2 < maxB)) + roots[count++] = boundless ? x2 : clamp(x2, min, max); + return count; + }, + + solveCubic: function(a, b, c, d, roots, min, max) { + var f = getNormalizationFactor(abs(a), abs(b), abs(c), abs(d)), + x, b1, c2, qd, q; + if (f) { + a *= f; + b *= f; + c *= f; + d *= f; + } + + function evaluate(x0) { + x = x0; + var tmp = a * x; + b1 = tmp + b; + c2 = b1 * x + c; + qd = (tmp + b1) * x + c2; + q = c2 * x + d; + } + + if (abs(a) < EPSILON) { + a = b; + b1 = c; + c2 = d; + x = Infinity; + } else if (abs(d) < EPSILON) { + b1 = b; + c2 = c; + x = 0; + } else { + evaluate(-(b / a) / 3); + var t = q / a, + r = pow(abs(t), 1/3), + s = t < 0 ? -1 : 1, + td = -qd / a, + rd = td > 0 ? 1.324717957244746 * Math.max(r, sqrt(td)) : r, + x0 = x - s * rd; + if (x0 !== x) { + do { + evaluate(x0); + x0 = qd === 0 ? x : x - q / qd / (1 + MACHINE_EPSILON); + } while (s * x0 > s * x); + if (abs(a) * x * x > abs(d / x)) { + c2 = -d / x; + b1 = (c2 - c) / x; + } + } + } + var count = Numerical.solveQuadratic(a, b1, c2, roots, min, max), + boundless = min == null; + if (isFinite(x) && (count === 0 + || count > 0 && x !== roots[0] && x !== roots[1]) + && (boundless || x > min - EPSILON && x < max + EPSILON)) + roots[count++] = boundless ? x : clamp(x, min, max); + return count; + } + }; +}; + +var UID = { + _id: 1, + _pools: {}, + + get: function(name) { + if (name) { + var pool = this._pools[name]; + if (!pool) + pool = this._pools[name] = { _id: 1 }; + return pool._id++; + } else { + return this._id++; + } + } +}; + +var Point = Base.extend({ + _class: 'Point', + _readIndex: true, + + initialize: function Point(arg0, arg1) { + var type = typeof arg0, + reading = this.__read, + read = 0; + if (type === 'number') { + var hasY = typeof arg1 === 'number'; + this._set(arg0, hasY ? arg1 : arg0); + if (reading) + read = hasY ? 2 : 1; + } else if (type === 'undefined' || arg0 === null) { + this._set(0, 0); + if (reading) + read = arg0 === null ? 1 : 0; + } else { + var obj = type === 'string' ? arg0.split(/[\s,]+/) || [] : arg0; + read = 1; + if (Array.isArray(obj)) { + this._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0])); + } else if ('x' in obj) { + this._set(obj.x || 0, obj.y || 0); + } else if ('width' in obj) { + this._set(obj.width || 0, obj.height || 0); + } else if ('angle' in obj) { + this._set(obj.length || 0, 0); + this.setAngle(obj.angle || 0); + } else { + this._set(0, 0); + read = 0; + } + } + if (reading) + this.__read = read; + return this; + }, + + set: '#initialize', + + _set: function(x, y) { + this.x = x; + this.y = y; + return this; + }, + + equals: function(point) { + return this === point || point + && (this.x === point.x && this.y === point.y + || Array.isArray(point) + && this.x === point[0] && this.y === point[1]) + || false; + }, + + clone: function() { + return new Point(this.x, this.y); + }, + + toString: function() { + var f = Formatter.instance; + return '{ x: ' + f.number(this.x) + ', y: ' + f.number(this.y) + ' }'; + }, + + _serialize: function(options) { + var f = options.formatter; + return [f.number(this.x), f.number(this.y)]; + }, + + getLength: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + + setLength: function(length) { + if (this.isZero()) { + var angle = this._angle || 0; + this._set( + Math.cos(angle) * length, + Math.sin(angle) * length + ); + } else { + var scale = length / this.getLength(); + if (Numerical.isZero(scale)) + this.getAngle(); + this._set( + this.x * scale, + this.y * scale + ); + } + }, + getAngle: function() { + return this.getAngleInRadians.apply(this, arguments) * 180 / Math.PI; + }, + + setAngle: function(angle) { + this.setAngleInRadians.call(this, angle * Math.PI / 180); + }, + + getAngleInDegrees: '#getAngle', + setAngleInDegrees: '#setAngle', + + getAngleInRadians: function() { + if (!arguments.length) { + return this.isZero() + ? this._angle || 0 + : this._angle = Math.atan2(this.y, this.x); + } else { + var point = Point.read(arguments), + div = this.getLength() * point.getLength(); + if (Numerical.isZero(div)) { + return NaN; + } else { + var a = this.dot(point) / div; + return Math.acos(a < -1 ? -1 : a > 1 ? 1 : a); + } + } + }, + + setAngleInRadians: function(angle) { + this._angle = angle; + if (!this.isZero()) { + var length = this.getLength(); + this._set( + Math.cos(angle) * length, + Math.sin(angle) * length + ); + } + }, + + getQuadrant: function() { + return this.x >= 0 ? this.y >= 0 ? 1 : 4 : this.y >= 0 ? 2 : 3; + } +}, { + beans: false, + + getDirectedAngle: function() { + var point = Point.read(arguments); + return Math.atan2(this.cross(point), this.dot(point)) * 180 / Math.PI; + }, + + getDistance: function() { + var point = Point.read(arguments), + x = point.x - this.x, + y = point.y - this.y, + d = x * x + y * y, + squared = Base.read(arguments); + return squared ? d : Math.sqrt(d); + }, + + normalize: function(length) { + if (length === undefined) + length = 1; + var current = this.getLength(), + scale = current !== 0 ? length / current : 0, + point = new Point(this.x * scale, this.y * scale); + if (scale >= 0) + point._angle = this._angle; + return point; + }, + + rotate: function(angle, center) { + if (angle === 0) + return this.clone(); + angle = angle * Math.PI / 180; + var point = center ? this.subtract(center) : this, + sin = Math.sin(angle), + cos = Math.cos(angle); + point = new Point( + point.x * cos - point.y * sin, + point.x * sin + point.y * cos + ); + return center ? point.add(center) : point; + }, + + transform: function(matrix) { + return matrix ? matrix._transformPoint(this) : this; + }, + + add: function() { + var point = Point.read(arguments); + return new Point(this.x + point.x, this.y + point.y); + }, + + subtract: function() { + var point = Point.read(arguments); + return new Point(this.x - point.x, this.y - point.y); + }, + + multiply: function() { + var point = Point.read(arguments); + return new Point(this.x * point.x, this.y * point.y); + }, + + divide: function() { + var point = Point.read(arguments); + return new Point(this.x / point.x, this.y / point.y); + }, + + modulo: function() { + var point = Point.read(arguments); + return new Point(this.x % point.x, this.y % point.y); + }, + + negate: function() { + return new Point(-this.x, -this.y); + }, + + isInside: function() { + return Rectangle.read(arguments).contains(this); + }, + + isClose: function() { + var point = Point.read(arguments), + tolerance = Base.read(arguments); + return this.getDistance(point) <= tolerance; + }, + + isCollinear: function() { + var point = Point.read(arguments); + return Point.isCollinear(this.x, this.y, point.x, point.y); + }, + + isColinear: '#isCollinear', + + isOrthogonal: function() { + var point = Point.read(arguments); + return Point.isOrthogonal(this.x, this.y, point.x, point.y); + }, + + isZero: function() { + var isZero = Numerical.isZero; + return isZero(this.x) && isZero(this.y); + }, + + isNaN: function() { + return isNaN(this.x) || isNaN(this.y); + }, + + isInQuadrant: function(q) { + return this.x * (q > 1 && q < 4 ? -1 : 1) >= 0 + && this.y * (q > 2 ? -1 : 1) >= 0; + }, + + dot: function() { + var point = Point.read(arguments); + return this.x * point.x + this.y * point.y; + }, + + cross: function() { + var point = Point.read(arguments); + return this.x * point.y - this.y * point.x; + }, + + project: function() { + var point = Point.read(arguments), + scale = point.isZero() ? 0 : this.dot(point) / point.dot(point); + return new Point( + point.x * scale, + point.y * scale + ); + }, + + statics: { + min: function() { + var point1 = Point.read(arguments), + point2 = Point.read(arguments); + return new Point( + Math.min(point1.x, point2.x), + Math.min(point1.y, point2.y) + ); + }, + + max: function() { + var point1 = Point.read(arguments), + point2 = Point.read(arguments); + return new Point( + Math.max(point1.x, point2.x), + Math.max(point1.y, point2.y) + ); + }, + + random: function() { + return new Point(Math.random(), Math.random()); + }, + + isCollinear: function(x1, y1, x2, y2) { + return Math.abs(x1 * y2 - y1 * x2) + <= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)) + * 1e-8; + }, + + isOrthogonal: function(x1, y1, x2, y2) { + return Math.abs(x1 * x2 + y1 * y2) + <= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)) + * 1e-8; + } + } +}, Base.each(['round', 'ceil', 'floor', 'abs'], function(key) { + var op = Math[key]; + this[key] = function() { + return new Point(op(this.x), op(this.y)); + }; +}, {})); + +var LinkedPoint = Point.extend({ + initialize: function Point(x, y, owner, setter) { + this._x = x; + this._y = y; + this._owner = owner; + this._setter = setter; + }, + + _set: function(x, y, _dontNotify) { + this._x = x; + this._y = y; + if (!_dontNotify) + this._owner[this._setter](this); + return this; + }, + + getX: function() { + return this._x; + }, + + setX: function(x) { + this._x = x; + this._owner[this._setter](this); + }, + + getY: function() { + return this._y; + }, + + setY: function(y) { + this._y = y; + this._owner[this._setter](this); + }, + + isSelected: function() { + return !!(this._owner._selection & this._getSelection()); + }, + + setSelected: function(selected) { + this._owner._changeSelection(this._getSelection(), selected); + }, + + _getSelection: function() { + return this._setter === 'setPosition' ? 4 : 0; + } +}); + +var Size = Base.extend({ + _class: 'Size', + _readIndex: true, + + initialize: function Size(arg0, arg1) { + var type = typeof arg0, + reading = this.__read, + read = 0; + if (type === 'number') { + var hasHeight = typeof arg1 === 'number'; + this._set(arg0, hasHeight ? arg1 : arg0); + if (reading) + read = hasHeight ? 2 : 1; + } else if (type === 'undefined' || arg0 === null) { + this._set(0, 0); + if (reading) + read = arg0 === null ? 1 : 0; + } else { + var obj = type === 'string' ? arg0.split(/[\s,]+/) || [] : arg0; + read = 1; + if (Array.isArray(obj)) { + this._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0])); + } else if ('width' in obj) { + this._set(obj.width || 0, obj.height || 0); + } else if ('x' in obj) { + this._set(obj.x || 0, obj.y || 0); + } else { + this._set(0, 0); + read = 0; + } + } + if (reading) + this.__read = read; + return this; + }, + + set: '#initialize', + + _set: function(width, height) { + this.width = width; + this.height = height; + return this; + }, + + equals: function(size) { + return size === this || size && (this.width === size.width + && this.height === size.height + || Array.isArray(size) && this.width === size[0] + && this.height === size[1]) || false; + }, + + clone: function() { + return new Size(this.width, this.height); + }, + + toString: function() { + var f = Formatter.instance; + return '{ width: ' + f.number(this.width) + + ', height: ' + f.number(this.height) + ' }'; + }, + + _serialize: function(options) { + var f = options.formatter; + return [f.number(this.width), + f.number(this.height)]; + }, + + add: function() { + var size = Size.read(arguments); + return new Size(this.width + size.width, this.height + size.height); + }, + + subtract: function() { + var size = Size.read(arguments); + return new Size(this.width - size.width, this.height - size.height); + }, + + multiply: function() { + var size = Size.read(arguments); + return new Size(this.width * size.width, this.height * size.height); + }, + + divide: function() { + var size = Size.read(arguments); + return new Size(this.width / size.width, this.height / size.height); + }, + + modulo: function() { + var size = Size.read(arguments); + return new Size(this.width % size.width, this.height % size.height); + }, + + negate: function() { + return new Size(-this.width, -this.height); + }, + + isZero: function() { + var isZero = Numerical.isZero; + return isZero(this.width) && isZero(this.height); + }, + + isNaN: function() { + return isNaN(this.width) || isNaN(this.height); + }, + + statics: { + min: function(size1, size2) { + return new Size( + Math.min(size1.width, size2.width), + Math.min(size1.height, size2.height)); + }, + + max: function(size1, size2) { + return new Size( + Math.max(size1.width, size2.width), + Math.max(size1.height, size2.height)); + }, + + random: function() { + return new Size(Math.random(), Math.random()); + } + } +}, Base.each(['round', 'ceil', 'floor', 'abs'], function(key) { + var op = Math[key]; + this[key] = function() { + return new Size(op(this.width), op(this.height)); + }; +}, {})); + +var LinkedSize = Size.extend({ + initialize: function Size(width, height, owner, setter) { + this._width = width; + this._height = height; + this._owner = owner; + this._setter = setter; + }, + + _set: function(width, height, _dontNotify) { + this._width = width; + this._height = height; + if (!_dontNotify) + this._owner[this._setter](this); + return this; + }, + + getWidth: function() { + return this._width; + }, + + setWidth: function(width) { + this._width = width; + this._owner[this._setter](this); + }, + + getHeight: function() { + return this._height; + }, + + setHeight: function(height) { + this._height = height; + this._owner[this._setter](this); + } +}); + +var Rectangle = Base.extend({ + _class: 'Rectangle', + _readIndex: true, + beans: true, + + initialize: function Rectangle(arg0, arg1, arg2, arg3) { + var type = typeof arg0, + read; + if (type === 'number') { + this._set(arg0, arg1, arg2, arg3); + read = 4; + } else if (type === 'undefined' || arg0 === null) { + this._set(0, 0, 0, 0); + read = arg0 === null ? 1 : 0; + } else if (arguments.length === 1) { + if (Array.isArray(arg0)) { + this._set.apply(this, arg0); + read = 1; + } else if (arg0.x !== undefined || arg0.width !== undefined) { + this._set(arg0.x || 0, arg0.y || 0, + arg0.width || 0, arg0.height || 0); + read = 1; + } else if (arg0.from === undefined && arg0.to === undefined) { + this._set(0, 0, 0, 0); + Base.filter(this, arg0); + read = 1; + } + } + if (read === undefined) { + var frm = Point.readNamed(arguments, 'from'), + next = Base.peek(arguments), + x = frm.x, + y = frm.y, + width, + height; + if (next && next.x !== undefined + || Base.hasNamed(arguments, 'to')) { + var to = Point.readNamed(arguments, 'to'); + width = to.x - x; + height = to.y - y; + if (width < 0) { + x = to.x; + width = -width; + } + if (height < 0) { + y = to.y; + height = -height; + } + } else { + var size = Size.read(arguments); + width = size.width; + height = size.height; + } + this._set(x, y, width, height); + read = arguments.__index; + var filtered = arguments.__filtered; + if (filtered) + this.__filtered = filtered; + } + if (this.__read) + this.__read = read; + return this; + }, + + set: '#initialize', + + _set: function(x, y, width, height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + return this; + }, + + clone: function() { + return new Rectangle(this.x, this.y, this.width, this.height); + }, + + equals: function(rect) { + var rt = Base.isPlainValue(rect) + ? Rectangle.read(arguments) + : rect; + return rt === this + || rt && this.x === rt.x && this.y === rt.y + && this.width === rt.width && this.height === rt.height + || false; + }, + + toString: function() { + var f = Formatter.instance; + return '{ x: ' + f.number(this.x) + + ', y: ' + f.number(this.y) + + ', width: ' + f.number(this.width) + + ', height: ' + f.number(this.height) + + ' }'; + }, + + _serialize: function(options) { + var f = options.formatter; + return [f.number(this.x), + f.number(this.y), + f.number(this.width), + f.number(this.height)]; + }, + + getPoint: function(_dontLink) { + var ctor = _dontLink ? Point : LinkedPoint; + return new ctor(this.x, this.y, this, 'setPoint'); + }, + + setPoint: function() { + var point = Point.read(arguments); + this.x = point.x; + this.y = point.y; + }, + + getSize: function(_dontLink) { + var ctor = _dontLink ? Size : LinkedSize; + return new ctor(this.width, this.height, this, 'setSize'); + }, + + _fw: 1, + _fh: 1, + + setSize: function() { + var size = Size.read(arguments), + sx = this._sx, + sy = this._sy, + w = size.width, + h = size.height; + if (sx) { + this.x += (this.width - w) * sx; + } + if (sy) { + this.y += (this.height - h) * sy; + } + this.width = w; + this.height = h; + this._fw = this._fh = 1; + }, + + getLeft: function() { + return this.x; + }, + + setLeft: function(left) { + if (!this._fw) { + var amount = left - this.x; + this.width -= this._sx === 0.5 ? amount * 2 : amount; + } + this.x = left; + this._sx = this._fw = 0; + }, + + getTop: function() { + return this.y; + }, + + setTop: function(top) { + if (!this._fh) { + var amount = top - this.y; + this.height -= this._sy === 0.5 ? amount * 2 : amount; + } + this.y = top; + this._sy = this._fh = 0; + }, + + getRight: function() { + return this.x + this.width; + }, + + setRight: function(right) { + if (!this._fw) { + var amount = right - this.x; + this.width = this._sx === 0.5 ? amount * 2 : amount; + } + this.x = right - this.width; + this._sx = 1; + this._fw = 0; + }, + + getBottom: function() { + return this.y + this.height; + }, + + setBottom: function(bottom) { + if (!this._fh) { + var amount = bottom - this.y; + this.height = this._sy === 0.5 ? amount * 2 : amount; + } + this.y = bottom - this.height; + this._sy = 1; + this._fh = 0; + }, + + getCenterX: function() { + return this.x + this.width / 2; + }, + + setCenterX: function(x) { + if (this._fw || this._sx === 0.5) { + this.x = x - this.width / 2; + } else { + if (this._sx) { + this.x += (x - this.x) * 2 * this._sx; + } + this.width = (x - this.x) * 2; + } + this._sx = 0.5; + this._fw = 0; + }, + + getCenterY: function() { + return this.y + this.height / 2; + }, + + setCenterY: function(y) { + if (this._fh || this._sy === 0.5) { + this.y = y - this.height / 2; + } else { + if (this._sy) { + this.y += (y - this.y) * 2 * this._sy; + } + this.height = (y - this.y) * 2; + } + this._sy = 0.5; + this._fh = 0; + }, + + getCenter: function(_dontLink) { + var ctor = _dontLink ? Point : LinkedPoint; + return new ctor(this.getCenterX(), this.getCenterY(), this, 'setCenter'); + }, + + setCenter: function() { + var point = Point.read(arguments); + this.setCenterX(point.x); + this.setCenterY(point.y); + return this; + }, + + getArea: function() { + return this.width * this.height; + }, + + isEmpty: function() { + return this.width === 0 || this.height === 0; + }, + + contains: function(arg) { + return arg && arg.width !== undefined + || (Array.isArray(arg) ? arg : arguments).length === 4 + ? this._containsRectangle(Rectangle.read(arguments)) + : this._containsPoint(Point.read(arguments)); + }, + + _containsPoint: function(point) { + var x = point.x, + y = point.y; + return x >= this.x && y >= this.y + && x <= this.x + this.width + && y <= this.y + this.height; + }, + + _containsRectangle: function(rect) { + var x = rect.x, + y = rect.y; + return x >= this.x && y >= this.y + && x + rect.width <= this.x + this.width + && y + rect.height <= this.y + this.height; + }, + + intersects: function() { + var rect = Rectangle.read(arguments), + epsilon = Base.read(arguments) || 0; + return rect.x + rect.width > this.x - epsilon + && rect.y + rect.height > this.y - epsilon + && rect.x < this.x + this.width + epsilon + && rect.y < this.y + this.height + epsilon; + }, + + intersect: function() { + var rect = Rectangle.read(arguments), + x1 = Math.max(this.x, rect.x), + y1 = Math.max(this.y, rect.y), + x2 = Math.min(this.x + this.width, rect.x + rect.width), + y2 = Math.min(this.y + this.height, rect.y + rect.height); + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + }, + + unite: function() { + var rect = Rectangle.read(arguments), + x1 = Math.min(this.x, rect.x), + y1 = Math.min(this.y, rect.y), + x2 = Math.max(this.x + this.width, rect.x + rect.width), + y2 = Math.max(this.y + this.height, rect.y + rect.height); + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + }, + + include: function() { + var point = Point.read(arguments); + var x1 = Math.min(this.x, point.x), + y1 = Math.min(this.y, point.y), + x2 = Math.max(this.x + this.width, point.x), + y2 = Math.max(this.y + this.height, point.y); + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + }, + + expand: function() { + var amount = Size.read(arguments), + hor = amount.width, + ver = amount.height; + return new Rectangle(this.x - hor / 2, this.y - ver / 2, + this.width + hor, this.height + ver); + }, + + scale: function(hor, ver) { + return this.expand(this.width * hor - this.width, + this.height * (ver === undefined ? hor : ver) - this.height); + } +}, Base.each([ + ['Top', 'Left'], ['Top', 'Right'], + ['Bottom', 'Left'], ['Bottom', 'Right'], + ['Left', 'Center'], ['Top', 'Center'], + ['Right', 'Center'], ['Bottom', 'Center'] + ], + function(parts, index) { + var part = parts.join(''), + xFirst = /^[RL]/.test(part); + if (index >= 4) + parts[1] += xFirst ? 'Y' : 'X'; + var x = parts[xFirst ? 0 : 1], + y = parts[xFirst ? 1 : 0], + getX = 'get' + x, + getY = 'get' + y, + setX = 'set' + x, + setY = 'set' + y, + get = 'get' + part, + set = 'set' + part; + this[get] = function(_dontLink) { + var ctor = _dontLink ? Point : LinkedPoint; + return new ctor(this[getX](), this[getY](), this, set); + }; + this[set] = function() { + var point = Point.read(arguments); + this[setX](point.x); + this[setY](point.y); + }; + }, { + beans: true + } +)); + +var LinkedRectangle = Rectangle.extend({ + initialize: function Rectangle(x, y, width, height, owner, setter) { + this._set(x, y, width, height, true); + this._owner = owner; + this._setter = setter; + }, + + _set: function(x, y, width, height, _dontNotify) { + this._x = x; + this._y = y; + this._width = width; + this._height = height; + if (!_dontNotify) + this._owner[this._setter](this); + return this; + } +}, +new function() { + var proto = Rectangle.prototype; + + return Base.each(['x', 'y', 'width', 'height'], function(key) { + var part = Base.capitalize(key), + internal = '_' + key; + this['get' + part] = function() { + return this[internal]; + }; + + this['set' + part] = function(value) { + this[internal] = value; + if (!this._dontNotify) + this._owner[this._setter](this); + }; + }, Base.each(['Point', 'Size', 'Center', + 'Left', 'Top', 'Right', 'Bottom', 'CenterX', 'CenterY', + 'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight', + 'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'], + function(key) { + var name = 'set' + key; + this[name] = function() { + this._dontNotify = true; + proto[name].apply(this, arguments); + this._dontNotify = false; + this._owner[this._setter](this); + }; + }, { + isSelected: function() { + return !!(this._owner._selection & 2); + }, + + setSelected: function(selected) { + var owner = this._owner; + if (owner._changeSelection) { + owner._changeSelection(2, selected); + } + } + }) + ); +}); + +var Matrix = Base.extend({ + _class: 'Matrix', + + initialize: function Matrix(arg, _dontNotify) { + var count = arguments.length, + ok = true; + if (count >= 6) { + this._set.apply(this, arguments); + } else if (count === 1 || count === 2) { + if (arg instanceof Matrix) { + this._set(arg._a, arg._b, arg._c, arg._d, arg._tx, arg._ty, + _dontNotify); + } else if (Array.isArray(arg)) { + this._set.apply(this, + _dontNotify ? arg.concat([_dontNotify]) : arg); + } else { + ok = false; + } + } else if (!count) { + this.reset(); + } else { + ok = false; + } + if (!ok) { + throw new Error('Unsupported matrix parameters'); + } + return this; + }, + + set: '#initialize', + + _set: function(a, b, c, d, tx, ty, _dontNotify) { + this._a = a; + this._b = b; + this._c = c; + this._d = d; + this._tx = tx; + this._ty = ty; + if (!_dontNotify) + this._changed(); + return this; + }, + + _serialize: function(options, dictionary) { + return Base.serialize(this.getValues(), options, true, dictionary); + }, + + _changed: function() { + var owner = this._owner; + if (owner) { + if (owner._applyMatrix) { + owner.transform(null, true); + } else { + owner._changed(9); + } + } + }, + + clone: function() { + return new Matrix(this._a, this._b, this._c, this._d, + this._tx, this._ty); + }, + + equals: function(mx) { + return mx === this || mx && this._a === mx._a && this._b === mx._b + && this._c === mx._c && this._d === mx._d + && this._tx === mx._tx && this._ty === mx._ty; + }, + + toString: function() { + var f = Formatter.instance; + return '[[' + [f.number(this._a), f.number(this._c), + f.number(this._tx)].join(', ') + '], [' + + [f.number(this._b), f.number(this._d), + f.number(this._ty)].join(', ') + ']]'; + }, + + reset: function(_dontNotify) { + this._a = this._d = 1; + this._b = this._c = this._tx = this._ty = 0; + if (!_dontNotify) + this._changed(); + return this; + }, + + apply: function(recursively, _setApplyMatrix) { + var owner = this._owner; + if (owner) { + owner.transform(null, true, Base.pick(recursively, true), + _setApplyMatrix); + return this.isIdentity(); + } + return false; + }, + + translate: function() { + var point = Point.read(arguments), + x = point.x, + y = point.y; + this._tx += x * this._a + y * this._c; + this._ty += x * this._b + y * this._d; + this._changed(); + return this; + }, + + scale: function() { + var scale = Point.read(arguments), + center = Point.read(arguments, 0, { readNull: true }); + if (center) + this.translate(center); + this._a *= scale.x; + this._b *= scale.x; + this._c *= scale.y; + this._d *= scale.y; + if (center) + this.translate(center.negate()); + this._changed(); + return this; + }, + + rotate: function(angle ) { + angle *= Math.PI / 180; + var center = Point.read(arguments, 1), + x = center.x, + y = center.y, + cos = Math.cos(angle), + sin = Math.sin(angle), + tx = x - x * cos + y * sin, + ty = y - x * sin - y * cos, + a = this._a, + b = this._b, + c = this._c, + d = this._d; + this._a = cos * a + sin * c; + this._b = cos * b + sin * d; + this._c = -sin * a + cos * c; + this._d = -sin * b + cos * d; + this._tx += tx * a + ty * c; + this._ty += tx * b + ty * d; + this._changed(); + return this; + }, + + shear: function() { + var shear = Point.read(arguments), + center = Point.read(arguments, 0, { readNull: true }); + if (center) + this.translate(center); + var a = this._a, + b = this._b; + this._a += shear.y * this._c; + this._b += shear.y * this._d; + this._c += shear.x * a; + this._d += shear.x * b; + if (center) + this.translate(center.negate()); + this._changed(); + return this; + }, + + skew: function() { + var skew = Point.read(arguments), + center = Point.read(arguments, 0, { readNull: true }), + toRadians = Math.PI / 180, + shear = new Point(Math.tan(skew.x * toRadians), + Math.tan(skew.y * toRadians)); + return this.shear(shear, center); + }, + + append: function(mx, _dontNotify) { + if (mx) { + var a1 = this._a, + b1 = this._b, + c1 = this._c, + d1 = this._d, + a2 = mx._a, + b2 = mx._c, + c2 = mx._b, + d2 = mx._d, + tx2 = mx._tx, + ty2 = mx._ty; + this._a = a2 * a1 + c2 * c1; + this._c = b2 * a1 + d2 * c1; + this._b = a2 * b1 + c2 * d1; + this._d = b2 * b1 + d2 * d1; + this._tx += tx2 * a1 + ty2 * c1; + this._ty += tx2 * b1 + ty2 * d1; + if (!_dontNotify) + this._changed(); + } + return this; + }, + + prepend: function(mx, _dontNotify) { + if (mx) { + var a1 = this._a, + b1 = this._b, + c1 = this._c, + d1 = this._d, + tx1 = this._tx, + ty1 = this._ty, + a2 = mx._a, + b2 = mx._c, + c2 = mx._b, + d2 = mx._d, + tx2 = mx._tx, + ty2 = mx._ty; + this._a = a2 * a1 + b2 * b1; + this._c = a2 * c1 + b2 * d1; + this._b = c2 * a1 + d2 * b1; + this._d = c2 * c1 + d2 * d1; + this._tx = a2 * tx1 + b2 * ty1 + tx2; + this._ty = c2 * tx1 + d2 * ty1 + ty2; + if (!_dontNotify) + this._changed(); + } + return this; + }, + + appended: function(mx) { + return this.clone().append(mx); + }, + + prepended: function(mx) { + return this.clone().prepend(mx); + }, + + invert: function() { + var a = this._a, + b = this._b, + c = this._c, + d = this._d, + tx = this._tx, + ty = this._ty, + det = a * d - b * c, + res = null; + if (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) { + this._a = d / det; + this._b = -b / det; + this._c = -c / det; + this._d = a / det; + this._tx = (c * ty - d * tx) / det; + this._ty = (b * tx - a * ty) / det; + res = this; + } + return res; + }, + + inverted: function() { + return this.clone().invert(); + }, + + concatenate: '#append', + preConcatenate: '#prepend', + chain: '#appended', + + _shiftless: function() { + return new Matrix(this._a, this._b, this._c, this._d, 0, 0); + }, + + _orNullIfIdentity: function() { + return this.isIdentity() ? null : this; + }, + + isIdentity: function() { + return this._a === 1 && this._b === 0 && this._c === 0 && this._d === 1 + && this._tx === 0 && this._ty === 0; + }, + + isInvertible: function() { + var det = this._a * this._d - this._c * this._b; + return det && !isNaN(det) && isFinite(this._tx) && isFinite(this._ty); + }, + + isSingular: function() { + return !this.isInvertible(); + }, + + transform: function( src, dst, count) { + return arguments.length < 3 + ? this._transformPoint(Point.read(arguments)) + : this._transformCoordinates(src, dst, count); + }, + + _transformPoint: function(point, dest, _dontNotify) { + var x = point.x, + y = point.y; + if (!dest) + dest = new Point(); + return dest._set( + x * this._a + y * this._c + this._tx, + x * this._b + y * this._d + this._ty, + _dontNotify); + }, + + _transformCoordinates: function(src, dst, count) { + for (var i = 0, max = 2 * count; i < max; i += 2) { + var x = src[i], + y = src[i + 1]; + dst[i] = x * this._a + y * this._c + this._tx; + dst[i + 1] = x * this._b + y * this._d + this._ty; + } + return dst; + }, + + _transformCorners: function(rect) { + var x1 = rect.x, + y1 = rect.y, + x2 = x1 + rect.width, + y2 = y1 + rect.height, + coords = [ x1, y1, x2, y1, x2, y2, x1, y2 ]; + return this._transformCoordinates(coords, coords, 4); + }, + + _transformBounds: function(bounds, dest, _dontNotify) { + var coords = this._transformCorners(bounds), + min = coords.slice(0, 2), + max = min.slice(); + for (var i = 2; i < 8; i++) { + var val = coords[i], + j = i & 1; + if (val < min[j]) { + min[j] = val; + } else if (val > max[j]) { + max[j] = val; + } + } + if (!dest) + dest = new Rectangle(); + return dest._set(min[0], min[1], max[0] - min[0], max[1] - min[1], + _dontNotify); + }, + + inverseTransform: function() { + return this._inverseTransform(Point.read(arguments)); + }, + + _inverseTransform: function(point, dest, _dontNotify) { + var a = this._a, + b = this._b, + c = this._c, + d = this._d, + tx = this._tx, + ty = this._ty, + det = a * d - b * c, + res = null; + if (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) { + var x = point.x - this._tx, + y = point.y - this._ty; + if (!dest) + dest = new Point(); + res = dest._set( + (x * d - y * c) / det, + (y * a - x * b) / det, + _dontNotify); + } + return res; + }, + + decompose: function() { + var a = this._a, + b = this._b, + c = this._c, + d = this._d, + det = a * d - b * c, + sqrt = Math.sqrt, + atan2 = Math.atan2, + degrees = 180 / Math.PI, + rotate, + scale, + skew; + if (a !== 0 || b !== 0) { + var r = sqrt(a * a + b * b); + rotate = Math.acos(a / r) * (b > 0 ? 1 : -1); + scale = [r, det / r]; + skew = [atan2(a * c + b * d, r * r), 0]; + } else if (c !== 0 || d !== 0) { + var s = sqrt(c * c + d * d); + rotate = Math.asin(c / s) * (d > 0 ? 1 : -1); + scale = [det / s, s]; + skew = [0, atan2(a * c + b * d, s * s)]; + } else { + rotate = 0; + skew = scale = [0, 0]; + } + return { + translation: this.getTranslation(), + rotation: rotate * degrees, + scaling: new Point(scale), + skewing: new Point(skew[0] * degrees, skew[1] * degrees) + }; + }, + + getValues: function() { + return [ this._a, this._b, this._c, this._d, this._tx, this._ty ]; + }, + + getTranslation: function() { + return new Point(this._tx, this._ty); + }, + + getScaling: function() { + return (this.decompose() || {}).scaling; + }, + + getRotation: function() { + return (this.decompose() || {}).rotation; + }, + + applyToContext: function(ctx) { + if (!this.isIdentity()) { + ctx.transform(this._a, this._b, this._c, this._d, + this._tx, this._ty); + } + } +}, Base.each(['a', 'b', 'c', 'd', 'tx', 'ty'], function(key) { + var part = Base.capitalize(key), + prop = '_' + key; + this['get' + part] = function() { + return this[prop]; + }; + this['set' + part] = function(value) { + this[prop] = value; + this._changed(); + }; +}, {})); + +var Line = Base.extend({ + _class: 'Line', + + initialize: function Line(arg0, arg1, arg2, arg3, arg4) { + var asVector = false; + if (arguments.length >= 4) { + this._px = arg0; + this._py = arg1; + this._vx = arg2; + this._vy = arg3; + asVector = arg4; + } else { + this._px = arg0.x; + this._py = arg0.y; + this._vx = arg1.x; + this._vy = arg1.y; + asVector = arg2; + } + if (!asVector) { + this._vx -= this._px; + this._vy -= this._py; + } + }, + + getPoint: function() { + return new Point(this._px, this._py); + }, + + getVector: function() { + return new Point(this._vx, this._vy); + }, + + getLength: function() { + return this.getVector().getLength(); + }, + + intersect: function(line, isInfinite) { + return Line.intersect( + this._px, this._py, this._vx, this._vy, + line._px, line._py, line._vx, line._vy, + true, isInfinite); + }, + + getSide: function(point, isInfinite) { + return Line.getSide( + this._px, this._py, this._vx, this._vy, + point.x, point.y, true, isInfinite); + }, + + getDistance: function(point) { + return Math.abs(this.getSignedDistance(point)); + }, + + getSignedDistance: function(point) { + return Line.getSignedDistance(this._px, this._py, this._vx, this._vy, + point.x, point.y, true); + }, + + isCollinear: function(line) { + return Point.isCollinear(this._vx, this._vy, line._vx, line._vy); + }, + + isOrthogonal: function(line) { + return Point.isOrthogonal(this._vx, this._vy, line._vx, line._vy); + }, + + statics: { + intersect: function(p1x, p1y, v1x, v1y, p2x, p2y, v2x, v2y, asVector, + isInfinite) { + if (!asVector) { + v1x -= p1x; + v1y -= p1y; + v2x -= p2x; + v2y -= p2y; + } + var cross = v1x * v2y - v1y * v2x; + if (!Numerical.isZero(cross)) { + var dx = p1x - p2x, + dy = p1y - p2y, + u1 = (v2x * dy - v2y * dx) / cross, + u2 = (v1x * dy - v1y * dx) / cross, + epsilon = 1e-12, + uMin = -epsilon, + uMax = 1 + epsilon; + if (isInfinite + || uMin < u1 && u1 < uMax && uMin < u2 && u2 < uMax) { + if (!isInfinite) { + u1 = u1 <= 0 ? 0 : u1 >= 1 ? 1 : u1; + } + return new Point( + p1x + u1 * v1x, + p1y + u1 * v1y); + } + } + }, + + getSide: function(px, py, vx, vy, x, y, asVector, isInfinite) { + if (!asVector) { + vx -= px; + vy -= py; + } + var v2x = x - px, + v2y = y - py, + ccw = v2x * vy - v2y * vx; + if (!isInfinite && Numerical.isZero(ccw)) { + ccw = (v2x * vx + v2x * vx) / (vx * vx + vy * vy); + if (ccw >= 0 && ccw <= 1) + ccw = 0; + } + return ccw < 0 ? -1 : ccw > 0 ? 1 : 0; + }, + + getSignedDistance: function(px, py, vx, vy, x, y, asVector) { + if (!asVector) { + vx -= px; + vy -= py; + } + return vx === 0 ? vy > 0 ? x - px : px - x + : vy === 0 ? vx < 0 ? y - py : py - y + : ((x-px) * vy - (y-py) * vx) / Math.sqrt(vx * vx + vy * vy); + }, + + getDistance: function(px, py, vx, vy, x, y, asVector) { + return Math.abs( + Line.getSignedDistance(px, py, vx, vy, x, y, asVector)); + } + } +}); + +var Project = PaperScopeItem.extend({ + _class: 'Project', + _list: 'projects', + _reference: 'project', + _compactSerialize: true, + + initialize: function Project(element) { + PaperScopeItem.call(this, true); + this._children = []; + this._namedChildren = {}; + this._activeLayer = null; + this._currentStyle = new Style(null, null, this); + this._view = View.create(this, + element || CanvasProvider.getCanvas(1, 1)); + this._selectionItems = {}; + this._selectionCount = 0; + this._updateVersion = 0; + }, + + _serialize: function(options, dictionary) { + return Base.serialize(this._children, options, true, dictionary); + }, + + _changed: function(flags, item) { + if (flags & 1) { + var view = this._view; + if (view) { + view._needsUpdate = true; + if (!view._requested && view._autoUpdate) + view.requestUpdate(); + } + } + var changes = this._changes; + if (changes && item) { + var changesById = this._changesById, + id = item._id, + entry = changesById[id]; + if (entry) { + entry.flags |= flags; + } else { + changes.push(changesById[id] = { item: item, flags: flags }); + } + } + }, + + clear: function() { + var children = this._children; + for (var i = children.length - 1; i >= 0; i--) + children[i].remove(); + }, + + isEmpty: function() { + return !this._children.length; + }, + + remove: function remove() { + if (!remove.base.call(this)) + return false; + if (this._view) + this._view.remove(); + return true; + }, + + getView: function() { + return this._view; + }, + + getCurrentStyle: function() { + return this._currentStyle; + }, + + setCurrentStyle: function(style) { + this._currentStyle.set(style); + }, + + getIndex: function() { + return this._index; + }, + + getOptions: function() { + return this._scope.settings; + }, + + getLayers: function() { + return this._children; + }, + + getActiveLayer: function() { + return this._activeLayer || new Layer({ project: this, insert: true }); + }, + + getSymbolDefinitions: function() { + var definitions = [], + ids = {}; + this.getItems({ + class: SymbolItem, + match: function(item) { + var definition = item._definition, + id = definition._id; + if (!ids[id]) { + ids[id] = true; + definitions.push(definition); + } + return false; + } + }); + return definitions; + }, + + getSymbols: 'getSymbolDefinitions', + + getSelectedItems: function() { + var selectionItems = this._selectionItems, + items = []; + for (var id in selectionItems) { + var item = selectionItems[id], + selection = item._selection; + if ((selection & 1) && item.isInserted()) { + items.push(item); + } else if (!selection) { + this._updateSelection(item); + } + } + return items; + }, + + _updateSelection: function(item) { + var id = item._id, + selectionItems = this._selectionItems; + if (item._selection) { + if (selectionItems[id] !== item) { + this._selectionCount++; + selectionItems[id] = item; + } + } else if (selectionItems[id] === item) { + this._selectionCount--; + delete selectionItems[id]; + } + }, + + selectAll: function() { + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) + children[i].setFullySelected(true); + }, + + deselectAll: function() { + var selectionItems = this._selectionItems; + for (var i in selectionItems) + selectionItems[i].setFullySelected(false); + }, + + addLayer: function(layer) { + return this.insertLayer(undefined, layer); + }, + + insertLayer: function(index, layer) { + if (layer instanceof Layer) { + layer._remove(false, true); + Base.splice(this._children, [layer], index, 0); + layer._setProject(this, true); + var name = layer._name; + if (name) + layer.setName(name); + if (this._changes) + layer._changed(5); + if (!this._activeLayer) + this._activeLayer = layer; + } else { + layer = null; + } + return layer; + }, + + _insertItem: function(index, item, _created) { + item = this.insertLayer(index, item) + || (this._activeLayer || this._insertItem(undefined, + new Layer(Item.NO_INSERT), true)) + .insertChild(index, item); + if (_created && item.activate) + item.activate(); + return item; + }, + + getItems: function(options) { + return Item._getItems(this, options); + }, + + getItem: function(options) { + return Item._getItems(this, options, null, null, true)[0] || null; + }, + + importJSON: function(json) { + this.activate(); + var layer = this._activeLayer; + return Base.importJSON(json, layer && layer.isEmpty() && layer); + }, + + removeOn: function(type) { + var sets = this._removeSets; + if (sets) { + if (type === 'mouseup') + sets.mousedrag = null; + var set = sets[type]; + if (set) { + for (var id in set) { + var item = set[id]; + for (var key in sets) { + var other = sets[key]; + if (other && other != set) + delete other[item._id]; + } + item.remove(); + } + sets[type] = null; + } + } + }, + + draw: function(ctx, matrix, pixelRatio) { + this._updateVersion++; + ctx.save(); + matrix.applyToContext(ctx); + var children = this._children, + param = new Base({ + offset: new Point(0, 0), + pixelRatio: pixelRatio, + viewMatrix: matrix.isIdentity() ? null : matrix, + matrices: [new Matrix()], + updateMatrix: true + }); + for (var i = 0, l = children.length; i < l; i++) { + children[i].draw(ctx, param); + } + ctx.restore(); + + if (this._selectionCount > 0) { + ctx.save(); + ctx.strokeWidth = 1; + var items = this._selectionItems, + size = this._scope.settings.handleSize, + version = this._updateVersion; + for (var id in items) { + items[id]._drawSelection(ctx, matrix, size, items, version); + } + ctx.restore(); + } + } +}); + +var Item = Base.extend(Emitter, { + statics: { + extend: function extend(src) { + if (src._serializeFields) + src._serializeFields = Base.set({}, + this.prototype._serializeFields, src._serializeFields); + return extend.base.apply(this, arguments); + }, + + NO_INSERT: { insert: false } + }, + + _class: 'Item', + _name: null, + _applyMatrix: true, + _canApplyMatrix: true, + _canScaleStroke: false, + _pivot: null, + _visible: true, + _blendMode: 'normal', + _opacity: 1, + _locked: false, + _guide: false, + _clipMask: false, + _selection: 0, + _selectBounds: true, + _selectChildren: false, + _serializeFields: { + name: null, + applyMatrix: null, + matrix: new Matrix(), + pivot: null, + visible: true, + blendMode: 'normal', + opacity: 1, + locked: false, + guide: false, + clipMask: false, + selected: false, + data: {} + }, + _prioritize: ['applyMatrix'] +}, +new function() { + var handlers = ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onClick', + 'onDoubleClick', 'onMouseMove', 'onMouseEnter', 'onMouseLeave']; + return Base.each(handlers, + function(name) { + this._events[name] = { + install: function(type) { + this.getView()._countItemEvent(type, 1); + }, + + uninstall: function(type) { + this.getView()._countItemEvent(type, -1); + } + }; + }, { + _events: { + onFrame: { + install: function() { + this.getView()._animateItem(this, true); + }, + + uninstall: function() { + this.getView()._animateItem(this, false); + } + }, + + onLoad: {}, + onError: {} + }, + statics: { + _itemHandlers: handlers + } + } + ); +}, { + initialize: function Item() { + }, + + _initialize: function(props, point) { + var hasProps = props && Base.isPlainObject(props), + internal = hasProps && props.internal === true, + matrix = this._matrix = new Matrix(), + project = hasProps && props.project || paper.project, + settings = paper.settings; + this._id = internal ? null : UID.get(); + this._parent = this._index = null; + this._applyMatrix = this._canApplyMatrix && settings.applyMatrix; + if (point) + matrix.translate(point); + matrix._owner = this; + this._style = new Style(project._currentStyle, this, project); + if (internal || hasProps && props.insert == false + || !settings.insertItems && !(hasProps && props.insert === true)) { + this._setProject(project); + } else { + (hasProps && props.parent || project) + ._insertItem(undefined, this, true); + } + if (hasProps && props !== Item.NO_INSERT) { + this.set(props, { + internal: true, insert: true, project: true, parent: true + }); + } + return hasProps; + }, + + _serialize: function(options, dictionary) { + var props = {}, + that = this; + + function serialize(fields) { + for (var key in fields) { + var value = that[key]; + if (!Base.equals(value, key === 'leading' + ? fields.fontSize * 1.2 : fields[key])) { + props[key] = Base.serialize(value, options, + key !== 'data', dictionary); + } + } + } + + serialize(this._serializeFields); + if (!(this instanceof Group)) + serialize(this._style._defaults); + return [ this._class, props ]; + }, + + _changed: function(flags) { + var symbol = this._symbol, + cacheParent = this._parent || symbol, + project = this._project; + if (flags & 8) { + this._bounds = this._position = this._decomposed = + this._globalMatrix = undefined; + } + if (cacheParent + && (flags & 40)) { + Item._clearBoundsCache(cacheParent); + } + if (flags & 2) { + Item._clearBoundsCache(this); + } + if (project) + project._changed(flags, this); + if (symbol) + symbol._changed(flags); + }, + + getId: function() { + return this._id; + }, + + getName: function() { + return this._name; + }, + + setName: function(name) { + + if (this._name) + this._removeNamed(); + if (name === (+name) + '') + throw new Error( + 'Names consisting only of numbers are not supported.'); + var owner = this._getOwner(); + if (name && owner) { + var children = owner._children, + namedChildren = owner._namedChildren; + (namedChildren[name] = namedChildren[name] || []).push(this); + if (!(name in children)) + children[name] = this; + } + this._name = name || undefined; + this._changed(128); + }, + + getStyle: function() { + return this._style; + }, + + setStyle: function(style) { + this.getStyle().set(style); + } +}, Base.each(['locked', 'visible', 'blendMode', 'opacity', 'guide'], + function(name) { + var part = Base.capitalize(name), + key = '_' + name, + flags = { + locked: 128, + visible: 137 + }; + this['get' + part] = function() { + return this[key]; + }; + this['set' + part] = function(value) { + if (value != this[key]) { + this[key] = value; + this._changed(flags[name] || 129); + } + }; + }, +{}), { + beans: true, + + getSelection: function() { + return this._selection; + }, + + setSelection: function(selection) { + if (selection !== this._selection) { + this._selection = selection; + var project = this._project; + if (project) { + project._updateSelection(this); + this._changed(129); + } + } + }, + + _changeSelection: function(flag, selected) { + var selection = this._selection; + this.setSelection(selected ? selection | flag : selection & ~flag); + }, + + isSelected: function() { + if (this._selectChildren) { + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) + if (children[i].isSelected()) + return true; + } + return !!(this._selection & 1); + }, + + setSelected: function(selected) { + if (this._selectChildren) { + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) + children[i].setSelected(selected); + } + this._changeSelection(1, selected); + }, + + isFullySelected: function() { + var children = this._children, + selected = !!(this._selection & 1); + if (children && selected) { + for (var i = 0, l = children.length; i < l; i++) + if (!children[i].isFullySelected()) + return false; + return true; + } + return selected; + }, + + setFullySelected: function(selected) { + var children = this._children; + if (children) { + for (var i = 0, l = children.length; i < l; i++) + children[i].setFullySelected(selected); + } + this._changeSelection(1, selected); + }, + + isClipMask: function() { + return this._clipMask; + }, + + setClipMask: function(clipMask) { + if (this._clipMask != (clipMask = !!clipMask)) { + this._clipMask = clipMask; + if (clipMask) { + this.setFillColor(null); + this.setStrokeColor(null); + } + this._changed(129); + if (this._parent) + this._parent._changed(1024); + } + }, + + getData: function() { + if (!this._data) + this._data = {}; + return this._data; + }, + + setData: function(data) { + this._data = data; + }, + + getPosition: function(_dontLink) { + var position = this._position, + ctor = _dontLink ? Point : LinkedPoint; + if (!position) { + var pivot = this._pivot; + position = this._position = pivot + ? this._matrix._transformPoint(pivot) + : this.getBounds().getCenter(true); + } + return new ctor(position.x, position.y, this, 'setPosition'); + }, + + setPosition: function() { + this.translate(Point.read(arguments).subtract(this.getPosition(true))); + }, + + getPivot: function() { + var pivot = this._pivot; + return pivot + ? new LinkedPoint(pivot.x, pivot.y, this, 'setPivot') + : null; + }, + + setPivot: function() { + this._pivot = Point.read(arguments, 0, { clone: true, readNull: true }); + this._position = undefined; + } +}, Base.each({ + getStrokeBounds: { stroke: true }, + getHandleBounds: { handle: true }, + getInternalBounds: { internal: true } + }, + function(options, key) { + this[key] = function(matrix) { + return this.getBounds(matrix, options); + }; + }, +{ + beans: true, + + getBounds: function(matrix, options) { + var hasMatrix = options || matrix instanceof Matrix, + opts = Base.set({}, hasMatrix ? options : matrix, + this._boundsOptions); + if (!opts.stroke || this.getStrokeScaling()) + opts.cacheItem = this; + var rect = this._getCachedBounds(hasMatrix && matrix, opts).rect; + return !arguments.length + ? new LinkedRectangle(rect.x, rect.y, rect.width, rect.height, + this, 'setBounds') + : rect; + }, + + setBounds: function() { + var rect = Rectangle.read(arguments), + bounds = this.getBounds(), + _matrix = this._matrix, + matrix = new Matrix(), + center = rect.getCenter(); + matrix.translate(center); + if (rect.width != bounds.width || rect.height != bounds.height) { + if (!_matrix.isInvertible()) { + _matrix.set(_matrix._backup + || new Matrix().translate(_matrix.getTranslation())); + bounds = this.getBounds(); + } + matrix.scale( + bounds.width !== 0 ? rect.width / bounds.width : 0, + bounds.height !== 0 ? rect.height / bounds.height : 0); + } + center = bounds.getCenter(); + matrix.translate(-center.x, -center.y); + this.transform(matrix); + }, + + _getBounds: function(matrix, options) { + var children = this._children; + if (!children || !children.length) + return new Rectangle(); + Item._updateBoundsCache(this, options.cacheItem); + return Item._getBounds(children, matrix, options); + }, + + _getBoundsCacheKey: function(options, internal) { + return [ + options.stroke ? 1 : 0, + options.handle ? 1 : 0, + internal ? 1 : 0 + ].join(''); + }, + + _getCachedBounds: function(matrix, options, noInternal) { + matrix = matrix && matrix._orNullIfIdentity(); + var internal = options.internal && !noInternal, + cacheItem = options.cacheItem, + _matrix = internal ? null : this._matrix._orNullIfIdentity(), + cacheKey = cacheItem && (!matrix || matrix.equals(_matrix)) + && this._getBoundsCacheKey(options, internal), + bounds = this._bounds; + Item._updateBoundsCache(this._parent || this._symbol, cacheItem); + if (cacheKey && bounds && cacheKey in bounds) { + var cached = bounds[cacheKey]; + return { + rect: cached.rect.clone(), + nonscaling: cached.nonscaling + }; + } + var res = this._getBounds(matrix || _matrix, options), + rect = res.rect || res, + style = this._style, + nonscaling = res.nonscaling || style.hasStroke() + && !style.getStrokeScaling(); + if (cacheKey) { + if (!bounds) { + this._bounds = bounds = {}; + } + var cached = bounds[cacheKey] = { + rect: rect.clone(), + nonscaling: nonscaling, + internal: internal + }; + } + return { + rect: rect, + nonscaling: nonscaling + }; + }, + + _getStrokeMatrix: function(matrix, options) { + var parent = this.getStrokeScaling() ? null + : options && options.internal ? this + : this._parent || this._symbol && this._symbol._item, + mx = parent ? parent.getViewMatrix().invert() : matrix; + return mx && mx._shiftless(); + }, + + statics: { + _updateBoundsCache: function(parent, item) { + if (parent && item) { + var id = item._id, + ref = parent._boundsCache = parent._boundsCache || { + ids: {}, + list: [] + }; + if (!ref.ids[id]) { + ref.list.push(item); + ref.ids[id] = item; + } + } + }, + + _clearBoundsCache: function(item) { + var cache = item._boundsCache; + if (cache) { + item._bounds = item._position = item._boundsCache = undefined; + for (var i = 0, list = cache.list, l = list.length; i < l; i++){ + var other = list[i]; + if (other !== item) { + other._bounds = other._position = undefined; + if (other._boundsCache) + Item._clearBoundsCache(other); + } + } + } + }, + + _getBounds: function(items, matrix, options) { + var x1 = Infinity, + x2 = -x1, + y1 = x1, + y2 = x2, + nonscaling = false; + options = options || {}; + for (var i = 0, l = items.length; i < l; i++) { + var item = items[i]; + if (item._visible && !item.isEmpty()) { + var bounds = item._getCachedBounds( + matrix && matrix.appended(item._matrix), options, true), + rect = bounds.rect; + x1 = Math.min(rect.x, x1); + y1 = Math.min(rect.y, y1); + x2 = Math.max(rect.x + rect.width, x2); + y2 = Math.max(rect.y + rect.height, y2); + if (bounds.nonscaling) + nonscaling = true; + } + } + return { + rect: isFinite(x1) + ? new Rectangle(x1, y1, x2 - x1, y2 - y1) + : new Rectangle(), + nonscaling: nonscaling + }; + } + } + +}), { + beans: true, + + _decompose: function() { + return this._applyMatrix + ? null + : this._decomposed || (this._decomposed = this._matrix.decompose()); + }, + + getRotation: function() { + var decomposed = this._decompose(); + return decomposed ? decomposed.rotation : 0; + }, + + setRotation: function(rotation) { + var current = this.getRotation(); + if (current != null && rotation != null) { + var decomposed = this._decomposed; + this.rotate(rotation - current); + if (decomposed) { + decomposed.rotation = rotation; + this._decomposed = decomposed; + } + } + }, + + getScaling: function() { + var decomposed = this._decompose(), + s = decomposed && decomposed.scaling; + return new LinkedPoint(s ? s.x : 1, s ? s.y : 1, this, 'setScaling'); + }, + + setScaling: function() { + var current = this.getScaling(), + scaling = Point.read(arguments, 0, { clone: true, readNull: true }); + if (current && scaling && !current.equals(scaling)) { + var rotation = this.getRotation(), + decomposed = this._decomposed, + matrix = new Matrix(), + center = this.getPosition(true); + matrix.translate(center); + if (rotation) + matrix.rotate(rotation); + matrix.scale(scaling.x / current.x, scaling.y / current.y); + if (rotation) + matrix.rotate(-rotation); + matrix.translate(center.negate()); + this.transform(matrix); + if (decomposed) { + decomposed.scaling = scaling; + this._decomposed = decomposed; + } + } + }, + + getMatrix: function() { + return this._matrix; + }, + + setMatrix: function() { + var matrix = this._matrix; + matrix.initialize.apply(matrix, arguments); + }, + + getGlobalMatrix: function(_dontClone) { + var matrix = this._globalMatrix, + updateVersion = this._project._updateVersion; + if (matrix && matrix._updateVersion !== updateVersion) + matrix = null; + if (!matrix) { + matrix = this._globalMatrix = this._matrix.clone(); + var parent = this._parent; + if (parent) + matrix.prepend(parent.getGlobalMatrix(true)); + matrix._updateVersion = updateVersion; + } + return _dontClone ? matrix : matrix.clone(); + }, + + getViewMatrix: function() { + return this.getGlobalMatrix().prepend(this.getView()._matrix); + }, + + getApplyMatrix: function() { + return this._applyMatrix; + }, + + setApplyMatrix: function(apply) { + if (this._applyMatrix = this._canApplyMatrix && !!apply) + this.transform(null, true); + }, + + getTransformContent: '#getApplyMatrix', + setTransformContent: '#setApplyMatrix', +}, { + getProject: function() { + return this._project; + }, + + _setProject: function(project, installEvents) { + if (this._project !== project) { + if (this._project) + this._installEvents(false); + this._project = project; + var children = this._children; + for (var i = 0, l = children && children.length; i < l; i++) + children[i]._setProject(project); + installEvents = true; + } + if (installEvents) + this._installEvents(true); + }, + + getView: function() { + return this._project._view; + }, + + _installEvents: function _installEvents(install) { + _installEvents.base.call(this, install); + var children = this._children; + for (var i = 0, l = children && children.length; i < l; i++) + children[i]._installEvents(install); + }, + + getLayer: function() { + var parent = this; + while (parent = parent._parent) { + if (parent instanceof Layer) + return parent; + } + return null; + }, + + getParent: function() { + return this._parent; + }, + + setParent: function(item) { + return item.addChild(this); + }, + + _getOwner: '#getParent', + + getChildren: function() { + return this._children; + }, + + setChildren: function(items) { + this.removeChildren(); + this.addChildren(items); + }, + + getFirstChild: function() { + return this._children && this._children[0] || null; + }, + + getLastChild: function() { + return this._children && this._children[this._children.length - 1] + || null; + }, + + getNextSibling: function() { + var owner = this._getOwner(); + return owner && owner._children[this._index + 1] || null; + }, + + getPreviousSibling: function() { + var owner = this._getOwner(); + return owner && owner._children[this._index - 1] || null; + }, + + getIndex: function() { + return this._index; + }, + + equals: function(item) { + return item === this || item && this._class === item._class + && this._style.equals(item._style) + && this._matrix.equals(item._matrix) + && this._locked === item._locked + && this._visible === item._visible + && this._blendMode === item._blendMode + && this._opacity === item._opacity + && this._clipMask === item._clipMask + && this._guide === item._guide + && this._equals(item) + || false; + }, + + _equals: function(item) { + return Base.equals(this._children, item._children); + }, + + clone: function(options) { + var copy = new this.constructor(Item.NO_INSERT), + children = this._children, + insert = Base.pick(options ? options.insert : undefined, + options === undefined || options === true), + deep = Base.pick(options ? options.deep : undefined, true); + if (children) + copy.copyAttributes(this); + if (!children || deep) + copy.copyContent(this); + if (!children) + copy.copyAttributes(this); + if (insert) + copy.insertAbove(this); + var name = this._name, + parent = this._parent; + if (name && parent) { + var children = parent._children, + orig = name, + i = 1; + while (children[name]) + name = orig + ' ' + (i++); + if (name !== orig) + copy.setName(name); + } + return copy; + }, + + copyContent: function(source) { + var children = source._children; + for (var i = 0, l = children && children.length; i < l; i++) { + this.addChild(children[i].clone(false), true); + } + }, + + copyAttributes: function(source, excludeMatrix) { + this.setStyle(source._style); + var keys = ['_locked', '_visible', '_blendMode', '_opacity', + '_clipMask', '_guide']; + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + if (source.hasOwnProperty(key)) + this[key] = source[key]; + } + if (!excludeMatrix) + this._matrix.set(source._matrix, true); + this.setApplyMatrix(source._applyMatrix); + this.setPivot(source._pivot); + this.setSelection(source._selection); + var data = source._data, + name = source._name; + this._data = data ? Base.clone(data) : null; + if (name) + this.setName(name); + }, + + rasterize: function(resolution, insert) { + var bounds = this.getStrokeBounds(), + scale = (resolution || this.getView().getResolution()) / 72, + topLeft = bounds.getTopLeft().floor(), + bottomRight = bounds.getBottomRight().ceil(), + size = new Size(bottomRight.subtract(topLeft)), + raster = new Raster(Item.NO_INSERT); + if (!size.isZero()) { + var canvas = CanvasProvider.getCanvas(size.multiply(scale)), + ctx = canvas.getContext('2d'), + matrix = new Matrix().scale(scale).translate(topLeft.negate()); + ctx.save(); + matrix.applyToContext(ctx); + this.draw(ctx, new Base({ matrices: [matrix] })); + ctx.restore(); + raster.setCanvas(canvas); + } + raster.transform(new Matrix().translate(topLeft.add(size.divide(2))) + .scale(1 / scale)); + if (insert === undefined || insert) + raster.insertAbove(this); + return raster; + }, + + contains: function() { + return !!this._contains( + this._matrix._inverseTransform(Point.read(arguments))); + }, + + _contains: function(point) { + var children = this._children; + if (children) { + for (var i = children.length - 1; i >= 0; i--) { + if (children[i].contains(point)) + return true; + } + return false; + } + return point.isInside(this.getInternalBounds()); + }, + + isInside: function() { + return Rectangle.read(arguments).contains(this.getBounds()); + }, + + _asPathItem: function() { + return new Path.Rectangle({ + rectangle: this.getInternalBounds(), + matrix: this._matrix, + insert: false, + }); + }, + + intersects: function(item, _matrix) { + if (!(item instanceof Item)) + return false; + return this._asPathItem().getIntersections(item._asPathItem(), null, + _matrix, true).length > 0; + } +}, +new function() { + function hitTest() { + return this._hitTest( + Point.read(arguments), + HitResult.getOptions(arguments)); + } + + function hitTestAll() { + var point = Point.read(arguments), + options = HitResult.getOptions(arguments), + all = []; + this._hitTest(point, Base.set({ all: all }, options)); + return all; + } + + function hitTestChildren(point, options, viewMatrix, _exclude) { + var children = this._children; + if (children) { + for (var i = children.length - 1; i >= 0; i--) { + var child = children[i]; + var res = child !== _exclude && child._hitTest(point, options, + viewMatrix); + if (res && !options.all) + return res; + } + } + return null; + } + + Project.inject({ + hitTest: hitTest, + hitTestAll: hitTestAll, + _hitTest: hitTestChildren + }); + + return { + hitTest: hitTest, + hitTestAll: hitTestAll, + _hitTestChildren: hitTestChildren, + }; +}, { + + _hitTest: function(point, options, parentViewMatrix) { + if (this._locked || !this._visible || this._guide && !options.guides + || this.isEmpty()) { + return null; + } + + var matrix = this._matrix, + viewMatrix = parentViewMatrix + ? parentViewMatrix.appended(matrix) + : this.getGlobalMatrix().prepend(this.getView()._matrix), + tolerance = Math.max(options.tolerance, 1e-12), + tolerancePadding = options._tolerancePadding = new Size( + Path._getStrokePadding(tolerance, + matrix._shiftless().invert())); + point = matrix._inverseTransform(point); + if (!point || !this._children && + !this.getBounds({ internal: true, stroke: true, handle: true }) + .expand(tolerancePadding.multiply(2))._containsPoint(point)) { + return null; + } + + var checkSelf = !(options.guides && !this._guide + || options.selected && !this.isSelected() + || options.type && options.type !== Base.hyphenate(this._class) + || options.class && !(this instanceof options.class)), + match = options.match, + that = this, + bounds, + res; + + function filter(hit) { + if (hit && match && !match(hit)) + hit = null; + if (hit && options.all) + options.all.push(hit); + return hit; + } + + function checkPoint(type, part) { + var pt = part ? bounds['get' + part]() : that.getPosition(); + if (point.subtract(pt).divide(tolerancePadding).length <= 1) { + return new HitResult(type, that, { + name: part ? Base.hyphenate(part) : type, + point: pt + }); + } + } + + var checkPosition = options.position, + checkCenter = options.center, + checkBounds = options.bounds; + if (checkSelf && this._parent + && (checkPosition || checkCenter || checkBounds)) { + if (checkCenter || checkBounds) { + bounds = this.getInternalBounds(); + } + res = checkPosition && checkPoint('position') || + checkCenter && checkPoint('center', 'Center'); + if (!res && checkBounds) { + var points = [ + 'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight', + 'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter' + ]; + for (var i = 0; i < 8 && !res; i++) { + res = checkPoint('bounds', points[i]); + } + } + res = filter(res); + } + + if (!res) { + res = this._hitTestChildren(point, options, viewMatrix) + || checkSelf + && filter(this._hitTestSelf(point, options, viewMatrix, + this.getStrokeScaling() ? null + : viewMatrix._shiftless().invert())) + || null; + } + if (res && res.point) { + res.point = matrix.transform(res.point); + } + return res; + }, + + _hitTestSelf: function(point, options) { + if (options.fill && this.hasFill() && this._contains(point)) + return new HitResult('fill', this); + }, + + matches: function(name, compare) { + function matchObject(obj1, obj2) { + for (var i in obj1) { + if (obj1.hasOwnProperty(i)) { + var val1 = obj1[i], + val2 = obj2[i]; + if (Base.isPlainObject(val1) && Base.isPlainObject(val2)) { + if (!matchObject(val1, val2)) + return false; + } else if (!Base.equals(val1, val2)) { + return false; + } + } + } + return true; + } + var type = typeof name; + if (type === 'object') { + for (var key in name) { + if (name.hasOwnProperty(key) && !this.matches(key, name[key])) + return false; + } + return true; + } else if (type === 'function') { + return name(this); + } else if (name === 'match') { + return compare(this); + } else { + var value = /^(empty|editable)$/.test(name) + ? this['is' + Base.capitalize(name)]() + : name === 'type' + ? Base.hyphenate(this._class) + : this[name]; + if (name === 'class') { + if (typeof compare === 'function') + return this instanceof compare; + value = this._class; + } + if (typeof compare === 'function') { + return !!compare(value); + } else if (compare) { + if (compare.test) { + return compare.test(value); + } else if (Base.isPlainObject(compare)) { + return matchObject(compare, value); + } + } + return Base.equals(value, compare); + } + }, + + getItems: function(options) { + return Item._getItems(this, options, this._matrix); + }, + + getItem: function(options) { + return Item._getItems(this, options, this._matrix, null, true)[0] + || null; + }, + + statics: { + _getItems: function _getItems(item, options, matrix, param, firstOnly) { + if (!param) { + var obj = typeof options === 'object' && options, + overlapping = obj && obj.overlapping, + inside = obj && obj.inside, + bounds = overlapping || inside, + rect = bounds && Rectangle.read([bounds]); + param = { + items: [], + recursive: obj && obj.recursive !== false, + inside: !!inside, + overlapping: !!overlapping, + rect: rect, + path: overlapping && new Path.Rectangle({ + rectangle: rect, + insert: false + }) + }; + if (obj) { + options = Base.filter({}, options, { + recursive: true, inside: true, overlapping: true + }); + } + } + var children = item._children, + items = param.items, + rect = param.rect; + matrix = rect && (matrix || new Matrix()); + for (var i = 0, l = children && children.length; i < l; i++) { + var child = children[i], + childMatrix = matrix && matrix.appended(child._matrix), + add = true; + if (rect) { + var bounds = child.getBounds(childMatrix); + if (!rect.intersects(bounds)) + continue; + if (!(rect.contains(bounds) + || param.overlapping && (bounds.contains(rect) + || param.path.intersects(child, childMatrix)))) + add = false; + } + if (add && child.matches(options)) { + items.push(child); + if (firstOnly) + break; + } + if (param.recursive !== false) { + _getItems(child, options, childMatrix, param, firstOnly); + } + if (firstOnly && items.length > 0) + break; + } + return items; + } + } +}, { + + importJSON: function(json) { + var res = Base.importJSON(json, this); + return res !== this ? this.addChild(res) : res; + }, + + addChild: function(item) { + return this.insertChild(undefined, item); + }, + + insertChild: function(index, item) { + var res = item ? this.insertChildren(index, [item]) : null; + return res && res[0]; + }, + + addChildren: function(items) { + return this.insertChildren(this._children.length, items); + }, + + insertChildren: function(index, items) { + var children = this._children; + if (children && items && items.length > 0) { + items = Base.slice(items); + var inserted = {}; + for (var i = items.length - 1; i >= 0; i--) { + var item = items[i], + id = item && item._id; + if (!item || inserted[id]) { + items.splice(i, 1); + } else { + item._remove(false, true); + inserted[id] = true; + } + } + Base.splice(children, items, index, 0); + var project = this._project, + notifySelf = project._changes; + for (var i = 0, l = items.length; i < l; i++) { + var item = items[i], + name = item._name; + item._parent = this; + item._setProject(project, true); + if (name) + item.setName(name); + if (notifySelf) + item._changed(5); + } + this._changed(11); + } else { + items = null; + } + return items; + }, + + _insertItem: '#insertChild', + + _insertAt: function(item, offset) { + var owner = item && item._getOwner(), + res = item !== this && owner ? this : null; + if (res) { + res._remove(false, true); + owner._insertItem(item._index + offset, res); + } + return res; + }, + + insertAbove: function(item) { + return this._insertAt(item, 1); + }, + + insertBelow: function(item) { + return this._insertAt(item, 0); + }, + + sendToBack: function() { + var owner = this._getOwner(); + return owner ? owner._insertItem(0, this) : null; + }, + + bringToFront: function() { + var owner = this._getOwner(); + return owner ? owner._insertItem(undefined, this) : null; + }, + + appendTop: '#addChild', + + appendBottom: function(item) { + return this.insertChild(0, item); + }, + + moveAbove: '#insertAbove', + + moveBelow: '#insertBelow', + + addTo: function(owner) { + return owner._insertItem(undefined, this); + }, + + copyTo: function(owner) { + return this.clone(false).addTo(owner); + }, + + reduce: function(options) { + var children = this._children; + if (children && children.length === 1) { + var child = children[0].reduce(options); + if (this._parent) { + child.insertAbove(this); + this.remove(); + } else { + child.remove(); + } + return child; + } + return this; + }, + + _removeNamed: function() { + var owner = this._getOwner(); + if (owner) { + var children = owner._children, + namedChildren = owner._namedChildren, + name = this._name, + namedArray = namedChildren[name], + index = namedArray ? namedArray.indexOf(this) : -1; + if (index !== -1) { + if (children[name] == this) + delete children[name]; + namedArray.splice(index, 1); + if (namedArray.length) { + children[name] = namedArray[0]; + } else { + delete namedChildren[name]; + } + } + } + }, + + _remove: function(notifySelf, notifyParent) { + var owner = this._getOwner(), + project = this._project, + index = this._index; + if (owner) { + if (this._name) + this._removeNamed(); + if (index != null) { + if (project._activeLayer === this) + project._activeLayer = this.getNextSibling() + || this.getPreviousSibling(); + Base.splice(owner._children, null, index, 1); + } + this._installEvents(false); + if (notifySelf && project._changes) + this._changed(5); + if (notifyParent) + owner._changed(11, this); + this._parent = null; + return true; + } + return false; + }, + + remove: function() { + return this._remove(true, true); + }, + + replaceWith: function(item) { + var ok = item && item.insertBelow(this); + if (ok) + this.remove(); + return ok; + }, + + removeChildren: function(start, end) { + if (!this._children) + return null; + start = start || 0; + end = Base.pick(end, this._children.length); + var removed = Base.splice(this._children, null, start, end - start); + for (var i = removed.length - 1; i >= 0; i--) { + removed[i]._remove(true, false); + } + if (removed.length > 0) + this._changed(11); + return removed; + }, + + clear: '#removeChildren', + + reverseChildren: function() { + if (this._children) { + this._children.reverse(); + for (var i = 0, l = this._children.length; i < l; i++) + this._children[i]._index = i; + this._changed(11); + } + }, + + isEmpty: function() { + var children = this._children; + return !children || !children.length; + }, + + isEditable: function() { + var item = this; + while (item) { + if (!item._visible || item._locked) + return false; + item = item._parent; + } + return true; + }, + + hasFill: function() { + return this.getStyle().hasFill(); + }, + + hasStroke: function() { + return this.getStyle().hasStroke(); + }, + + hasShadow: function() { + return this.getStyle().hasShadow(); + }, + + _getOrder: function(item) { + function getList(item) { + var list = []; + do { + list.unshift(item); + } while (item = item._parent); + return list; + } + var list1 = getList(this), + list2 = getList(item); + for (var i = 0, l = Math.min(list1.length, list2.length); i < l; i++) { + if (list1[i] != list2[i]) { + return list1[i]._index < list2[i]._index ? 1 : -1; + } + } + return 0; + }, + + hasChildren: function() { + return this._children && this._children.length > 0; + }, + + isInserted: function() { + return this._parent ? this._parent.isInserted() : false; + }, + + isAbove: function(item) { + return this._getOrder(item) === -1; + }, + + isBelow: function(item) { + return this._getOrder(item) === 1; + }, + + isParent: function(item) { + return this._parent === item; + }, + + isChild: function(item) { + return item && item._parent === this; + }, + + isDescendant: function(item) { + var parent = this; + while (parent = parent._parent) { + if (parent === item) + return true; + } + return false; + }, + + isAncestor: function(item) { + return item ? item.isDescendant(this) : false; + }, + + isSibling: function(item) { + return this._parent === item._parent; + }, + + isGroupedWith: function(item) { + var parent = this._parent; + while (parent) { + if (parent._parent + && /^(Group|Layer|CompoundPath)$/.test(parent._class) + && item.isDescendant(parent)) + return true; + parent = parent._parent; + } + return false; + }, + +}, Base.each(['rotate', 'scale', 'shear', 'skew'], function(key) { + var rotate = key === 'rotate'; + this[key] = function() { + var value = (rotate ? Base : Point).read(arguments), + center = Point.read(arguments, 0, { readNull: true }); + return this.transform(new Matrix()[key](value, + center || this.getPosition(true))); + }; +}, { + translate: function() { + var mx = new Matrix(); + return this.transform(mx.translate.apply(mx, arguments)); + }, + + transform: function(matrix, _applyMatrix, _applyRecursively, + _setApplyMatrix) { + var _matrix = this._matrix, + transform = matrix && !matrix.isIdentity(), + applyMatrix = (_applyMatrix || this._applyMatrix) + && ((!_matrix.isIdentity() || transform) + || _applyMatrix && _applyRecursively && this._children); + if (!transform && !applyMatrix) + return this; + if (transform) { + if (!matrix.isInvertible() && _matrix.isInvertible()) + _matrix._backup = _matrix.getValues(); + _matrix.prepend(matrix, true); + var style = this._style, + fillColor = style.getFillColor(true), + strokeColor = style.getStrokeColor(true); + if (fillColor) + fillColor.transform(matrix); + if (strokeColor) + strokeColor.transform(matrix); + } + if (applyMatrix && (applyMatrix = this._transformContent(_matrix, + _applyRecursively, _setApplyMatrix))) { + var pivot = this._pivot; + if (pivot) + _matrix._transformPoint(pivot, pivot, true); + _matrix.reset(true); + if (_setApplyMatrix && this._canApplyMatrix) + this._applyMatrix = true; + } + var bounds = this._bounds, + position = this._position; + if (transform || applyMatrix) { + this._changed(9); + } + var decomp = transform && bounds && matrix.decompose(); + if (decomp && decomp.skewing.isZero() && decomp.rotation % 90 === 0) { + for (var key in bounds) { + var cache = bounds[key]; + if (cache.nonscaling) { + delete bounds[key]; + } else if (applyMatrix || !cache.internal) { + var rect = cache.rect; + matrix._transformBounds(rect, rect); + } + } + this._bounds = bounds; + var cached = bounds[this._getBoundsCacheKey( + this._boundsOptions || {})]; + if (cached) { + this._position = cached.rect.getCenter(true); + } + } else if (transform && position && this._pivot) { + this._position = matrix._transformPoint(position, position); + } + return this; + }, + + _transformContent: function(matrix, applyRecursively, setApplyMatrix) { + var children = this._children; + if (children) { + for (var i = 0, l = children.length; i < l; i++) + children[i].transform(matrix, true, applyRecursively, + setApplyMatrix); + return true; + } + }, + + globalToLocal: function() { + return this.getGlobalMatrix(true)._inverseTransform( + Point.read(arguments)); + }, + + localToGlobal: function() { + return this.getGlobalMatrix(true)._transformPoint( + Point.read(arguments)); + }, + + parentToLocal: function() { + return this._matrix._inverseTransform(Point.read(arguments)); + }, + + localToParent: function() { + return this._matrix._transformPoint(Point.read(arguments)); + }, + + fitBounds: function(rectangle, fill) { + rectangle = Rectangle.read(arguments); + var bounds = this.getBounds(), + itemRatio = bounds.height / bounds.width, + rectRatio = rectangle.height / rectangle.width, + scale = (fill ? itemRatio > rectRatio : itemRatio < rectRatio) + ? rectangle.width / bounds.width + : rectangle.height / bounds.height, + newBounds = new Rectangle(new Point(), + new Size(bounds.width * scale, bounds.height * scale)); + newBounds.setCenter(rectangle.getCenter()); + this.setBounds(newBounds); + } +}), { + + _setStyles: function(ctx, param, viewMatrix) { + var style = this._style, + matrix = this._matrix; + if (style.hasFill()) { + ctx.fillStyle = style.getFillColor().toCanvasStyle(ctx, matrix); + } + if (style.hasStroke()) { + ctx.strokeStyle = style.getStrokeColor().toCanvasStyle(ctx, matrix); + ctx.lineWidth = style.getStrokeWidth(); + var strokeJoin = style.getStrokeJoin(), + strokeCap = style.getStrokeCap(), + miterLimit = style.getMiterLimit(); + if (strokeJoin) + ctx.lineJoin = strokeJoin; + if (strokeCap) + ctx.lineCap = strokeCap; + if (miterLimit) + ctx.miterLimit = miterLimit; + if (paper.support.nativeDash) { + var dashArray = style.getDashArray(), + dashOffset = style.getDashOffset(); + if (dashArray && dashArray.length) { + if ('setLineDash' in ctx) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashOffset; + } else { + ctx.mozDash = dashArray; + ctx.mozDashOffset = dashOffset; + } + } + } + } + if (style.hasShadow()) { + var pixelRatio = param.pixelRatio || 1, + mx = viewMatrix._shiftless().prepend( + new Matrix().scale(pixelRatio, pixelRatio)), + blur = mx.transform(new Point(style.getShadowBlur(), 0)), + offset = mx.transform(this.getShadowOffset()); + ctx.shadowColor = style.getShadowColor().toCanvasStyle(ctx); + ctx.shadowBlur = blur.getLength(); + ctx.shadowOffsetX = offset.x; + ctx.shadowOffsetY = offset.y; + } + }, + + draw: function(ctx, param, parentStrokeMatrix) { + var updateVersion = this._updateVersion = this._project._updateVersion; + if (!this._visible || this._opacity === 0) + return; + var matrices = param.matrices, + viewMatrix = param.viewMatrix, + matrix = this._matrix, + globalMatrix = matrices[matrices.length - 1].appended(matrix); + if (!globalMatrix.isInvertible()) + return; + + viewMatrix = viewMatrix ? viewMatrix.appended(globalMatrix) + : globalMatrix; + + matrices.push(globalMatrix); + if (param.updateMatrix) { + globalMatrix._updateVersion = updateVersion; + this._globalMatrix = globalMatrix; + } + + var blendMode = this._blendMode, + opacity = this._opacity, + normalBlend = blendMode === 'normal', + nativeBlend = BlendMode.nativeModes[blendMode], + direct = normalBlend && opacity === 1 + || param.dontStart + || param.clip + || (nativeBlend || normalBlend && opacity < 1) + && this._canComposite(), + pixelRatio = param.pixelRatio || 1, + mainCtx, itemOffset, prevOffset; + if (!direct) { + var bounds = this.getStrokeBounds(viewMatrix); + if (!bounds.width || !bounds.height) + return; + prevOffset = param.offset; + itemOffset = param.offset = bounds.getTopLeft().floor(); + mainCtx = ctx; + ctx = CanvasProvider.getContext(bounds.getSize().ceil().add(1) + .multiply(pixelRatio)); + if (pixelRatio !== 1) + ctx.scale(pixelRatio, pixelRatio); + } + ctx.save(); + var strokeMatrix = parentStrokeMatrix + ? parentStrokeMatrix.appended(matrix) + : this._canScaleStroke && !this.getStrokeScaling(true) + && viewMatrix, + clip = !direct && param.clipItem, + transform = !strokeMatrix || clip; + if (direct) { + ctx.globalAlpha = opacity; + if (nativeBlend) + ctx.globalCompositeOperation = blendMode; + } else if (transform) { + ctx.translate(-itemOffset.x, -itemOffset.y); + } + if (transform) { + (direct ? matrix : viewMatrix).applyToContext(ctx); + } + if (clip) { + param.clipItem.draw(ctx, param.extend({ clip: true })); + } + if (strokeMatrix) { + ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0); + var offset = param.offset; + if (offset) + ctx.translate(-offset.x, -offset.y); + } + this._draw(ctx, param, viewMatrix, strokeMatrix); + ctx.restore(); + matrices.pop(); + if (param.clip && !param.dontFinish) + ctx.clip(); + if (!direct) { + BlendMode.process(blendMode, ctx, mainCtx, opacity, + itemOffset.subtract(prevOffset).multiply(pixelRatio)); + CanvasProvider.release(ctx); + param.offset = prevOffset; + } + }, + + _isUpdated: function(updateVersion) { + var parent = this._parent; + if (parent instanceof CompoundPath) + return parent._isUpdated(updateVersion); + var updated = this._updateVersion === updateVersion; + if (!updated && parent && parent._visible + && parent._isUpdated(updateVersion)) { + this._updateVersion = updateVersion; + updated = true; + } + return updated; + }, + + _drawSelection: function(ctx, matrix, size, selectionItems, updateVersion) { + var selection = this._selection, + itemSelected = selection & 1, + boundsSelected = selection & 2 + || itemSelected && this._selectBounds, + positionSelected = selection & 4; + if (!this._drawSelected) + itemSelected = false; + if ((itemSelected || boundsSelected || positionSelected) + && this._isUpdated(updateVersion)) { + var layer, + color = this.getSelectedColor(true) || (layer = this.getLayer()) + && layer.getSelectedColor(true), + mx = matrix.appended(this.getGlobalMatrix(true)), + half = size / 2; + ctx.strokeStyle = ctx.fillStyle = color + ? color.toCanvasStyle(ctx) : '#009dec'; + if (itemSelected) + this._drawSelected(ctx, mx, selectionItems); + if (positionSelected) { + var point = this.getPosition(true), + x = point.x, + y = point.y; + ctx.beginPath(); + ctx.arc(x, y, half, 0, Math.PI * 2, true); + ctx.stroke(); + var deltas = [[0, -1], [1, 0], [0, 1], [-1, 0]], + start = half, + end = size + 1; + for (var i = 0; i < 4; i++) { + var delta = deltas[i], + dx = delta[0], + dy = delta[1]; + ctx.moveTo(x + dx * start, y + dy * start); + ctx.lineTo(x + dx * end, y + dy * end); + ctx.stroke(); + } + } + if (boundsSelected) { + var coords = mx._transformCorners(this.getInternalBounds()); + ctx.beginPath(); + for (var i = 0; i < 8; i++) { + ctx[!i ? 'moveTo' : 'lineTo'](coords[i], coords[++i]); + } + ctx.closePath(); + ctx.stroke(); + for (var i = 0; i < 8; i++) { + ctx.fillRect(coords[i] - half, coords[++i] - half, + size, size); + } + } + } + }, + + _canComposite: function() { + return false; + } +}, Base.each(['down', 'drag', 'up', 'move'], function(key) { + this['removeOn' + Base.capitalize(key)] = function() { + var hash = {}; + hash[key] = true; + return this.removeOn(hash); + }; +}, { + + removeOn: function(obj) { + for (var name in obj) { + if (obj[name]) { + var key = 'mouse' + name, + project = this._project, + sets = project._removeSets = project._removeSets || {}; + sets[key] = sets[key] || {}; + sets[key][this._id] = this; + } + } + return this; + } +})); + +var Group = Item.extend({ + _class: 'Group', + _selectBounds: false, + _selectChildren: true, + _serializeFields: { + children: [] + }, + + initialize: function Group(arg) { + this._children = []; + this._namedChildren = {}; + if (!this._initialize(arg)) + this.addChildren(Array.isArray(arg) ? arg : arguments); + }, + + _changed: function _changed(flags) { + _changed.base.call(this, flags); + if (flags & 1026) { + this._clipItem = undefined; + } + }, + + _getClipItem: function() { + var clipItem = this._clipItem; + if (clipItem === undefined) { + clipItem = null; + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) { + if (children[i]._clipMask) { + clipItem = children[i]; + break; + } + } + this._clipItem = clipItem; + } + return clipItem; + }, + + isClipped: function() { + return !!this._getClipItem(); + }, + + setClipped: function(clipped) { + var child = this.getFirstChild(); + if (child) + child.setClipMask(clipped); + }, + + _getBounds: function _getBounds(matrix, options) { + var clipItem = this._getClipItem(); + return clipItem + ? clipItem._getCachedBounds( + matrix && matrix.appended(clipItem._matrix), + Base.set({}, options, { stroke: false })) + : _getBounds.base.call(this, matrix, options); + }, + + _hitTestChildren: function _hitTestChildren(point, options, viewMatrix) { + var clipItem = this._getClipItem(); + return (!clipItem || clipItem.contains(point)) + && _hitTestChildren.base.call(this, point, options, viewMatrix, + clipItem); + }, + + _draw: function(ctx, param) { + var clip = param.clip, + clipItem = !clip && this._getClipItem(); + param = param.extend({ clipItem: clipItem, clip: false }); + if (clip) { + ctx.beginPath(); + param.dontStart = param.dontFinish = true; + } else if (clipItem) { + clipItem.draw(ctx, param.extend({ clip: true })); + } + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) { + var item = children[i]; + if (item !== clipItem) + item.draw(ctx, param); + } + } +}); + +var Layer = Group.extend({ + _class: 'Layer', + + initialize: function Layer() { + Group.apply(this, arguments); + }, + + _getOwner: function() { + return this._parent || this._index != null && this._project; + }, + + isInserted: function isInserted() { + return this._parent ? isInserted.base.call(this) : this._index != null; + }, + + activate: function() { + this._project._activeLayer = this; + }, + + _hitTestSelf: function() { + } +}); + +var Shape = Item.extend({ + _class: 'Shape', + _applyMatrix: false, + _canApplyMatrix: false, + _canScaleStroke: true, + _serializeFields: { + type: null, + size: null, + radius: null + }, + + initialize: function Shape(props, point) { + this._initialize(props, point); + }, + + _equals: function(item) { + return this._type === item._type + && this._size.equals(item._size) + && Base.equals(this._radius, item._radius); + }, + + copyContent: function(source) { + this.setType(source._type); + this.setSize(source._size); + this.setRadius(source._radius); + }, + + getType: function() { + return this._type; + }, + + setType: function(type) { + this._type = type; + }, + + getShape: '#getType', + setShape: '#setType', + + getSize: function() { + var size = this._size; + return new LinkedSize(size.width, size.height, this, 'setSize'); + }, + + setSize: function() { + var size = Size.read(arguments); + if (!this._size) { + this._size = size.clone(); + } else if (!this._size.equals(size)) { + var type = this._type, + width = size.width, + height = size.height; + if (type === 'rectangle') { + this._radius.set(Size.min(this._radius, size.divide(2))); + } else if (type === 'circle') { + width = height = (width + height) / 2; + this._radius = width / 2; + } else if (type === 'ellipse') { + this._radius._set(width / 2, height / 2); + } + this._size._set(width, height); + this._changed(9); + } + }, + + getRadius: function() { + var rad = this._radius; + return this._type === 'circle' + ? rad + : new LinkedSize(rad.width, rad.height, this, 'setRadius'); + }, + + setRadius: function(radius) { + var type = this._type; + if (type === 'circle') { + if (radius === this._radius) + return; + var size = radius * 2; + this._radius = radius; + this._size._set(size, size); + } else { + radius = Size.read(arguments); + if (!this._radius) { + this._radius = radius.clone(); + } else { + if (this._radius.equals(radius)) + return; + this._radius.set(radius); + if (type === 'rectangle') { + var size = Size.max(this._size, radius.multiply(2)); + this._size.set(size); + } else if (type === 'ellipse') { + this._size._set(radius.width * 2, radius.height * 2); + } + } + } + this._changed(9); + }, + + isEmpty: function() { + return false; + }, + + toPath: function(insert) { + var path = new Path[Base.capitalize(this._type)]({ + center: new Point(), + size: this._size, + radius: this._radius, + insert: false + }); + path.copyAttributes(this); + if (paper.settings.applyMatrix) + path.setApplyMatrix(true); + if (insert === undefined || insert) + path.insertAbove(this); + return path; + }, + + toShape: '#clone', + + _asPathItem: function() { + return this.toPath(false); + }, + + _draw: function(ctx, param, viewMatrix, strokeMatrix) { + var style = this._style, + hasFill = style.hasFill(), + hasStroke = style.hasStroke(), + dontPaint = param.dontFinish || param.clip, + untransformed = !strokeMatrix; + if (hasFill || hasStroke || dontPaint) { + var type = this._type, + radius = this._radius, + isCircle = type === 'circle'; + if (!param.dontStart) + ctx.beginPath(); + if (untransformed && isCircle) { + ctx.arc(0, 0, radius, 0, Math.PI * 2, true); + } else { + var rx = isCircle ? radius : radius.width, + ry = isCircle ? radius : radius.height, + size = this._size, + width = size.width, + height = size.height; + if (untransformed && type === 'rectangle' && rx === 0 && ry === 0) { + ctx.rect(-width / 2, -height / 2, width, height); + } else { + var x = width / 2, + y = height / 2, + kappa = 1 - 0.5522847498307936, + cx = rx * kappa, + cy = ry * kappa, + c = [ + -x, -y + ry, + -x, -y + cy, + -x + cx, -y, + -x + rx, -y, + x - rx, -y, + x - cx, -y, + x, -y + cy, + x, -y + ry, + x, y - ry, + x, y - cy, + x - cx, y, + x - rx, y, + -x + rx, y, + -x + cx, y, + -x, y - cy, + -x, y - ry + ]; + if (strokeMatrix) + strokeMatrix.transform(c, c, 32); + ctx.moveTo(c[0], c[1]); + ctx.bezierCurveTo(c[2], c[3], c[4], c[5], c[6], c[7]); + if (x !== rx) + ctx.lineTo(c[8], c[9]); + ctx.bezierCurveTo(c[10], c[11], c[12], c[13], c[14], c[15]); + if (y !== ry) + ctx.lineTo(c[16], c[17]); + ctx.bezierCurveTo(c[18], c[19], c[20], c[21], c[22], c[23]); + if (x !== rx) + ctx.lineTo(c[24], c[25]); + ctx.bezierCurveTo(c[26], c[27], c[28], c[29], c[30], c[31]); + } + } + ctx.closePath(); + } + if (!dontPaint && (hasFill || hasStroke)) { + this._setStyles(ctx, param, viewMatrix); + if (hasFill) { + ctx.fill(style.getFillRule()); + ctx.shadowColor = 'rgba(0,0,0,0)'; + } + if (hasStroke) + ctx.stroke(); + } + }, + + _canComposite: function() { + return !(this.hasFill() && this.hasStroke()); + }, + + _getBounds: function(matrix, options) { + var rect = new Rectangle(this._size).setCenter(0, 0), + style = this._style, + strokeWidth = options.stroke && style.hasStroke() + && style.getStrokeWidth(); + if (matrix) + rect = matrix._transformBounds(rect); + return strokeWidth + ? rect.expand(Path._getStrokePadding(strokeWidth, + this._getStrokeMatrix(matrix, options))) + : rect; + } +}, +new function() { + function getCornerCenter(that, point, expand) { + var radius = that._radius; + if (!radius.isZero()) { + var halfSize = that._size.divide(2); + for (var q = 1; q <= 4; q++) { + var dir = new Point(q > 1 && q < 4 ? -1 : 1, q > 2 ? -1 : 1), + corner = dir.multiply(halfSize), + center = corner.subtract(dir.multiply(radius)), + rect = new Rectangle( + expand ? corner.add(dir.multiply(expand)) : corner, + center); + if (rect.contains(point)) + return { point: center, quadrant: q }; + } + } + } + + function isOnEllipseStroke(point, radius, padding, quadrant) { + var vector = point.divide(radius); + return (!quadrant || vector.isInQuadrant(quadrant)) && + vector.subtract(vector.normalize()).multiply(radius) + .divide(padding).length <= 1; + } + + return { + _contains: function _contains(point) { + if (this._type === 'rectangle') { + var center = getCornerCenter(this, point); + return center + ? point.subtract(center.point).divide(this._radius) + .getLength() <= 1 + : _contains.base.call(this, point); + } else { + return point.divide(this.size).getLength() <= 0.5; + } + }, + + _hitTestSelf: function _hitTestSelf(point, options, viewMatrix, + strokeMatrix) { + var hit = false, + style = this._style, + hitStroke = options.stroke && style.hasStroke(), + hitFill = options.fill && style.hasFill(); + if (hitStroke || hitFill) { + var type = this._type, + radius = this._radius, + strokeRadius = hitStroke ? style.getStrokeWidth() / 2 : 0, + strokePadding = options._tolerancePadding.add( + Path._getStrokePadding(strokeRadius, + !style.getStrokeScaling() && strokeMatrix)); + if (type === 'rectangle') { + var padding = strokePadding.multiply(2), + center = getCornerCenter(this, point, padding); + if (center) { + hit = isOnEllipseStroke(point.subtract(center.point), + radius, strokePadding, center.quadrant); + } else { + var rect = new Rectangle(this._size).setCenter(0, 0), + outer = rect.expand(padding), + inner = rect.expand(padding.negate()); + hit = outer._containsPoint(point) + && !inner._containsPoint(point); + } + } else { + hit = isOnEllipseStroke(point, radius, strokePadding); + } + } + return hit ? new HitResult(hitStroke ? 'stroke' : 'fill', this) + : _hitTestSelf.base.apply(this, arguments); + } + }; +}, { + +statics: new function() { + function createShape(type, point, size, radius, args) { + var item = new Shape(Base.getNamed(args), point); + item._type = type; + item._size = size; + item._radius = radius; + return item; + } + + return { + Circle: function() { + var center = Point.readNamed(arguments, 'center'), + radius = Base.readNamed(arguments, 'radius'); + return createShape('circle', center, new Size(radius * 2), radius, + arguments); + }, + + Rectangle: function() { + var rect = Rectangle.readNamed(arguments, 'rectangle'), + radius = Size.min(Size.readNamed(arguments, 'radius'), + rect.getSize(true).divide(2)); + return createShape('rectangle', rect.getCenter(true), + rect.getSize(true), radius, arguments); + }, + + Ellipse: function() { + var ellipse = Shape._readEllipse(arguments), + radius = ellipse.radius; + return createShape('ellipse', ellipse.center, radius.multiply(2), + radius, arguments); + }, + + _readEllipse: function(args) { + var center, + radius; + if (Base.hasNamed(args, 'radius')) { + center = Point.readNamed(args, 'center'); + radius = Size.readNamed(args, 'radius'); + } else { + var rect = Rectangle.readNamed(args, 'rectangle'); + center = rect.getCenter(true); + radius = rect.getSize(true).divide(2); + } + return { center: center, radius: radius }; + } + }; +}}); + +var Raster = Item.extend({ + _class: 'Raster', + _applyMatrix: false, + _canApplyMatrix: false, + _boundsOptions: { stroke: false, handle: false }, + _serializeFields: { + crossOrigin: null, + source: null + }, + _prioritize: ['crossOrigin'], + + initialize: function Raster(object, position) { + if (!this._initialize(object, + position !== undefined && Point.read(arguments, 1))) { + var image = typeof object === 'string' + ? document.getElementById(object) : object; + if (image) { + this.setImage(image); + } else { + this.setSource(object); + } + } + if (!this._size) { + this._size = new Size(); + this._loaded = false; + } + }, + + _equals: function(item) { + return this.getSource() === item.getSource(); + }, + + copyContent: function(source) { + var image = source._image, + canvas = source._canvas; + if (image) { + this._setImage(image); + } else if (canvas) { + var copyCanvas = CanvasProvider.getCanvas(source._size); + copyCanvas.getContext('2d').drawImage(canvas, 0, 0); + this._setImage(copyCanvas); + } + this._crossOrigin = source._crossOrigin; + }, + + getSize: function() { + var size = this._size; + return new LinkedSize(size ? size.width : 0, size ? size.height : 0, + this, 'setSize'); + }, + + setSize: function() { + var size = Size.read(arguments); + if (!size.equals(this._size)) { + if (size.width > 0 && size.height > 0) { + var element = this.getElement(); + this._setImage(CanvasProvider.getCanvas(size)); + if (element) + this.getContext(true).drawImage(element, 0, 0, + size.width, size.height); + } else { + if (this._canvas) + CanvasProvider.release(this._canvas); + this._size = size.clone(); + } + } + }, + + getWidth: function() { + return this._size ? this._size.width : 0; + }, + + setWidth: function(width) { + this.setSize(width, this.getHeight()); + }, + + getHeight: function() { + return this._size ? this._size.height : 0; + }, + + setHeight: function(height) { + this.setSize(this.getWidth(), height); + }, + + getLoaded: function() { + return this._loaded; + }, + + isEmpty: function() { + var size = this._size; + return !size || size.width === 0 && size.height === 0; + }, + + getResolution: function() { + var matrix = this._matrix, + orig = new Point(0, 0).transform(matrix), + u = new Point(1, 0).transform(matrix).subtract(orig), + v = new Point(0, 1).transform(matrix).subtract(orig); + return new Size( + 72 / u.getLength(), + 72 / v.getLength() + ); + }, + + getPpi: '#getResolution', + + getImage: function() { + return this._image; + }, + + setImage: function(image) { + var that = this; + + function emit(event) { + var view = that.getView(), + type = event && event.type || 'load'; + if (view && that.responds(type)) { + paper = view._scope; + that.emit(type, new Event(event)); + } + } + + this._setImage(image); + if (this._loaded) { + setTimeout(emit, 0); + } else if (image) { + DomEvent.add(image, { + load: function(event) { + that._setImage(image); + emit(event); + }, + error: emit + }); + } + }, + + _setImage: function(image) { + if (this._canvas) + CanvasProvider.release(this._canvas); + if (image && image.getContext) { + this._image = null; + this._canvas = image; + this._loaded = true; + } else { + this._image = image; + this._canvas = null; + this._loaded = !!(image && image.src && image.complete); + } + this._size = new Size( + image ? image.naturalWidth || image.width : 0, + image ? image.naturalHeight || image.height : 0); + this._context = null; + this._changed(521); + }, + + getCanvas: function() { + if (!this._canvas) { + var ctx = CanvasProvider.getContext(this._size); + try { + if (this._image) + ctx.drawImage(this._image, 0, 0); + this._canvas = ctx.canvas; + } catch (e) { + CanvasProvider.release(ctx); + } + } + return this._canvas; + }, + + setCanvas: '#setImage', + + getContext: function(modify) { + if (!this._context) + this._context = this.getCanvas().getContext('2d'); + if (modify) { + this._image = null; + this._changed(513); + } + return this._context; + }, + + setContext: function(context) { + this._context = context; + }, + + getSource: function() { + var image = this._image; + return image && image.src || this.toDataURL(); + }, + + setSource: function(src) { + var image = new self.Image(), + crossOrigin = this._crossOrigin; + if (crossOrigin) + image.crossOrigin = crossOrigin; + image.src = src; + this.setImage(image); + }, + + getCrossOrigin: function() { + var image = this._image; + return image && image.crossOrigin || this._crossOrigin || ''; + }, + + setCrossOrigin: function(crossOrigin) { + this._crossOrigin = crossOrigin; + var image = this._image; + if (image) + image.crossOrigin = crossOrigin; + }, + + getElement: function() { + return this._canvas || this._loaded && this._image; + } +}, { + beans: false, + + getSubCanvas: function() { + var rect = Rectangle.read(arguments), + ctx = CanvasProvider.getContext(rect.getSize()); + ctx.drawImage(this.getCanvas(), rect.x, rect.y, + rect.width, rect.height, 0, 0, rect.width, rect.height); + return ctx.canvas; + }, + + getSubRaster: function() { + var rect = Rectangle.read(arguments), + raster = new Raster(Item.NO_INSERT); + raster._setImage(this.getSubCanvas(rect)); + raster.translate(rect.getCenter().subtract(this.getSize().divide(2))); + raster._matrix.prepend(this._matrix); + raster.insertAbove(this); + return raster; + }, + + toDataURL: function() { + var image = this._image, + src = image && image.src; + if (/^data:/.test(src)) + return src; + var canvas = this.getCanvas(); + return canvas ? canvas.toDataURL.apply(canvas, arguments) : null; + }, + + drawImage: function(image ) { + var point = Point.read(arguments, 1); + this.getContext(true).drawImage(image, point.x, point.y); + }, + + getAverageColor: function(object) { + var bounds, path; + if (!object) { + bounds = this.getBounds(); + } else if (object instanceof PathItem) { + path = object; + bounds = object.getBounds(); + } else if (typeof object === 'object') { + if ('width' in object) { + bounds = new Rectangle(object); + } else if ('x' in object) { + bounds = new Rectangle(object.x - 0.5, object.y - 0.5, 1, 1); + } + } + if (!bounds) + return null; + var sampleSize = 32, + width = Math.min(bounds.width, sampleSize), + height = Math.min(bounds.height, sampleSize); + var ctx = Raster._sampleContext; + if (!ctx) { + ctx = Raster._sampleContext = CanvasProvider.getContext( + new Size(sampleSize)); + } else { + ctx.clearRect(0, 0, sampleSize + 1, sampleSize + 1); + } + ctx.save(); + var matrix = new Matrix() + .scale(width / bounds.width, height / bounds.height) + .translate(-bounds.x, -bounds.y); + matrix.applyToContext(ctx); + if (path) + path.draw(ctx, new Base({ clip: true, matrices: [matrix] })); + this._matrix.applyToContext(ctx); + var element = this.getElement(), + size = this._size; + if (element) + ctx.drawImage(element, -size.width / 2, -size.height / 2); + ctx.restore(); + var pixels = ctx.getImageData(0.5, 0.5, Math.ceil(width), + Math.ceil(height)).data, + channels = [0, 0, 0], + total = 0; + for (var i = 0, l = pixels.length; i < l; i += 4) { + var alpha = pixels[i + 3]; + total += alpha; + alpha /= 255; + channels[0] += pixels[i] * alpha; + channels[1] += pixels[i + 1] * alpha; + channels[2] += pixels[i + 2] * alpha; + } + for (var i = 0; i < 3; i++) + channels[i] /= total; + return total ? Color.read(channels) : null; + }, + + getPixel: function() { + var point = Point.read(arguments); + var data = this.getContext().getImageData(point.x, point.y, 1, 1).data; + return new Color('rgb', [data[0] / 255, data[1] / 255, data[2] / 255], + data[3] / 255); + }, + + setPixel: function() { + var point = Point.read(arguments), + color = Color.read(arguments), + components = color._convert('rgb'), + alpha = color._alpha, + ctx = this.getContext(true), + imageData = ctx.createImageData(1, 1), + data = imageData.data; + data[0] = components[0] * 255; + data[1] = components[1] * 255; + data[2] = components[2] * 255; + data[3] = alpha != null ? alpha * 255 : 255; + ctx.putImageData(imageData, point.x, point.y); + }, + + createImageData: function() { + var size = Size.read(arguments); + return this.getContext().createImageData(size.width, size.height); + }, + + getImageData: function() { + var rect = Rectangle.read(arguments); + if (rect.isEmpty()) + rect = new Rectangle(this._size); + return this.getContext().getImageData(rect.x, rect.y, + rect.width, rect.height); + }, + + setImageData: function(data ) { + var point = Point.read(arguments, 1); + this.getContext(true).putImageData(data, point.x, point.y); + }, + + _getBounds: function(matrix, options) { + var rect = new Rectangle(this._size).setCenter(0, 0); + return matrix ? matrix._transformBounds(rect) : rect; + }, + + _hitTestSelf: function(point) { + if (this._contains(point)) { + var that = this; + return new HitResult('pixel', that, { + offset: point.add(that._size.divide(2)).round(), + color: { + get: function() { + return that.getPixel(this.offset); + } + } + }); + } + }, + + _draw: function(ctx) { + var element = this.getElement(); + if (element) { + ctx.globalAlpha = this._opacity; + ctx.drawImage(element, + -this._size.width / 2, -this._size.height / 2); + } + }, + + _canComposite: function() { + return true; + } +}); + +var SymbolItem = Item.extend({ + _class: 'SymbolItem', + _applyMatrix: false, + _canApplyMatrix: false, + _boundsOptions: { stroke: true }, + _serializeFields: { + symbol: null + }, + + initialize: function SymbolItem(arg0, arg1) { + if (!this._initialize(arg0, + arg1 !== undefined && Point.read(arguments, 1))) + this.setDefinition(arg0 instanceof SymbolDefinition ? + arg0 : new SymbolDefinition(arg0)); + }, + + _equals: function(item) { + return this._definition === item._definition; + }, + + copyContent: function(source) { + this.setDefinition(source._definition); + }, + + getDefinition: function() { + return this._definition; + }, + + setDefinition: function(definition) { + this._definition = definition; + this._changed(9); + }, + + getSymbol: '#getDefinition', + setSymbol: '#setDefinition', + + isEmpty: function() { + return this._definition._item.isEmpty(); + }, + + _getBounds: function(matrix, options) { + var item = this._definition._item; + return item._getCachedBounds(item._matrix.prepended(matrix), options); + }, + + _hitTestSelf: function(point, options, viewMatrix) { + var res = this._definition._item._hitTest(point, options, viewMatrix); + if (res) + res.item = this; + return res; + }, + + _draw: function(ctx, param) { + this._definition._item.draw(ctx, param); + } + +}); + +var SymbolDefinition = Base.extend({ + _class: 'SymbolDefinition', + + initialize: function SymbolDefinition(item, dontCenter) { + this._id = UID.get(); + this.project = paper.project; + if (item) + this.setItem(item, dontCenter); + }, + + _serialize: function(options, dictionary) { + return dictionary.add(this, function() { + return Base.serialize([this._class, this._item], + options, false, dictionary); + }); + }, + + _changed: function(flags) { + if (flags & 8) + Item._clearBoundsCache(this); + if (flags & 1) + this.project._changed(flags); + }, + + getItem: function() { + return this._item; + }, + + setItem: function(item, _dontCenter) { + if (item._symbol) + item = item.clone(); + if (this._item) + this._item._symbol = null; + this._item = item; + item.remove(); + item.setSelected(false); + if (!_dontCenter) + item.setPosition(new Point()); + item._symbol = this; + this._changed(9); + }, + + getDefinition: '#getItem', + setDefinition: '#setItem', + + place: function(position) { + return new SymbolItem(this, position); + }, + + clone: function() { + return new SymbolDefinition(this._item.clone(false)); + }, + + equals: function(symbol) { + return symbol === this + || symbol && this._item.equals(symbol._item) + || false; + } +}); + +var HitResult = Base.extend({ + _class: 'HitResult', + + initialize: function HitResult(type, item, values) { + this.type = type; + this.item = item; + if (values) + this.inject(values); + }, + + statics: { + getOptions: function(args) { + var options = args && Base.read(args); + return Base.set({ + type: null, + tolerance: paper.settings.hitTolerance, + fill: !options, + stroke: !options, + segments: !options, + handles: false, + ends: false, + position: false, + center: false, + bounds: false, + guides: false, + selected: false + }, options); + } + } +}); + +var Segment = Base.extend({ + _class: 'Segment', + beans: true, + _selection: 0, + + initialize: function Segment(arg0, arg1, arg2, arg3, arg4, arg5) { + var count = arguments.length, + point, handleIn, handleOut, selection; + if (count > 0) { + if (arg0 == null || typeof arg0 === 'object') { + if (count === 1 && arg0 && 'point' in arg0) { + point = arg0.point; + handleIn = arg0.handleIn; + handleOut = arg0.handleOut; + selection = arg0.selection; + } else { + point = arg0; + handleIn = arg1; + handleOut = arg2; + selection = arg3; + } + } else { + point = [ arg0, arg1 ]; + handleIn = arg2 !== undefined ? [ arg2, arg3 ] : null; + handleOut = arg4 !== undefined ? [ arg4, arg5 ] : null; + } + } + new SegmentPoint(point, this, '_point'); + new SegmentPoint(handleIn, this, '_handleIn'); + new SegmentPoint(handleOut, this, '_handleOut'); + if (selection) + this.setSelection(selection); + }, + + _serialize: function(options, dictionary) { + var point = this._point, + selection = this._selection, + obj = selection || this.hasHandles() + ? [point, this._handleIn, this._handleOut] + : point; + if (selection) + obj.push(selection); + return Base.serialize(obj, options, true, dictionary); + }, + + _changed: function(point) { + var path = this._path; + if (!path) + return; + var curves = path._curves, + index = this._index, + curve; + if (curves) { + if ((!point || point === this._point || point === this._handleIn) + && (curve = index > 0 ? curves[index - 1] : path._closed + ? curves[curves.length - 1] : null)) + curve._changed(); + if ((!point || point === this._point || point === this._handleOut) + && (curve = curves[index])) + curve._changed(); + } + path._changed(25); + }, + + getPoint: function() { + return this._point; + }, + + setPoint: function() { + this._point.set(Point.read(arguments)); + }, + + getHandleIn: function() { + return this._handleIn; + }, + + setHandleIn: function() { + this._handleIn.set(Point.read(arguments)); + }, + + getHandleOut: function() { + return this._handleOut; + }, + + setHandleOut: function() { + this._handleOut.set(Point.read(arguments)); + }, + + hasHandles: function() { + return !this._handleIn.isZero() || !this._handleOut.isZero(); + }, + + isSmooth: function() { + var handleIn = this._handleIn, + handleOut = this._handleOut; + return !handleIn.isZero() && !handleOut.isZero() + && handleIn.isCollinear(handleOut); + }, + + clearHandles: function() { + this._handleIn._set(0, 0); + this._handleOut._set(0, 0); + }, + + getSelection: function() { + return this._selection; + }, + + setSelection: function(selection) { + var oldSelection = this._selection, + path = this._path; + this._selection = selection = selection || 0; + if (path && selection !== oldSelection) { + path._updateSelection(this, oldSelection, selection); + path._changed(129); + } + }, + + _changeSelection: function(flag, selected) { + var selection = this._selection; + this.setSelection(selected ? selection | flag : selection & ~flag); + }, + + isSelected: function() { + return !!(this._selection & 7); + }, + + setSelected: function(selected) { + this._changeSelection(7, selected); + }, + + getIndex: function() { + return this._index !== undefined ? this._index : null; + }, + + getPath: function() { + return this._path || null; + }, + + getCurve: function() { + var path = this._path, + index = this._index; + if (path) { + if (index > 0 && !path._closed + && index === path._segments.length - 1) + index--; + return path.getCurves()[index] || null; + } + return null; + }, + + getLocation: function() { + var curve = this.getCurve(); + return curve + ? new CurveLocation(curve, this === curve._segment1 ? 0 : 1) + : null; + }, + + getNext: function() { + var segments = this._path && this._path._segments; + return segments && (segments[this._index + 1] + || this._path._closed && segments[0]) || null; + }, + + smooth: function(options, _first, _last) { + var opts = options || {}, + type = opts.type, + factor = opts.factor, + prev = this.getPrevious(), + next = this.getNext(), + p0 = (prev || this)._point, + p1 = this._point, + p2 = (next || this)._point, + d1 = p0.getDistance(p1), + d2 = p1.getDistance(p2); + if (!type || type === 'catmull-rom') { + var a = factor === undefined ? 0.5 : factor, + d1_a = Math.pow(d1, a), + d1_2a = d1_a * d1_a, + d2_a = Math.pow(d2, a), + d2_2a = d2_a * d2_a; + if (!_first && prev) { + var A = 2 * d2_2a + 3 * d2_a * d1_a + d1_2a, + N = 3 * d2_a * (d2_a + d1_a); + this.setHandleIn(N !== 0 + ? new Point( + (d2_2a * p0._x + A * p1._x - d1_2a * p2._x) / N - p1._x, + (d2_2a * p0._y + A * p1._y - d1_2a * p2._y) / N - p1._y) + : new Point()); + } + if (!_last && next) { + var A = 2 * d1_2a + 3 * d1_a * d2_a + d2_2a, + N = 3 * d1_a * (d1_a + d2_a); + this.setHandleOut(N !== 0 + ? new Point( + (d1_2a * p2._x + A * p1._x - d2_2a * p0._x) / N - p1._x, + (d1_2a * p2._y + A * p1._y - d2_2a * p0._y) / N - p1._y) + : new Point()); + } + } else if (type === 'geometric') { + if (prev && next) { + var vector = p0.subtract(p2), + t = factor === undefined ? 0.4 : factor, + k = t * d1 / (d1 + d2); + if (!_first) + this.setHandleIn(vector.multiply(k)); + if (!_last) + this.setHandleOut(vector.multiply(k - t)); + } + } else { + throw new Error('Smoothing method \'' + type + '\' not supported.'); + } + }, + + getPrevious: function() { + var segments = this._path && this._path._segments; + return segments && (segments[this._index - 1] + || this._path._closed && segments[segments.length - 1]) || null; + }, + + isFirst: function() { + return !this._index; + }, + + isLast: function() { + var path = this._path; + return path && this._index === path._segments.length - 1 || false; + }, + + reverse: function() { + var handleIn = this._handleIn, + handleOut = this._handleOut, + tmp = handleIn.clone(); + handleIn.set(handleOut); + handleOut.set(tmp); + }, + + reversed: function() { + return new Segment(this._point, this._handleOut, this._handleIn); + }, + + remove: function() { + return this._path ? !!this._path.removeSegment(this._index) : false; + }, + + clone: function() { + return new Segment(this._point, this._handleIn, this._handleOut); + }, + + equals: function(segment) { + return segment === this || segment && this._class === segment._class + && this._point.equals(segment._point) + && this._handleIn.equals(segment._handleIn) + && this._handleOut.equals(segment._handleOut) + || false; + }, + + toString: function() { + var parts = [ 'point: ' + this._point ]; + if (!this._handleIn.isZero()) + parts.push('handleIn: ' + this._handleIn); + if (!this._handleOut.isZero()) + parts.push('handleOut: ' + this._handleOut); + return '{ ' + parts.join(', ') + ' }'; + }, + + transform: function(matrix) { + this._transformCoordinates(matrix, new Array(6), true); + this._changed(); + }, + + interpolate: function(from, to, factor) { + var u = 1 - factor, + v = factor, + point1 = from._point, + point2 = to._point, + handleIn1 = from._handleIn, + handleIn2 = to._handleIn, + handleOut2 = to._handleOut, + handleOut1 = from._handleOut; + this._point._set( + u * point1._x + v * point2._x, + u * point1._y + v * point2._y, true); + this._handleIn._set( + u * handleIn1._x + v * handleIn2._x, + u * handleIn1._y + v * handleIn2._y, true); + this._handleOut._set( + u * handleOut1._x + v * handleOut2._x, + u * handleOut1._y + v * handleOut2._y, true); + this._changed(); + }, + + _transformCoordinates: function(matrix, coords, change) { + var point = this._point, + handleIn = !change || !this._handleIn.isZero() + ? this._handleIn : null, + handleOut = !change || !this._handleOut.isZero() + ? this._handleOut : null, + x = point._x, + y = point._y, + i = 2; + coords[0] = x; + coords[1] = y; + if (handleIn) { + coords[i++] = handleIn._x + x; + coords[i++] = handleIn._y + y; + } + if (handleOut) { + coords[i++] = handleOut._x + x; + coords[i++] = handleOut._y + y; + } + if (matrix) { + matrix._transformCoordinates(coords, coords, i / 2); + x = coords[0]; + y = coords[1]; + if (change) { + point._x = x; + point._y = y; + i = 2; + if (handleIn) { + handleIn._x = coords[i++] - x; + handleIn._y = coords[i++] - y; + } + if (handleOut) { + handleOut._x = coords[i++] - x; + handleOut._y = coords[i++] - y; + } + } else { + if (!handleIn) { + coords[i++] = x; + coords[i++] = y; + } + if (!handleOut) { + coords[i++] = x; + coords[i++] = y; + } + } + } + return coords; + } +}); + +var SegmentPoint = Point.extend({ + initialize: function SegmentPoint(point, owner, key) { + var x, y, + selected; + if (!point) { + x = y = 0; + } else if ((x = point[0]) !== undefined) { + y = point[1]; + } else { + var pt = point; + if ((x = pt.x) === undefined) { + pt = Point.read(arguments); + x = pt.x; + } + y = pt.y; + selected = pt.selected; + } + this._x = x; + this._y = y; + this._owner = owner; + owner[key] = this; + if (selected) + this.setSelected(true); + }, + + _set: function(x, y) { + this._x = x; + this._y = y; + this._owner._changed(this); + return this; + }, + + getX: function() { + return this._x; + }, + + setX: function(x) { + this._x = x; + this._owner._changed(this); + }, + + getY: function() { + return this._y; + }, + + setY: function(y) { + this._y = y; + this._owner._changed(this); + }, + + isZero: function() { + var isZero = Numerical.isZero; + return isZero(this._x) && isZero(this._y); + }, + + isSelected: function() { + return !!(this._owner._selection & this._getSelection()); + }, + + setSelected: function(selected) { + this._owner._changeSelection(this._getSelection(), selected); + }, + + _getSelection: function() { + var owner = this._owner; + return this === owner._point ? 1 + : this === owner._handleIn ? 2 + : this === owner._handleOut ? 4 + : 0; + } +}); + +var Curve = Base.extend({ + _class: 'Curve', + beans: true, + + initialize: function Curve(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + var count = arguments.length, + seg1, seg2, + point1, point2, + handle1, handle2; + if (count === 3) { + this._path = arg0; + seg1 = arg1; + seg2 = arg2; + } else if (!count) { + seg1 = new Segment(); + seg2 = new Segment(); + } else if (count === 1) { + if ('segment1' in arg0) { + seg1 = new Segment(arg0.segment1); + seg2 = new Segment(arg0.segment2); + } else if ('point1' in arg0) { + point1 = arg0.point1; + handle1 = arg0.handle1; + handle2 = arg0.handle2; + point2 = arg0.point2; + } else if (Array.isArray(arg0)) { + point1 = [arg0[0], arg0[1]]; + point2 = [arg0[6], arg0[7]]; + handle1 = [arg0[2] - arg0[0], arg0[3] - arg0[1]]; + handle2 = [arg0[4] - arg0[6], arg0[5] - arg0[7]]; + } + } else if (count === 2) { + seg1 = new Segment(arg0); + seg2 = new Segment(arg1); + } else if (count === 4) { + point1 = arg0; + handle1 = arg1; + handle2 = arg2; + point2 = arg3; + } else if (count === 8) { + point1 = [arg0, arg1]; + point2 = [arg6, arg7]; + handle1 = [arg2 - arg0, arg3 - arg1]; + handle2 = [arg4 - arg6, arg5 - arg7]; + } + this._segment1 = seg1 || new Segment(point1, null, handle1); + this._segment2 = seg2 || new Segment(point2, handle2, null); + }, + + _serialize: function(options, dictionary) { + return Base.serialize(this.hasHandles() + ? [this.getPoint1(), this.getHandle1(), this.getHandle2(), + this.getPoint2()] + : [this.getPoint1(), this.getPoint2()], + options, true, dictionary); + }, + + _changed: function() { + this._length = this._bounds = undefined; + }, + + clone: function() { + return new Curve(this._segment1, this._segment2); + }, + + toString: function() { + var parts = [ 'point1: ' + this._segment1._point ]; + if (!this._segment1._handleOut.isZero()) + parts.push('handle1: ' + this._segment1._handleOut); + if (!this._segment2._handleIn.isZero()) + parts.push('handle2: ' + this._segment2._handleIn); + parts.push('point2: ' + this._segment2._point); + return '{ ' + parts.join(', ') + ' }'; + }, + + classify: function() { + return Curve.classify(this.getValues()); + }, + + remove: function() { + var removed = false; + if (this._path) { + var segment2 = this._segment2, + handleOut = segment2._handleOut; + removed = segment2.remove(); + if (removed) + this._segment1._handleOut.set(handleOut); + } + return removed; + }, + + getPoint1: function() { + return this._segment1._point; + }, + + setPoint1: function() { + this._segment1._point.set(Point.read(arguments)); + }, + + getPoint2: function() { + return this._segment2._point; + }, + + setPoint2: function() { + this._segment2._point.set(Point.read(arguments)); + }, + + getHandle1: function() { + return this._segment1._handleOut; + }, + + setHandle1: function() { + this._segment1._handleOut.set(Point.read(arguments)); + }, + + getHandle2: function() { + return this._segment2._handleIn; + }, + + setHandle2: function() { + this._segment2._handleIn.set(Point.read(arguments)); + }, + + getSegment1: function() { + return this._segment1; + }, + + getSegment2: function() { + return this._segment2; + }, + + getPath: function() { + return this._path; + }, + + getIndex: function() { + return this._segment1._index; + }, + + getNext: function() { + var curves = this._path && this._path._curves; + return curves && (curves[this._segment1._index + 1] + || this._path._closed && curves[0]) || null; + }, + + getPrevious: function() { + var curves = this._path && this._path._curves; + return curves && (curves[this._segment1._index - 1] + || this._path._closed && curves[curves.length - 1]) || null; + }, + + isFirst: function() { + return !this._segment1._index; + }, + + isLast: function() { + var path = this._path; + return path && this._segment1._index === path._curves.length - 1 + || false; + }, + + isSelected: function() { + return this.getPoint1().isSelected() + && this.getHandle1().isSelected() + && this.getHandle2().isSelected() + && this.getPoint2().isSelected(); + }, + + setSelected: function(selected) { + this.getPoint1().setSelected(selected); + this.getHandle1().setSelected(selected); + this.getHandle2().setSelected(selected); + this.getPoint2().setSelected(selected); + }, + + getValues: function(matrix) { + return Curve.getValues(this._segment1, this._segment2, matrix); + }, + + getPoints: function() { + var coords = this.getValues(), + points = []; + for (var i = 0; i < 8; i += 2) + points.push(new Point(coords[i], coords[i + 1])); + return points; + } +}, { + getLength: function() { + if (this._length == null) + this._length = Curve.getLength(this.getValues(), 0, 1); + return this._length; + }, + + getArea: function() { + return Curve.getArea(this.getValues()); + }, + + getLine: function() { + return new Line(this._segment1._point, this._segment2._point); + }, + + getPart: function(from, to) { + return new Curve(Curve.getPart(this.getValues(), from, to)); + }, + + getPartLength: function(from, to) { + return Curve.getLength(this.getValues(), from, to); + }, + + divideAt: function(location) { + return this.divideAtTime(location && location.curve === this + ? location.time : this.getTimeAt(location)); + }, + + divideAtTime: function(time, _setHandles) { + var tMin = 1e-8, + tMax = 1 - tMin, + res = null; + if (time >= tMin && time <= tMax) { + var parts = Curve.subdivide(this.getValues(), time), + left = parts[0], + right = parts[1], + setHandles = _setHandles || this.hasHandles(), + seg1 = this._segment1, + seg2 = this._segment2, + path = this._path; + if (setHandles) { + seg1._handleOut._set(left[2] - left[0], left[3] - left[1]); + seg2._handleIn._set(right[4] - right[6],right[5] - right[7]); + } + var x = left[6], y = left[7], + segment = new Segment(new Point(x, y), + setHandles && new Point(left[4] - x, left[5] - y), + setHandles && new Point(right[2] - x, right[3] - y)); + if (path) { + path.insert(seg1._index + 1, segment); + res = this.getNext(); + } else { + this._segment2 = segment; + this._changed(); + res = new Curve(segment, seg2); + } + } + return res; + }, + + splitAt: function(location) { + var path = this._path; + return path ? path.splitAt(location) : null; + }, + + splitAtTime: function(time) { + return this.splitAt(this.getLocationAtTime(time)); + }, + + divide: function(offset, isTime) { + return this.divideAtTime(offset === undefined ? 0.5 : isTime ? offset + : this.getTimeAt(offset)); + }, + + split: function(offset, isTime) { + return this.splitAtTime(offset === undefined ? 0.5 : isTime ? offset + : this.getTimeAt(offset)); + }, + + reversed: function() { + return new Curve(this._segment2.reversed(), this._segment1.reversed()); + }, + + clearHandles: function() { + this._segment1._handleOut._set(0, 0); + this._segment2._handleIn._set(0, 0); + }, + +statics: { + getValues: function(segment1, segment2, matrix, straight) { + var p1 = segment1._point, + h1 = segment1._handleOut, + h2 = segment2._handleIn, + p2 = segment2._point, + x1 = p1.x, y1 = p1.y, + x2 = p2.x, y2 = p2.y, + values = straight + ? [ x1, y1, x1, y1, x2, y2, x2, y2 ] + : [ + x1, y1, + x1 + h1._x, y1 + h1._y, + x2 + h2._x, y2 + h2._y, + x2, y2 + ]; + if (matrix) + matrix._transformCoordinates(values, values, 4); + return values; + }, + + subdivide: function(v, t) { + var x0 = v[0], y0 = v[1], + x1 = v[2], y1 = v[3], + x2 = v[4], y2 = v[5], + x3 = v[6], y3 = v[7]; + if (t === undefined) + t = 0.5; + var u = 1 - t, + x4 = u * x0 + t * x1, y4 = u * y0 + t * y1, + x5 = u * x1 + t * x2, y5 = u * y1 + t * y2, + x6 = u * x2 + t * x3, y6 = u * y2 + t * y3, + x7 = u * x4 + t * x5, y7 = u * y4 + t * y5, + x8 = u * x5 + t * x6, y8 = u * y5 + t * y6, + x9 = u * x7 + t * x8, y9 = u * y7 + t * y8; + return [ + [x0, y0, x4, y4, x7, y7, x9, y9], + [x9, y9, x8, y8, x6, y6, x3, y3] + ]; + }, + + getMonoCurves: function(v, dir) { + var curves = [], + io = dir ? 0 : 1, + o0 = v[io + 0], + o1 = v[io + 2], + o2 = v[io + 4], + o3 = v[io + 6]; + if ((o0 >= o1) === (o1 >= o2) && (o1 >= o2) === (o2 >= o3) + || Curve.isStraight(v)) { + curves.push(v); + } else { + var a = 3 * (o1 - o2) - o0 + o3, + b = 2 * (o0 + o2) - 4 * o1, + c = o1 - o0, + tMin = 1e-8, + tMax = 1 - tMin, + roots = [], + n = Numerical.solveQuadratic(a, b, c, roots, tMin, tMax); + if (!n) { + curves.push(v); + } else { + roots.sort(); + var t = roots[0], + parts = Curve.subdivide(v, t); + curves.push(parts[0]); + if (n > 1) { + t = (roots[1] - t) / (1 - t); + parts = Curve.subdivide(parts[1], t); + curves.push(parts[0]); + } + curves.push(parts[1]); + } + } + return curves; + }, + + solveCubic: function (v, coord, val, roots, min, max) { + var v0 = v[coord], + v1 = v[coord + 2], + v2 = v[coord + 4], + v3 = v[coord + 6], + res = 0; + if ( !(v0 < val && v3 < val && v1 < val && v2 < val || + v0 > val && v3 > val && v1 > val && v2 > val)) { + var c = 3 * (v1 - v0), + b = 3 * (v2 - v1) - c, + a = v3 - v0 - c - b; + res = Numerical.solveCubic(a, b, c, v0 - val, roots, min, max); + } + return res; + }, + + getTimeOf: function(v, point) { + var p0 = new Point(v[0], v[1]), + p3 = new Point(v[6], v[7]), + epsilon = 1e-12, + geomEpsilon = 1e-7, + t = point.isClose(p0, epsilon) ? 0 + : point.isClose(p3, epsilon) ? 1 + : null; + if (t === null) { + var coords = [point.x, point.y], + roots = []; + for (var c = 0; c < 2; c++) { + var count = Curve.solveCubic(v, c, coords[c], roots, 0, 1); + for (var i = 0; i < count; i++) { + var u = roots[i]; + if (point.isClose(Curve.getPoint(v, u), geomEpsilon)) + return u; + } + } + } + return point.isClose(p0, geomEpsilon) ? 0 + : point.isClose(p3, geomEpsilon) ? 1 + : null; + }, + + getNearestTime: function(v, point) { + if (Curve.isStraight(v)) { + var x0 = v[0], y0 = v[1], + x3 = v[6], y3 = v[7], + vx = x3 - x0, vy = y3 - y0, + det = vx * vx + vy * vy; + if (det === 0) + return 0; + var u = ((point.x - x0) * vx + (point.y - y0) * vy) / det; + return u < 1e-12 ? 0 + : u > 0.999999999999 ? 1 + : Curve.getTimeOf(v, + new Point(x0 + u * vx, y0 + u * vy)); + } + + var count = 100, + minDist = Infinity, + minT = 0; + + function refine(t) { + if (t >= 0 && t <= 1) { + var dist = point.getDistance(Curve.getPoint(v, t), true); + if (dist < minDist) { + minDist = dist; + minT = t; + return true; + } + } + } + + for (var i = 0; i <= count; i++) + refine(i / count); + + var step = 1 / (count * 2); + while (step > 1e-8) { + if (!refine(minT - step) && !refine(minT + step)) + step /= 2; + } + return minT; + }, + + getPart: function(v, from, to) { + var flip = from > to; + if (flip) { + var tmp = from; + from = to; + to = tmp; + } + if (from > 0) + v = Curve.subdivide(v, from)[1]; + if (to < 1) + v = Curve.subdivide(v, (to - from) / (1 - from))[0]; + return flip + ? [v[6], v[7], v[4], v[5], v[2], v[3], v[0], v[1]] + : v; + }, + + isFlatEnough: function(v, flatness) { + var x0 = v[0], y0 = v[1], + x1 = v[2], y1 = v[3], + x2 = v[4], y2 = v[5], + x3 = v[6], y3 = v[7], + ux = 3 * x1 - 2 * x0 - x3, + uy = 3 * y1 - 2 * y0 - y3, + vx = 3 * x2 - 2 * x3 - x0, + vy = 3 * y2 - 2 * y3 - y0; + return Math.max(ux * ux, vx * vx) + Math.max(uy * uy, vy * vy) + <= 16 * flatness * flatness; + }, + + getArea: function(v) { + var x0 = v[0], y0 = v[1], + x1 = v[2], y1 = v[3], + x2 = v[4], y2 = v[5], + x3 = v[6], y3 = v[7]; + return 3 * ((y3 - y0) * (x1 + x2) - (x3 - x0) * (y1 + y2) + + y1 * (x0 - x2) - x1 * (y0 - y2) + + y3 * (x2 + x0 / 3) - x3 * (y2 + y0 / 3)) / 20; + }, + + getBounds: function(v) { + var min = v.slice(0, 2), + max = min.slice(), + roots = [0, 0]; + for (var i = 0; i < 2; i++) + Curve._addBounds(v[i], v[i + 2], v[i + 4], v[i + 6], + i, 0, min, max, roots); + return new Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]); + }, + + _addBounds: function(v0, v1, v2, v3, coord, padding, min, max, roots) { + function add(value, padding) { + var left = value - padding, + right = value + padding; + if (left < min[coord]) + min[coord] = left; + if (right > max[coord]) + max[coord] = right; + } + + padding /= 2; + var minPad = min[coord] - padding, + maxPad = max[coord] + padding; + if ( v0 < minPad || v1 < minPad || v2 < minPad || v3 < minPad || + v0 > maxPad || v1 > maxPad || v2 > maxPad || v3 > maxPad) { + if (v1 < v0 != v1 < v3 && v2 < v0 != v2 < v3) { + add(v0, padding); + add(v3, padding); + } else { + var a = 3 * (v1 - v2) - v0 + v3, + b = 2 * (v0 + v2) - 4 * v1, + c = v1 - v0, + count = Numerical.solveQuadratic(a, b, c, roots), + tMin = 1e-8, + tMax = 1 - tMin; + add(v3, 0); + for (var i = 0; i < count; i++) { + var t = roots[i], + u = 1 - t; + if (tMin <= t && t <= tMax) + add(u * u * u * v0 + + 3 * u * u * t * v1 + + 3 * u * t * t * v2 + + t * t * t * v3, + padding); + } + } + } + } +}}, Base.each( + ['getBounds', 'getStrokeBounds', 'getHandleBounds'], + function(name) { + this[name] = function() { + if (!this._bounds) + this._bounds = {}; + var bounds = this._bounds[name]; + if (!bounds) { + bounds = this._bounds[name] = Path[name]( + [this._segment1, this._segment2], false, this._path); + } + return bounds.clone(); + }; + }, +{ + +}), Base.each({ + isStraight: function(p1, h1, h2, p2) { + if (h1.isZero() && h2.isZero()) { + return true; + } else { + var v = p2.subtract(p1); + if (v.isZero()) { + return false; + } else if (v.isCollinear(h1) && v.isCollinear(h2)) { + var l = new Line(p1, p2), + epsilon = 1e-7; + if (l.getDistance(p1.add(h1)) < epsilon && + l.getDistance(p2.add(h2)) < epsilon) { + var div = v.dot(v), + s1 = v.dot(h1) / div, + s2 = v.dot(h2) / div; + return s1 >= 0 && s1 <= 1 && s2 <= 0 && s2 >= -1; + } + } + } + return false; + }, + + isLinear: function(p1, h1, h2, p2) { + var third = p2.subtract(p1).divide(3); + return h1.equals(third) && h2.negate().equals(third); + } +}, function(test, name) { + this[name] = function(epsilon) { + var seg1 = this._segment1, + seg2 = this._segment2; + return test(seg1._point, seg1._handleOut, seg2._handleIn, seg2._point, + epsilon); + }; + + this.statics[name] = function(v, epsilon) { + var x0 = v[0], y0 = v[1], + x3 = v[6], y3 = v[7]; + return test( + new Point(x0, y0), + new Point(v[2] - x0, v[3] - y0), + new Point(v[4] - x3, v[5] - y3), + new Point(x3, y3), epsilon); + }; +}, { + statics: {}, + + hasHandles: function() { + return !this._segment1._handleOut.isZero() + || !this._segment2._handleIn.isZero(); + }, + + hasLength: function(epsilon) { + return (!this.getPoint1().equals(this.getPoint2()) || this.hasHandles()) + && this.getLength() > (epsilon || 0); + }, + + isCollinear: function(curve) { + return curve && this.isStraight() && curve.isStraight() + && this.getLine().isCollinear(curve.getLine()); + }, + + isHorizontal: function() { + return this.isStraight() && Math.abs(this.getTangentAtTime(0.5).y) + < 1e-8; + }, + + isVertical: function() { + return this.isStraight() && Math.abs(this.getTangentAtTime(0.5).x) + < 1e-8; + } +}), { + beans: false, + + getLocationAt: function(offset, _isTime) { + return this.getLocationAtTime( + _isTime ? offset : this.getTimeAt(offset)); + }, + + getLocationAtTime: function(t) { + return t != null && t >= 0 && t <= 1 + ? new CurveLocation(this, t) + : null; + }, + + getTimeAt: function(offset, start) { + return Curve.getTimeAt(this.getValues(), offset, start); + }, + + getParameterAt: '#getTimeAt', + + getOffsetAtTime: function(t) { + return this.getPartLength(0, t); + }, + + getLocationOf: function() { + return this.getLocationAtTime(this.getTimeOf(Point.read(arguments))); + }, + + getOffsetOf: function() { + var loc = this.getLocationOf.apply(this, arguments); + return loc ? loc.getOffset() : null; + }, + + getTimeOf: function() { + return Curve.getTimeOf(this.getValues(), Point.read(arguments)); + }, + + getParameterOf: '#getTimeOf', + + getNearestLocation: function() { + var point = Point.read(arguments), + values = this.getValues(), + t = Curve.getNearestTime(values, point), + pt = Curve.getPoint(values, t); + return new CurveLocation(this, t, pt, null, point.getDistance(pt)); + }, + + getNearestPoint: function() { + var loc = this.getNearestLocation.apply(this, arguments); + return loc ? loc.getPoint() : loc; + } + +}, +new function() { + var methods = ['getPoint', 'getTangent', 'getNormal', 'getWeightedTangent', + 'getWeightedNormal', 'getCurvature']; + return Base.each(methods, + function(name) { + this[name + 'At'] = function(location, _isTime) { + var values = this.getValues(); + return Curve[name](values, _isTime ? location + : Curve.getTimeAt(values, location)); + }; + + this[name + 'AtTime'] = function(time) { + return Curve[name](this.getValues(), time); + }; + }, { + statics: { + _evaluateMethods: methods + } + } + ); +}, +new function() { + + function getLengthIntegrand(v) { + var x0 = v[0], y0 = v[1], + x1 = v[2], y1 = v[3], + x2 = v[4], y2 = v[5], + x3 = v[6], y3 = v[7], + + ax = 9 * (x1 - x2) + 3 * (x3 - x0), + bx = 6 * (x0 + x2) - 12 * x1, + cx = 3 * (x1 - x0), + + ay = 9 * (y1 - y2) + 3 * (y3 - y0), + by = 6 * (y0 + y2) - 12 * y1, + cy = 3 * (y1 - y0); + + return function(t) { + var dx = (ax * t + bx) * t + cx, + dy = (ay * t + by) * t + cy; + return Math.sqrt(dx * dx + dy * dy); + }; + } + + function getIterations(a, b) { + return Math.max(2, Math.min(16, Math.ceil(Math.abs(b - a) * 32))); + } + + function evaluate(v, t, type, normalized) { + if (t == null || t < 0 || t > 1) + return null; + var x0 = v[0], y0 = v[1], + x1 = v[2], y1 = v[3], + x2 = v[4], y2 = v[5], + x3 = v[6], y3 = v[7], + isZero = Numerical.isZero; + if (isZero(x1 - x0) && isZero(y1 - y0)) { + x1 = x0; + y1 = y0; + } + if (isZero(x2 - x3) && isZero(y2 - y3)) { + x2 = x3; + y2 = y3; + } + var cx = 3 * (x1 - x0), + bx = 3 * (x2 - x1) - cx, + ax = x3 - x0 - cx - bx, + cy = 3 * (y1 - y0), + by = 3 * (y2 - y1) - cy, + ay = y3 - y0 - cy - by, + x, y; + if (type === 0) { + x = t === 0 ? x0 : t === 1 ? x3 + : ((ax * t + bx) * t + cx) * t + x0; + y = t === 0 ? y0 : t === 1 ? y3 + : ((ay * t + by) * t + cy) * t + y0; + } else { + var tMin = 1e-8, + tMax = 1 - tMin; + if (t < tMin) { + x = cx; + y = cy; + } else if (t > tMax) { + x = 3 * (x3 - x2); + y = 3 * (y3 - y2); + } else { + x = (3 * ax * t + 2 * bx) * t + cx; + y = (3 * ay * t + 2 * by) * t + cy; + } + if (normalized) { + if (x === 0 && y === 0 && (t < tMin || t > tMax)) { + x = x2 - x1; + y = y2 - y1; + } + var len = Math.sqrt(x * x + y * y); + if (len) { + x /= len; + y /= len; + } + } + if (type === 3) { + var x2 = 6 * ax * t + 2 * bx, + y2 = 6 * ay * t + 2 * by, + d = Math.pow(x * x + y * y, 3 / 2); + x = d !== 0 ? (x * y2 - y * x2) / d : 0; + y = 0; + } + } + return type === 2 ? new Point(y, -x) : new Point(x, y); + } + + return { statics: { + + classify: function(v) { + + var x0 = v[0], y0 = v[1], + x1 = v[2], y1 = v[3], + x2 = v[4], y2 = v[5], + x3 = v[6], y3 = v[7], + a1 = x0 * (y3 - y2) + y0 * (x2 - x3) + x3 * y2 - y3 * x2, + a2 = x1 * (y0 - y3) + y1 * (x3 - x0) + x0 * y3 - y0 * x3, + a3 = x2 * (y1 - y0) + y2 * (x0 - x1) + x1 * y0 - y1 * x0, + d3 = 3 * a3, + d2 = d3 - a2, + d1 = d2 - a2 + a1, + l = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3), + s = l !== 0 ? 1 / l : 0, + isZero = Numerical.isZero, + serpentine = 'serpentine'; + d1 *= s; + d2 *= s; + d3 *= s; + + function type(type, t1, t2) { + var hasRoots = t1 !== undefined, + t1Ok = hasRoots && t1 > 0 && t1 < 1, + t2Ok = hasRoots && t2 > 0 && t2 < 1; + if (hasRoots && (!(t1Ok || t2Ok) + || type === 'loop' && !(t1Ok && t2Ok))) { + type = 'arch'; + t1Ok = t2Ok = false; + } + return { + type: type, + roots: t1Ok || t2Ok + ? t1Ok && t2Ok + ? t1 < t2 ? [t1, t2] : [t2, t1] + : [t1Ok ? t1 : t2] + : null + }; + } + + if (isZero(d1)) { + return isZero(d2) + ? type(isZero(d3) ? 'line' : 'quadratic') + : type(serpentine, d3 / (3 * d2)); + } + var d = 3 * d2 * d2 - 4 * d1 * d3; + if (isZero(d)) { + return type('cusp', d2 / (2 * d1)); + } + var f1 = d > 0 ? Math.sqrt(d / 3) : Math.sqrt(-d), + f2 = 2 * d1; + return type(d > 0 ? serpentine : 'loop', + (d2 + f1) / f2, + (d2 - f1) / f2); + }, + + getLength: function(v, a, b, ds) { + if (a === undefined) + a = 0; + if (b === undefined) + b = 1; + if (Curve.isStraight(v)) { + var c = v; + if (b < 1) { + c = Curve.subdivide(c, b)[0]; + a /= b; + } + if (a > 0) { + c = Curve.subdivide(c, a)[1]; + } + var dx = c[6] - c[0], + dy = c[7] - c[1]; + return Math.sqrt(dx * dx + dy * dy); + } + return Numerical.integrate(ds || getLengthIntegrand(v), a, b, + getIterations(a, b)); + }, + + getTimeAt: function(v, offset, start) { + if (start === undefined) + start = offset < 0 ? 1 : 0; + if (offset === 0) + return start; + var abs = Math.abs, + epsilon = 1e-12, + forward = offset > 0, + a = forward ? start : 0, + b = forward ? 1 : start, + ds = getLengthIntegrand(v), + rangeLength = Curve.getLength(v, a, b, ds), + diff = abs(offset) - rangeLength; + if (abs(diff) < epsilon) { + return forward ? b : a; + } else if (diff > epsilon) { + return null; + } + var guess = offset / rangeLength, + length = 0; + function f(t) { + length += Numerical.integrate(ds, start, t, + getIterations(start, t)); + start = t; + return length - offset; + } + return Numerical.findRoot(f, ds, start + guess, a, b, 32, + 1e-12); + }, + + getPoint: function(v, t) { + return evaluate(v, t, 0, false); + }, + + getTangent: function(v, t) { + return evaluate(v, t, 1, true); + }, + + getWeightedTangent: function(v, t) { + return evaluate(v, t, 1, false); + }, + + getNormal: function(v, t) { + return evaluate(v, t, 2, true); + }, + + getWeightedNormal: function(v, t) { + return evaluate(v, t, 2, false); + }, + + getCurvature: function(v, t) { + return evaluate(v, t, 3, false).x; + }, + + getPeaks: function(v) { + var x0 = v[0], y0 = v[1], + x1 = v[2], y1 = v[3], + x2 = v[4], y2 = v[5], + x3 = v[6], y3 = v[7], + ax = -x0 + 3 * x1 - 3 * x2 + x3, + bx = 3 * x0 - 6 * x1 + 3 * x2, + cx = -3 * x0 + 3 * x1, + ay = -y0 + 3 * y1 - 3 * y2 + y3, + by = 3 * y0 - 6 * y1 + 3 * y2, + cy = -3 * y0 + 3 * y1, + tMin = 1e-8, + tMax = 1 - tMin, + roots = []; + Numerical.solveCubic( + 9 * (ax * ax + ay * ay), + 9 * (ax * bx + by * ay), + 2 * (bx * bx + by * by) + 3 * (cx * ax + cy * ay), + (cx * bx + by * cy), + roots, tMin, tMax); + return roots.sort(); + } + }}; +}, +new function() { + + function addLocation(locations, include, c1, t1, c2, t2, overlap) { + var excludeStart = !overlap && c1.getPrevious() === c2, + excludeEnd = !overlap && c1 !== c2 && c1.getNext() === c2, + tMin = 1e-8, + tMax = 1 - tMin; + if (t1 !== null && t1 >= (excludeStart ? tMin : 0) && + t1 <= (excludeEnd ? tMax : 1)) { + if (t2 !== null && t2 >= (excludeEnd ? tMin : 0) && + t2 <= (excludeStart ? tMax : 1)) { + var loc1 = new CurveLocation(c1, t1, null, overlap), + loc2 = new CurveLocation(c2, t2, null, overlap); + loc1._intersection = loc2; + loc2._intersection = loc1; + if (!include || include(loc1)) { + CurveLocation.insert(locations, loc1, true); + } + } + } + } + + function addCurveIntersections(v1, v2, c1, c2, locations, include, flip, + recursion, calls, tMin, tMax, uMin, uMax) { + if (++calls >= 4096 || ++recursion >= 40) + return calls; + var fatLineEpsilon = 1e-9, + q0x = v2[0], q0y = v2[1], q3x = v2[6], q3y = v2[7], + getSignedDistance = Line.getSignedDistance, + d1 = getSignedDistance(q0x, q0y, q3x, q3y, v2[2], v2[3]), + d2 = getSignedDistance(q0x, q0y, q3x, q3y, v2[4], v2[5]), + factor = d1 * d2 > 0 ? 3 / 4 : 4 / 9, + dMin = factor * Math.min(0, d1, d2), + dMax = factor * Math.max(0, d1, d2), + dp0 = getSignedDistance(q0x, q0y, q3x, q3y, v1[0], v1[1]), + dp1 = getSignedDistance(q0x, q0y, q3x, q3y, v1[2], v1[3]), + dp2 = getSignedDistance(q0x, q0y, q3x, q3y, v1[4], v1[5]), + dp3 = getSignedDistance(q0x, q0y, q3x, q3y, v1[6], v1[7]), + hull = getConvexHull(dp0, dp1, dp2, dp3), + top = hull[0], + bottom = hull[1], + tMinClip, + tMaxClip; + if (d1 === 0 && d2 === 0 + && dp0 === 0 && dp1 === 0 && dp2 === 0 && dp3 === 0 + || (tMinClip = clipConvexHull(top, bottom, dMin, dMax)) == null + || (tMaxClip = clipConvexHull(top.reverse(), bottom.reverse(), + dMin, dMax)) == null) + return calls; + var tMinNew = tMin + (tMax - tMin) * tMinClip, + tMaxNew = tMin + (tMax - tMin) * tMaxClip; + if (Math.max(uMax - uMin, tMaxNew - tMinNew) < fatLineEpsilon) { + var t = (tMinNew + tMaxNew) / 2, + u = (uMin + uMax) / 2; + addLocation(locations, include, + flip ? c2 : c1, flip ? u : t, + flip ? c1 : c2, flip ? t : u); + } else { + v1 = Curve.getPart(v1, tMinClip, tMaxClip); + if (tMaxClip - tMinClip > 0.8) { + if (tMaxNew - tMinNew > uMax - uMin) { + var parts = Curve.subdivide(v1, 0.5), + t = (tMinNew + tMaxNew) / 2; + calls = addCurveIntersections( + v2, parts[0], c2, c1, locations, include, !flip, + recursion, calls, uMin, uMax, tMinNew, t); + calls = addCurveIntersections( + v2, parts[1], c2, c1, locations, include, !flip, + recursion, calls, uMin, uMax, t, tMaxNew); + } else { + var parts = Curve.subdivide(v2, 0.5), + u = (uMin + uMax) / 2; + calls = addCurveIntersections( + parts[0], v1, c2, c1, locations, include, !flip, + recursion, calls, uMin, u, tMinNew, tMaxNew); + calls = addCurveIntersections( + parts[1], v1, c2, c1, locations, include, !flip, + recursion, calls, u, uMax, tMinNew, tMaxNew); + } + } else { + if (uMax - uMin >= fatLineEpsilon) { + calls = addCurveIntersections( + v2, v1, c2, c1, locations, include, !flip, + recursion, calls, uMin, uMax, tMinNew, tMaxNew); + } else { + calls = addCurveIntersections( + v1, v2, c1, c2, locations, include, flip, + recursion, calls, tMinNew, tMaxNew, uMin, uMax); + } + } + } + return calls; + } + + function getConvexHull(dq0, dq1, dq2, dq3) { + var p0 = [ 0, dq0 ], + p1 = [ 1 / 3, dq1 ], + p2 = [ 2 / 3, dq2 ], + p3 = [ 1, dq3 ], + dist1 = dq1 - (2 * dq0 + dq3) / 3, + dist2 = dq2 - (dq0 + 2 * dq3) / 3, + hull; + if (dist1 * dist2 < 0) { + hull = [[p0, p1, p3], [p0, p2, p3]]; + } else { + var distRatio = dist1 / dist2; + hull = [ + distRatio >= 2 ? [p0, p1, p3] + : distRatio <= 0.5 ? [p0, p2, p3] + : [p0, p1, p2, p3], + [p0, p3] + ]; + } + return (dist1 || dist2) < 0 ? hull.reverse() : hull; + } + + function clipConvexHull(hullTop, hullBottom, dMin, dMax) { + if (hullTop[0][1] < dMin) { + return clipConvexHullPart(hullTop, true, dMin); + } else if (hullBottom[0][1] > dMax) { + return clipConvexHullPart(hullBottom, false, dMax); + } else { + return hullTop[0][0]; + } + } + + function clipConvexHullPart(part, top, threshold) { + var px = part[0][0], + py = part[0][1]; + for (var i = 1, l = part.length; i < l; i++) { + var qx = part[i][0], + qy = part[i][1]; + if (top ? qy >= threshold : qy <= threshold) { + return qy === threshold ? qx + : px + (threshold - py) * (qx - px) / (qy - py); + } + px = qx; + py = qy; + } + return null; + } + + function getCurveLineIntersections(v, px, py, vx, vy) { + var isZero = Numerical.isZero; + if (isZero(vx) && isZero(vy)) { + var t = Curve.getTimeOf(v, new Point(px, py)); + return t === null ? [] : [t]; + } + var angle = Math.atan2(-vy, vx), + sin = Math.sin(angle), + cos = Math.cos(angle), + rv = [], + roots = []; + for (var i = 0; i < 8; i += 2) { + var x = v[i] - px, + y = v[i + 1] - py; + rv.push( + x * cos - y * sin, + x * sin + y * cos); + } + Curve.solveCubic(rv, 1, 0, roots, 0, 1); + return roots; + } + + function addCurveLineIntersections(v1, v2, c1, c2, locations, include, + flip) { + var x1 = v2[0], y1 = v2[1], + x2 = v2[6], y2 = v2[7], + roots = getCurveLineIntersections(v1, x1, y1, x2 - x1, y2 - y1); + for (var i = 0, l = roots.length; i < l; i++) { + var t1 = roots[i], + p1 = Curve.getPoint(v1, t1), + t2 = Curve.getTimeOf(v2, p1); + if (t2 !== null) { + addLocation(locations, include, + flip ? c2 : c1, flip ? t2 : t1, + flip ? c1 : c2, flip ? t1 : t2); + } + } + } + + function addLineIntersection(v1, v2, c1, c2, locations, include) { + var pt = Line.intersect( + v1[0], v1[1], v1[6], v1[7], + v2[0], v2[1], v2[6], v2[7]); + if (pt) { + addLocation(locations, include, + c1, Curve.getTimeOf(v1, pt), + c2, Curve.getTimeOf(v2, pt)); + } + } + + function getCurveIntersections(v1, v2, c1, c2, locations, include) { + var epsilon = 1e-12, + min = Math.min, + max = Math.max; + + if (max(v1[0], v1[2], v1[4], v1[6]) + epsilon > + min(v2[0], v2[2], v2[4], v2[6]) && + min(v1[0], v1[2], v1[4], v1[6]) - epsilon < + max(v2[0], v2[2], v2[4], v2[6]) && + max(v1[1], v1[3], v1[5], v1[7]) + epsilon > + min(v2[1], v2[3], v2[5], v2[7]) && + min(v1[1], v1[3], v1[5], v1[7]) - epsilon < + max(v2[1], v2[3], v2[5], v2[7])) { + var overlaps = getOverlaps(v1, v2); + if (overlaps) { + for (var i = 0; i < 2; i++) { + var overlap = overlaps[i]; + addLocation(locations, include, + c1, overlap[0], + c2, overlap[1], true); + } + } else { + var straight1 = Curve.isStraight(v1), + straight2 = Curve.isStraight(v2), + straight = straight1 && straight2, + flip = straight1 && !straight2, + before = locations.length; + (straight + ? addLineIntersection + : straight1 || straight2 + ? addCurveLineIntersections + : addCurveIntersections)( + flip ? v2 : v1, flip ? v1 : v2, + flip ? c2 : c1, flip ? c1 : c2, + locations, include, flip, + 0, 0, 0, 1, 0, 1); + if (!straight || locations.length === before) { + for (var i = 0; i < 4; i++) { + var t1 = i >> 1, + t2 = i & 1, + i1 = t1 * 6, + i2 = t2 * 6, + p1 = new Point(v1[i1], v1[i1 + 1]), + p2 = new Point(v2[i2], v2[i2 + 1]); + if (p1.isClose(p2, epsilon)) { + addLocation(locations, include, + c1, t1, + c2, t2); + } + } + } + } + } + return locations; + } + + function getLoopIntersection(v1, c1, locations, include) { + var info = Curve.classify(v1); + if (info.type === 'loop') { + var roots = info.roots; + addLocation(locations, include, + c1, roots[0], + c1, roots[1]); + } + return locations; + } + + function getIntersections(curves1, curves2, include, matrix1, matrix2, + _returnFirst) { + var self = !curves2; + if (self) + curves2 = curves1; + var length1 = curves1.length, + length2 = curves2.length, + values2 = [], + arrays = [], + locations, + current; + for (var i = 0; i < length2; i++) + values2[i] = curves2[i].getValues(matrix2); + for (var i = 0; i < length1; i++) { + var curve1 = curves1[i], + values1 = self ? values2[i] : curve1.getValues(matrix1), + path1 = curve1.getPath(); + if (path1 !== current) { + current = path1; + locations = []; + arrays.push(locations); + } + if (self) { + getLoopIntersection(values1, curve1, locations, include); + } + for (var j = self ? i + 1 : 0; j < length2; j++) { + if (_returnFirst && locations.length) + return locations; + getCurveIntersections(values1, values2[j], curve1, curves2[j], + locations, include); + } + } + locations = []; + for (var i = 0, l = arrays.length; i < l; i++) { + locations.push.apply(locations, arrays[i]); + } + return locations; + } + + function getOverlaps(v1, v2) { + + function getSquaredLineLength(v) { + var x = v[6] - v[0], + y = v[7] - v[1]; + return x * x + y * y; + } + + var abs = Math.abs, + getDistance = Line.getDistance, + timeEpsilon = 1e-8, + geomEpsilon = 1e-7, + straight1 = Curve.isStraight(v1), + straight2 = Curve.isStraight(v2), + straightBoth = straight1 && straight2, + flip = getSquaredLineLength(v1) < getSquaredLineLength(v2), + l1 = flip ? v2 : v1, + l2 = flip ? v1 : v2, + px = l1[0], py = l1[1], + vx = l1[6] - px, vy = l1[7] - py; + if (getDistance(px, py, vx, vy, l2[0], l2[1], true) < geomEpsilon && + getDistance(px, py, vx, vy, l2[6], l2[7], true) < geomEpsilon) { + if (!straightBoth && + getDistance(px, py, vx, vy, l1[2], l1[3], true) < geomEpsilon && + getDistance(px, py, vx, vy, l1[4], l1[5], true) < geomEpsilon && + getDistance(px, py, vx, vy, l2[2], l2[3], true) < geomEpsilon && + getDistance(px, py, vx, vy, l2[4], l2[5], true) < geomEpsilon) { + straight1 = straight2 = straightBoth = true; + } + } else if (straightBoth) { + return null; + } + if (straight1 ^ straight2) { + return null; + } + + var v = [v1, v2], + pairs = []; + for (var i = 0; i < 4 && pairs.length < 2; i++) { + var i1 = i & 1, + i2 = i1 ^ 1, + t1 = i >> 1, + t2 = Curve.getTimeOf(v[i1], new Point( + v[i2][t1 ? 6 : 0], + v[i2][t1 ? 7 : 1])); + if (t2 != null) { + var pair = i1 ? [t1, t2] : [t2, t1]; + if (!pairs.length || + abs(pair[0] - pairs[0][0]) > timeEpsilon && + abs(pair[1] - pairs[0][1]) > timeEpsilon) { + pairs.push(pair); + } + } + if (i > 2 && !pairs.length) + break; + } + if (pairs.length !== 2) { + pairs = null; + } else if (!straightBoth) { + var o1 = Curve.getPart(v1, pairs[0][0], pairs[1][0]), + o2 = Curve.getPart(v2, pairs[0][1], pairs[1][1]); + if (abs(o2[2] - o1[2]) > geomEpsilon || + abs(o2[3] - o1[3]) > geomEpsilon || + abs(o2[4] - o1[4]) > geomEpsilon || + abs(o2[5] - o1[5]) > geomEpsilon) + pairs = null; + } + return pairs; + } + + return { + getIntersections: function(curve) { + var v1 = this.getValues(), + v2 = curve && curve !== this && curve.getValues(); + return v2 ? getCurveIntersections(v1, v2, this, curve, []) + : getLoopIntersection(v1, this, []); + }, + + statics: { + getOverlaps: getOverlaps, + getIntersections: getIntersections, + getCurveLineIntersections: getCurveLineIntersections + } + }; +}); + +var CurveLocation = Base.extend({ + _class: 'CurveLocation', + + initialize: function CurveLocation(curve, time, point, _overlap, _distance) { + if (time >= 0.99999999) { + var next = curve.getNext(); + if (next) { + time = 0; + curve = next; + } + } + this._setCurve(curve); + this._time = time; + this._point = point || curve.getPointAtTime(time); + this._overlap = _overlap; + this._distance = _distance; + this._intersection = this._next = this._previous = null; + }, + + _setCurve: function(curve) { + var path = curve._path; + this._path = path; + this._version = path ? path._version : 0; + this._curve = curve; + this._segment = null; + this._segment1 = curve._segment1; + this._segment2 = curve._segment2; + }, + + _setSegment: function(segment) { + this._setCurve(segment.getCurve()); + this._segment = segment; + this._time = segment === this._segment1 ? 0 : 1; + this._point = segment._point.clone(); + }, + + getSegment: function() { + var segment = this._segment; + if (!segment) { + var curve = this.getCurve(), + time = this.getTime(); + if (time === 0) { + segment = curve._segment1; + } else if (time === 1) { + segment = curve._segment2; + } else if (time != null) { + segment = curve.getPartLength(0, time) + < curve.getPartLength(time, 1) + ? curve._segment1 + : curve._segment2; + } + this._segment = segment; + } + return segment; + }, + + getCurve: function() { + var path = this._path, + that = this; + if (path && path._version !== this._version) { + this._time = this._offset = this._curveOffset = this._curve = null; + } + + function trySegment(segment) { + var curve = segment && segment.getCurve(); + if (curve && (that._time = curve.getTimeOf(that._point)) != null) { + that._setCurve(curve); + return curve; + } + } + + return this._curve + || trySegment(this._segment) + || trySegment(this._segment1) + || trySegment(this._segment2.getPrevious()); + }, + + getPath: function() { + var curve = this.getCurve(); + return curve && curve._path; + }, + + getIndex: function() { + var curve = this.getCurve(); + return curve && curve.getIndex(); + }, + + getTime: function() { + var curve = this.getCurve(), + time = this._time; + return curve && time == null + ? this._time = curve.getTimeOf(this._point) + : time; + }, + + getParameter: '#getTime', + + getPoint: function() { + return this._point; + }, + + getOffset: function() { + var offset = this._offset; + if (offset == null) { + offset = 0; + var path = this.getPath(), + index = this.getIndex(); + if (path && index != null) { + var curves = path.getCurves(); + for (var i = 0; i < index; i++) + offset += curves[i].getLength(); + } + this._offset = offset += this.getCurveOffset(); + } + return offset; + }, + + getCurveOffset: function() { + var offset = this._curveOffset; + if (offset == null) { + var curve = this.getCurve(), + time = this.getTime(); + this._curveOffset = offset = time != null && curve + && curve.getPartLength(0, time); + } + return offset; + }, + + getIntersection: function() { + return this._intersection; + }, + + getDistance: function() { + return this._distance; + }, + + divide: function() { + var curve = this.getCurve(), + res = curve && curve.divideAtTime(this.getTime()); + if (res) { + this._setSegment(res._segment1); + } + return res; + }, + + split: function() { + var curve = this.getCurve(), + path = curve._path, + res = curve && curve.splitAtTime(this.getTime()); + if (res) { + this._setSegment(path.getLastSegment()); + } + return res; + }, + + equals: function(loc, _ignoreOther) { + var res = this === loc; + if (!res && loc instanceof CurveLocation) { + var c1 = this.getCurve(), + c2 = loc.getCurve(), + p1 = c1._path, + p2 = c2._path; + if (p1 === p2) { + var abs = Math.abs, + epsilon = 1e-7, + diff = abs(this.getOffset() - loc.getOffset()), + i1 = !_ignoreOther && this._intersection, + i2 = !_ignoreOther && loc._intersection; + res = (diff < epsilon + || p1 && abs(p1.getLength() - diff) < epsilon) + && (!i1 && !i2 || i1 && i2 && i1.equals(i2, true)); + } + } + return res; + }, + + toString: function() { + var parts = [], + point = this.getPoint(), + f = Formatter.instance; + if (point) + parts.push('point: ' + point); + var index = this.getIndex(); + if (index != null) + parts.push('index: ' + index); + var time = this.getTime(); + if (time != null) + parts.push('time: ' + f.number(time)); + if (this._distance != null) + parts.push('distance: ' + f.number(this._distance)); + return '{ ' + parts.join(', ') + ' }'; + }, + + isTouching: function() { + var inter = this._intersection; + if (inter && this.getTangent().isCollinear(inter.getTangent())) { + var curve1 = this.getCurve(), + curve2 = inter.getCurve(); + return !(curve1.isStraight() && curve2.isStraight() + && curve1.getLine().intersect(curve2.getLine())); + } + return false; + }, + + isCrossing: function() { + var inter = this._intersection; + if (!inter) + return false; + var t1 = this.getTime(), + t2 = inter.getTime(), + tMin = 1e-8, + tMax = 1 - tMin, + t1Inside = t1 >= tMin && t1 <= tMax, + t2Inside = t2 >= tMin && t2 <= tMax; + if (t1Inside && t2Inside) + return !this.isTouching(); + var c2 = this.getCurve(), + c1 = t1 < tMin ? c2.getPrevious() : c2, + c4 = inter.getCurve(), + c3 = t2 < tMin ? c4.getPrevious() : c4; + if (t1 > tMax) + c2 = c2.getNext(); + if (t2 > tMax) + c4 = c4.getNext(); + if (!c1 || !c2 || !c3 || !c4) + return false; + + var offsets = []; + + function addOffsets(curve, end) { + var v = curve.getValues(), + roots = Curve.classify(v).roots || Curve.getPeaks(v), + count = roots.length, + t = end && count > 1 ? roots[count - 1] + : count > 0 ? roots[0] + : 0.5; + offsets.push(Curve.getLength(v, end ? t : 0, end ? 1 : t) / 2); + } + + function isInRange(angle, min, max) { + return min < max + ? angle > min && angle < max + : angle > min || angle < max; + } + + if (!t1Inside) { + addOffsets(c1, true); + addOffsets(c2, false); + } + if (!t2Inside) { + addOffsets(c3, true); + addOffsets(c4, false); + } + var pt = this.getPoint(), + offset = Math.min.apply(Math, offsets), + v2 = t1Inside ? c2.getTangentAtTime(t1) + : c2.getPointAt(offset).subtract(pt), + v1 = t1Inside ? v2.negate() + : c1.getPointAt(-offset).subtract(pt), + v4 = t2Inside ? c4.getTangentAtTime(t2) + : c4.getPointAt(offset).subtract(pt), + v3 = t2Inside ? v4.negate() + : c3.getPointAt(-offset).subtract(pt), + a1 = v1.getAngle(), + a2 = v2.getAngle(), + a3 = v3.getAngle(), + a4 = v4.getAngle(); + return !!(t1Inside + ? (isInRange(a1, a3, a4) ^ isInRange(a2, a3, a4)) && + (isInRange(a1, a4, a3) ^ isInRange(a2, a4, a3)) + : (isInRange(a3, a1, a2) ^ isInRange(a4, a1, a2)) && + (isInRange(a3, a2, a1) ^ isInRange(a4, a2, a1))); + }, + + hasOverlap: function() { + return !!this._overlap; + } +}, Base.each(Curve._evaluateMethods, function(name) { + var get = name + 'At'; + this[name] = function() { + var curve = this.getCurve(), + time = this.getTime(); + return time != null && curve && curve[get](time, true); + }; +}, { + preserve: true +}), +new function() { + + function insert(locations, loc, merge) { + var length = locations.length, + l = 0, + r = length - 1; + + function search(index, dir) { + for (var i = index + dir; i >= -1 && i <= length; i += dir) { + var loc2 = locations[((i % length) + length) % length]; + if (!loc.getPoint().isClose(loc2.getPoint(), + 1e-7)) + break; + if (loc.equals(loc2)) + return loc2; + } + return null; + } + + while (l <= r) { + var m = (l + r) >>> 1, + loc2 = locations[m], + found; + if (merge && (found = loc.equals(loc2) ? loc2 + : (search(m, -1) || search(m, 1)))) { + if (loc._overlap) { + found._overlap = found._intersection._overlap = true; + } + return found; + } + var path1 = loc.getPath(), + path2 = loc2.getPath(), + diff = path1 !== path2 + ? path1._id - path2._id + : (loc.getIndex() + loc.getTime()) + - (loc2.getIndex() + loc2.getTime()); + if (diff < 0) { + r = m - 1; + } else { + l = m + 1; + } + } + locations.splice(l, 0, loc); + return loc; + } + + return { statics: { + insert: insert, + + expand: function(locations) { + var expanded = locations.slice(); + for (var i = locations.length - 1; i >= 0; i--) { + insert(expanded, locations[i]._intersection, false); + } + return expanded; + } + }}; +}); + +var PathItem = Item.extend({ + _class: 'PathItem', + _selectBounds: false, + _canScaleStroke: true, + beans: true, + + initialize: function PathItem() { + }, + + statics: { + create: function(arg) { + var data, + segments, + compound; + if (Base.isPlainObject(arg)) { + segments = arg.segments; + data = arg.pathData; + } else if (Array.isArray(arg)) { + segments = arg; + } else if (typeof arg === 'string') { + data = arg; + } + if (segments) { + var first = segments[0]; + compound = first && Array.isArray(first[0]); + } else if (data) { + compound = (data.match(/m/gi) || []).length > 1 + || /z\s*\S+/i.test(data); + } + var ctor = compound ? CompoundPath : Path; + return new ctor(arg); + } + }, + + _asPathItem: function() { + return this; + }, + + isClockwise: function() { + return this.getArea() >= 0; + }, + + setClockwise: function(clockwise) { + if (this.isClockwise() != (clockwise = !!clockwise)) + this.reverse(); + }, + + setPathData: function(data) { + + var parts = data && data.match(/[mlhvcsqtaz][^mlhvcsqtaz]*/ig), + coords, + relative = false, + previous, + control, + current = new Point(), + start = new Point(); + + function getCoord(index, coord) { + var val = +coords[index]; + if (relative) + val += current[coord]; + return val; + } + + function getPoint(index) { + return new Point( + getCoord(index, 'x'), + getCoord(index + 1, 'y') + ); + } + + this.clear(); + + for (var i = 0, l = parts && parts.length; i < l; i++) { + var part = parts[i], + command = part[0], + lower = command.toLowerCase(); + coords = part.match(/[+-]?(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g); + var length = coords && coords.length; + relative = command === lower; + if (previous === 'z' && !/[mz]/.test(lower)) + this.moveTo(current); + switch (lower) { + case 'm': + case 'l': + var move = lower === 'm'; + for (var j = 0; j < length; j += 2) { + this[move ? 'moveTo' : 'lineTo'](current = getPoint(j)); + if (move) { + start = current; + move = false; + } + } + control = current; + break; + case 'h': + case 'v': + var coord = lower === 'h' ? 'x' : 'y'; + current = current.clone(); + for (var j = 0; j < length; j++) { + current[coord] = getCoord(j, coord); + this.lineTo(current); + } + control = current; + break; + case 'c': + for (var j = 0; j < length; j += 6) { + this.cubicCurveTo( + getPoint(j), + control = getPoint(j + 2), + current = getPoint(j + 4)); + } + break; + case 's': + for (var j = 0; j < length; j += 4) { + this.cubicCurveTo( + /[cs]/.test(previous) + ? current.multiply(2).subtract(control) + : current, + control = getPoint(j), + current = getPoint(j + 2)); + previous = lower; + } + break; + case 'q': + for (var j = 0; j < length; j += 4) { + this.quadraticCurveTo( + control = getPoint(j), + current = getPoint(j + 2)); + } + break; + case 't': + for (var j = 0; j < length; j += 2) { + this.quadraticCurveTo( + control = (/[qt]/.test(previous) + ? current.multiply(2).subtract(control) + : current), + current = getPoint(j)); + previous = lower; + } + break; + case 'a': + for (var j = 0; j < length; j += 7) { + this.arcTo(current = getPoint(j + 5), + new Size(+coords[j], +coords[j + 1]), + +coords[j + 2], +coords[j + 4], +coords[j + 3]); + } + break; + case 'z': + this.closePath(1e-12); + current = start; + break; + } + previous = lower; + } + }, + + _canComposite: function() { + return !(this.hasFill() && this.hasStroke()); + }, + + _contains: function(point) { + var winding = point.isInside( + this.getBounds({ internal: true, handle: true })) + ? this._getWinding(point) + : {}; + return winding.onPath || !!(this.getFillRule() === 'evenodd' + ? winding.windingL & 1 || winding.windingR & 1 + : winding.winding); + }, + + getIntersections: function(path, include, _matrix, _returnFirst) { + var self = this === path || !path, + matrix1 = this._matrix._orNullIfIdentity(), + matrix2 = self ? matrix1 + : (_matrix || path._matrix)._orNullIfIdentity(); + return self || this.getBounds(matrix1).intersects( + path.getBounds(matrix2), 1e-12) + ? Curve.getIntersections( + this.getCurves(), !self && path.getCurves(), include, + matrix1, matrix2, _returnFirst) + : []; + }, + + getCrossings: function(path) { + return this.getIntersections(path, function(inter) { + return inter.hasOverlap() || inter.isCrossing(); + }); + }, + + getNearestLocation: function() { + var point = Point.read(arguments), + curves = this.getCurves(), + minDist = Infinity, + minLoc = null; + for (var i = 0, l = curves.length; i < l; i++) { + var loc = curves[i].getNearestLocation(point); + if (loc._distance < minDist) { + minDist = loc._distance; + minLoc = loc; + } + } + return minLoc; + }, + + getNearestPoint: function() { + var loc = this.getNearestLocation.apply(this, arguments); + return loc ? loc.getPoint() : loc; + }, + + interpolate: function(from, to, factor) { + var isPath = !this._children, + name = isPath ? '_segments' : '_children', + itemsFrom = from[name], + itemsTo = to[name], + items = this[name]; + if (!itemsFrom || !itemsTo || itemsFrom.length !== itemsTo.length) { + throw new Error('Invalid operands in interpolate() call: ' + + from + ', ' + to); + } + var current = items.length, + length = itemsTo.length; + if (current < length) { + var ctor = isPath ? Segment : Path; + for (var i = current; i < length; i++) { + this.add(new ctor()); + } + } else if (current > length) { + this[isPath ? 'removeSegments' : 'removeChildren'](length, current); + } + for (var i = 0; i < length; i++) { + items[i].interpolate(itemsFrom[i], itemsTo[i], factor); + } + if (isPath) { + this.setClosed(from._closed); + this._changed(9); + } + }, + + compare: function(path) { + var ok = false; + if (path) { + var paths1 = this._children || [this], + paths2 = path._children ? path._children.slice() : [path], + length1 = paths1.length, + length2 = paths2.length, + matched = [], + count = 0; + ok = true; + for (var i1 = length1 - 1; i1 >= 0 && ok; i1--) { + var path1 = paths1[i1]; + ok = false; + for (var i2 = length2 - 1; i2 >= 0 && !ok; i2--) { + if (path1.compare(paths2[i2])) { + if (!matched[i2]) { + matched[i2] = true; + count++; + } + ok = true; + } + } + } + ok = ok && count === length2; + } + return ok; + }, + +}); + +var Path = PathItem.extend({ + _class: 'Path', + _serializeFields: { + segments: [], + closed: false + }, + + initialize: function Path(arg) { + this._closed = false; + this._segments = []; + this._version = 0; + var segments = Array.isArray(arg) + ? typeof arg[0] === 'object' + ? arg + : arguments + : arg && (arg.size === undefined && (arg.x !== undefined + || arg.point !== undefined)) + ? arguments + : null; + if (segments && segments.length > 0) { + this.setSegments(segments); + } else { + this._curves = undefined; + this._segmentSelection = 0; + if (!segments && typeof arg === 'string') { + this.setPathData(arg); + arg = null; + } + } + this._initialize(!segments && arg); + }, + + _equals: function(item) { + return this._closed === item._closed + && Base.equals(this._segments, item._segments); + }, + + copyContent: function(source) { + this.setSegments(source._segments); + this._closed = source._closed; + }, + + _changed: function _changed(flags) { + _changed.base.call(this, flags); + if (flags & 8) { + this._length = this._area = undefined; + if (flags & 16) { + this._version++; + } else if (this._curves) { + for (var i = 0, l = this._curves.length; i < l; i++) + this._curves[i]._changed(); + } + } else if (flags & 32) { + this._bounds = undefined; + } + }, + + getStyle: function() { + var parent = this._parent; + return (parent instanceof CompoundPath ? parent : this)._style; + }, + + getSegments: function() { + return this._segments; + }, + + setSegments: function(segments) { + var fullySelected = this.isFullySelected(), + length = segments && segments.length; + this._segments.length = 0; + this._segmentSelection = 0; + this._curves = undefined; + if (length) { + var last = segments[length - 1]; + if (typeof last === 'boolean') { + this.setClosed(last); + length--; + } + this._add(Segment.readList(segments, 0, {}, length)); + } + if (fullySelected) + this.setFullySelected(true); + }, + + getFirstSegment: function() { + return this._segments[0]; + }, + + getLastSegment: function() { + return this._segments[this._segments.length - 1]; + }, + + getCurves: function() { + var curves = this._curves, + segments = this._segments; + if (!curves) { + var length = this._countCurves(); + curves = this._curves = new Array(length); + for (var i = 0; i < length; i++) + curves[i] = new Curve(this, segments[i], + segments[i + 1] || segments[0]); + } + return curves; + }, + + getFirstCurve: function() { + return this.getCurves()[0]; + }, + + getLastCurve: function() { + var curves = this.getCurves(); + return curves[curves.length - 1]; + }, + + isClosed: function() { + return this._closed; + }, + + setClosed: function(closed) { + if (this._closed != (closed = !!closed)) { + this._closed = closed; + if (this._curves) { + var length = this._curves.length = this._countCurves(); + if (closed) + this._curves[length - 1] = new Curve(this, + this._segments[length - 1], this._segments[0]); + } + this._changed(25); + } + } +}, { + beans: true, + + getPathData: function(_matrix, _precision) { + var segments = this._segments, + length = segments.length, + f = new Formatter(_precision), + coords = new Array(6), + first = true, + curX, curY, + prevX, prevY, + inX, inY, + outX, outY, + parts = []; + + function addSegment(segment, skipLine) { + segment._transformCoordinates(_matrix, coords); + curX = coords[0]; + curY = coords[1]; + if (first) { + parts.push('M' + f.pair(curX, curY)); + first = false; + } else { + inX = coords[2]; + inY = coords[3]; + if (inX === curX && inY === curY + && outX === prevX && outY === prevY) { + if (!skipLine) { + var dx = curX - prevX, + dy = curY - prevY; + parts.push( + dx === 0 ? 'v' + f.number(dy) + : dy === 0 ? 'h' + f.number(dx) + : 'l' + f.pair(dx, dy)); + } + } else { + parts.push('c' + f.pair(outX - prevX, outY - prevY) + + ' ' + f.pair( inX - prevX, inY - prevY) + + ' ' + f.pair(curX - prevX, curY - prevY)); + } + } + prevX = curX; + prevY = curY; + outX = coords[4]; + outY = coords[5]; + } + + if (!length) + return ''; + + for (var i = 0; i < length; i++) + addSegment(segments[i]); + if (this._closed && length > 0) { + addSegment(segments[0], true); + parts.push('z'); + } + return parts.join(''); + }, + + isEmpty: function() { + return !this._segments.length; + }, + + _transformContent: function(matrix) { + var segments = this._segments, + coords = new Array(6); + for (var i = 0, l = segments.length; i < l; i++) + segments[i]._transformCoordinates(matrix, coords, true); + return true; + }, + + _add: function(segs, index) { + var segments = this._segments, + curves = this._curves, + amount = segs.length, + append = index == null, + index = append ? segments.length : index; + for (var i = 0; i < amount; i++) { + var segment = segs[i]; + if (segment._path) + segment = segs[i] = segment.clone(); + segment._path = this; + segment._index = index + i; + if (segment._selection) + this._updateSelection(segment, 0, segment._selection); + } + if (append) { + segments.push.apply(segments, segs); + } else { + segments.splice.apply(segments, [index, 0].concat(segs)); + for (var i = index + amount, l = segments.length; i < l; i++) + segments[i]._index = i; + } + if (curves) { + var total = this._countCurves(), + start = index > 0 && index + amount - 1 === total ? index - 1 + : index, + insert = start, + end = Math.min(start + amount, total); + if (segs._curves) { + curves.splice.apply(curves, [start, 0].concat(segs._curves)); + insert += segs._curves.length; + } + for (var i = insert; i < end; i++) + curves.splice(i, 0, new Curve(this, null, null)); + this._adjustCurves(start, end); + } + this._changed(25); + return segs; + }, + + _adjustCurves: function(start, end) { + var segments = this._segments, + curves = this._curves, + curve; + for (var i = start; i < end; i++) { + curve = curves[i]; + curve._path = this; + curve._segment1 = segments[i]; + curve._segment2 = segments[i + 1] || segments[0]; + curve._changed(); + } + if (curve = curves[this._closed && !start ? segments.length - 1 + : start - 1]) { + curve._segment2 = segments[start] || segments[0]; + curve._changed(); + } + if (curve = curves[end]) { + curve._segment1 = segments[end]; + curve._changed(); + } + }, + + _countCurves: function() { + var length = this._segments.length; + return !this._closed && length > 0 ? length - 1 : length; + }, + + add: function(segment1 ) { + return arguments.length > 1 && typeof segment1 !== 'number' + ? this._add(Segment.readList(arguments)) + : this._add([ Segment.read(arguments) ])[0]; + }, + + insert: function(index, segment1 ) { + return arguments.length > 2 && typeof segment1 !== 'number' + ? this._add(Segment.readList(arguments, 1), index) + : this._add([ Segment.read(arguments, 1) ], index)[0]; + }, + + addSegment: function() { + return this._add([ Segment.read(arguments) ])[0]; + }, + + insertSegment: function(index ) { + return this._add([ Segment.read(arguments, 1) ], index)[0]; + }, + + addSegments: function(segments) { + return this._add(Segment.readList(segments)); + }, + + insertSegments: function(index, segments) { + return this._add(Segment.readList(segments), index); + }, + + removeSegment: function(index) { + return this.removeSegments(index, index + 1)[0] || null; + }, + + removeSegments: function(start, end, _includeCurves) { + start = start || 0; + end = Base.pick(end, this._segments.length); + var segments = this._segments, + curves = this._curves, + count = segments.length, + removed = segments.splice(start, end - start), + amount = removed.length; + if (!amount) + return removed; + for (var i = 0; i < amount; i++) { + var segment = removed[i]; + if (segment._selection) + this._updateSelection(segment, segment._selection, 0); + segment._index = segment._path = null; + } + for (var i = start, l = segments.length; i < l; i++) + segments[i]._index = i; + if (curves) { + var index = start > 0 && end === count + (this._closed ? 1 : 0) + ? start - 1 + : start, + curves = curves.splice(index, amount); + for (var i = curves.length - 1; i >= 0; i--) + curves[i]._path = null; + if (_includeCurves) + removed._curves = curves.slice(1); + this._adjustCurves(index, index); + } + this._changed(25); + return removed; + }, + + clear: '#removeSegments', + + hasHandles: function() { + var segments = this._segments; + for (var i = 0, l = segments.length; i < l; i++) { + if (segments[i].hasHandles()) + return true; + } + return false; + }, + + clearHandles: function() { + var segments = this._segments; + for (var i = 0, l = segments.length; i < l; i++) + segments[i].clearHandles(); + }, + + getLength: function() { + if (this._length == null) { + var curves = this.getCurves(), + length = 0; + for (var i = 0, l = curves.length; i < l; i++) + length += curves[i].getLength(); + this._length = length; + } + return this._length; + }, + + getArea: function() { + var area = this._area; + if (area == null) { + var segments = this._segments, + closed = this._closed; + area = 0; + for (var i = 0, l = segments.length; i < l; i++) { + var last = i + 1 === l; + area += Curve.getArea(Curve.getValues( + segments[i], segments[last ? 0 : i + 1], + null, last && !closed)); + } + this._area = area; + } + return area; + }, + + isFullySelected: function() { + var length = this._segments.length; + return this.isSelected() && length > 0 && this._segmentSelection + === length * 7; + }, + + setFullySelected: function(selected) { + if (selected) + this._selectSegments(true); + this.setSelected(selected); + }, + + setSelection: function setSelection(selection) { + if (!(selection & 1)) + this._selectSegments(false); + setSelection.base.call(this, selection); + }, + + _selectSegments: function(selected) { + var segments = this._segments, + length = segments.length, + selection = selected ? 7 : 0; + this._segmentSelection = selection * length; + for (var i = 0; i < length; i++) + segments[i]._selection = selection; + }, + + _updateSelection: function(segment, oldSelection, newSelection) { + segment._selection = newSelection; + var selection = this._segmentSelection += newSelection - oldSelection; + if (selection > 0) + this.setSelected(true); + }, + + divideAt: function(location) { + var loc = this.getLocationAt(location), + curve; + return loc && (curve = loc.getCurve().divideAt(loc.getCurveOffset())) + ? curve._segment1 + : null; + }, + + splitAt: function(location) { + var loc = this.getLocationAt(location), + index = loc && loc.index, + time = loc && loc.time, + tMin = 1e-8, + tMax = 1 - tMin; + if (time > tMax) { + index++; + time = 0; + } + var curves = this.getCurves(); + if (index >= 0 && index < curves.length) { + if (time >= tMin) { + curves[index++].divideAtTime(time); + } + var segs = this.removeSegments(index, this._segments.length, true), + path; + if (this._closed) { + this.setClosed(false); + path = this; + } else { + path = new Path(Item.NO_INSERT); + path.insertAbove(this); + path.copyAttributes(this); + } + path._add(segs, 0); + this.addSegment(segs[0]); + return path; + } + return null; + }, + + split: function(index, time) { + var curve, + location = time === undefined ? index + : (curve = this.getCurves()[index]) + && curve.getLocationAtTime(time); + return location != null ? this.splitAt(location) : null; + }, + + join: function(path, tolerance) { + var epsilon = tolerance || 0; + if (path && path !== this) { + var segments = path._segments, + last1 = this.getLastSegment(), + last2 = path.getLastSegment(); + if (!last2) + return this; + if (last1 && last1._point.isClose(last2._point, epsilon)) + path.reverse(); + var first2 = path.getFirstSegment(); + if (last1 && last1._point.isClose(first2._point, epsilon)) { + last1.setHandleOut(first2._handleOut); + this._add(segments.slice(1)); + } else { + var first1 = this.getFirstSegment(); + if (first1 && first1._point.isClose(first2._point, epsilon)) + path.reverse(); + last2 = path.getLastSegment(); + if (first1 && first1._point.isClose(last2._point, epsilon)) { + first1.setHandleIn(last2._handleIn); + this._add(segments.slice(0, segments.length - 1), 0); + } else { + this._add(segments.slice()); + } + } + if (path._closed) + this._add([segments[0]]); + path.remove(); + } + var first = this.getFirstSegment(), + last = this.getLastSegment(); + if (first !== last && first._point.isClose(last._point, epsilon)) { + first.setHandleIn(last._handleIn); + last.remove(); + this.setClosed(true); + } + return this; + }, + + reduce: function(options) { + var curves = this.getCurves(), + simplify = options && options.simplify, + tolerance = simplify ? 1e-7 : 0; + for (var i = curves.length - 1; i >= 0; i--) { + var curve = curves[i]; + if (!curve.hasHandles() && (!curve.hasLength(tolerance) + || simplify && curve.isCollinear(curve.getNext()))) + curve.remove(); + } + return this; + }, + + reverse: function() { + this._segments.reverse(); + for (var i = 0, l = this._segments.length; i < l; i++) { + var segment = this._segments[i]; + var handleIn = segment._handleIn; + segment._handleIn = segment._handleOut; + segment._handleOut = handleIn; + segment._index = i; + } + this._curves = null; + this._changed(9); + }, + + flatten: function(flatness) { + var flattener = new PathFlattener(this, flatness || 0.25, 256, true), + parts = flattener.parts, + length = parts.length, + segments = []; + for (var i = 0; i < length; i++) { + segments.push(new Segment(parts[i].curve.slice(0, 2))); + } + if (!this._closed && length > 0) { + segments.push(new Segment(parts[length - 1].curve.slice(6))); + } + this.setSegments(segments); + }, + + simplify: function(tolerance) { + var segments = new PathFitter(this).fit(tolerance || 2.5); + if (segments) + this.setSegments(segments); + return !!segments; + }, + + smooth: function(options) { + var that = this, + opts = options || {}, + type = opts.type || 'asymmetric', + segments = this._segments, + length = segments.length, + closed = this._closed; + + function getIndex(value, _default) { + var index = value && value.index; + if (index != null) { + var path = value.path; + if (path && path !== that) + throw new Error(value._class + ' ' + index + ' of ' + path + + ' is not part of ' + that); + if (_default && value instanceof Curve) + index++; + } else { + index = typeof value === 'number' ? value : _default; + } + return Math.min(index < 0 && closed + ? index % length + : index < 0 ? index + length : index, length - 1); + } + + var loop = closed && opts.from === undefined && opts.to === undefined, + from = getIndex(opts.from, 0), + to = getIndex(opts.to, length - 1); + + if (from > to) { + if (closed) { + from -= length; + } else { + var tmp = from; + from = to; + to = tmp; + } + } + if (/^(?:asymmetric|continuous)$/.test(type)) { + var asymmetric = type === 'asymmetric', + min = Math.min, + amount = to - from + 1, + n = amount - 1, + padding = loop ? min(amount, 4) : 1, + paddingLeft = padding, + paddingRight = padding, + knots = []; + if (!closed) { + paddingLeft = min(1, from); + paddingRight = min(1, length - to - 1); + } + n += paddingLeft + paddingRight; + if (n <= 1) + return; + for (var i = 0, j = from - paddingLeft; i <= n; i++, j++) { + knots[i] = segments[(j < 0 ? j + length : j) % length]._point; + } + + var x = knots[0]._x + 2 * knots[1]._x, + y = knots[0]._y + 2 * knots[1]._y, + f = 2, + n_1 = n - 1, + rx = [x], + ry = [y], + rf = [f], + px = [], + py = []; + for (var i = 1; i < n; i++) { + var internal = i < n_1, + a = internal ? 1 : asymmetric ? 1 : 2, + b = internal ? 4 : asymmetric ? 2 : 7, + u = internal ? 4 : asymmetric ? 3 : 8, + v = internal ? 2 : asymmetric ? 0 : 1, + m = a / f; + f = rf[i] = b - m; + x = rx[i] = u * knots[i]._x + v * knots[i + 1]._x - m * x; + y = ry[i] = u * knots[i]._y + v * knots[i + 1]._y - m * y; + } + + px[n_1] = rx[n_1] / rf[n_1]; + py[n_1] = ry[n_1] / rf[n_1]; + for (var i = n - 2; i >= 0; i--) { + px[i] = (rx[i] - px[i + 1]) / rf[i]; + py[i] = (ry[i] - py[i + 1]) / rf[i]; + } + px[n] = (3 * knots[n]._x - px[n_1]) / 2; + py[n] = (3 * knots[n]._y - py[n_1]) / 2; + + for (var i = paddingLeft, max = n - paddingRight, j = from; + i <= max; i++, j++) { + var segment = segments[j < 0 ? j + length : j], + pt = segment._point, + hx = px[i] - pt._x, + hy = py[i] - pt._y; + if (loop || i < max) + segment.setHandleOut(hx, hy); + if (loop || i > paddingLeft) + segment.setHandleIn(-hx, -hy); + } + } else { + for (var i = from; i <= to; i++) { + segments[i < 0 ? i + length : i].smooth(opts, + !loop && i === from, !loop && i === to); + } + } + }, + + toShape: function(insert) { + if (!this._closed) + return null; + + var segments = this._segments, + type, + size, + radius, + topCenter; + + function isCollinear(i, j) { + var seg1 = segments[i], + seg2 = seg1.getNext(), + seg3 = segments[j], + seg4 = seg3.getNext(); + return seg1._handleOut.isZero() && seg2._handleIn.isZero() + && seg3._handleOut.isZero() && seg4._handleIn.isZero() + && seg2._point.subtract(seg1._point).isCollinear( + seg4._point.subtract(seg3._point)); + } + + function isOrthogonal(i) { + var seg2 = segments[i], + seg1 = seg2.getPrevious(), + seg3 = seg2.getNext(); + return seg1._handleOut.isZero() && seg2._handleIn.isZero() + && seg2._handleOut.isZero() && seg3._handleIn.isZero() + && seg2._point.subtract(seg1._point).isOrthogonal( + seg3._point.subtract(seg2._point)); + } + + function isArc(i) { + var seg1 = segments[i], + seg2 = seg1.getNext(), + handle1 = seg1._handleOut, + handle2 = seg2._handleIn, + kappa = 0.5522847498307936; + if (handle1.isOrthogonal(handle2)) { + var pt1 = seg1._point, + pt2 = seg2._point, + corner = new Line(pt1, handle1, true).intersect( + new Line(pt2, handle2, true), true); + return corner && Numerical.isZero(handle1.getLength() / + corner.subtract(pt1).getLength() - kappa) + && Numerical.isZero(handle2.getLength() / + corner.subtract(pt2).getLength() - kappa); + } + return false; + } + + function getDistance(i, j) { + return segments[i]._point.getDistance(segments[j]._point); + } + + if (!this.hasHandles() && segments.length === 4 + && isCollinear(0, 2) && isCollinear(1, 3) && isOrthogonal(1)) { + type = Shape.Rectangle; + size = new Size(getDistance(0, 3), getDistance(0, 1)); + topCenter = segments[1]._point.add(segments[2]._point).divide(2); + } else if (segments.length === 8 && isArc(0) && isArc(2) && isArc(4) + && isArc(6) && isCollinear(1, 5) && isCollinear(3, 7)) { + type = Shape.Rectangle; + size = new Size(getDistance(1, 6), getDistance(0, 3)); + radius = size.subtract(new Size(getDistance(0, 7), + getDistance(1, 2))).divide(2); + topCenter = segments[3]._point.add(segments[4]._point).divide(2); + } else if (segments.length === 4 + && isArc(0) && isArc(1) && isArc(2) && isArc(3)) { + if (Numerical.isZero(getDistance(0, 2) - getDistance(1, 3))) { + type = Shape.Circle; + radius = getDistance(0, 2) / 2; + } else { + type = Shape.Ellipse; + radius = new Size(getDistance(2, 0) / 2, getDistance(3, 1) / 2); + } + topCenter = segments[1]._point; + } + + if (type) { + var center = this.getPosition(true), + shape = new type({ + center: center, + size: size, + radius: radius, + insert: false + }); + shape.copyAttributes(this, true); + shape._matrix.prepend(this._matrix); + shape.rotate(topCenter.subtract(center).getAngle() + 90); + if (insert === undefined || insert) + shape.insertAbove(this); + return shape; + } + return null; + }, + + toPath: '#clone', + + compare: function compare(path) { + if (!path || path instanceof CompoundPath) + return compare.base.call(this, path); + var curves1 = this.getCurves(), + curves2 = path.getCurves(), + length1 = curves1.length, + length2 = curves2.length; + if (!length1 || !length2) { + return length1 == length2; + } + var v1 = curves1[0].getValues(), + values2 = [], + pos1 = 0, pos2, + end1 = 0, end2; + for (var i = 0; i < length2; i++) { + var v2 = curves2[i].getValues(); + values2.push(v2); + var overlaps = Curve.getOverlaps(v1, v2); + if (overlaps) { + pos2 = !i && overlaps[0][0] > 0 ? length2 - 1 : i; + end2 = overlaps[0][1]; + break; + } + } + var abs = Math.abs, + epsilon = 1e-8, + v2 = values2[pos2], + start2; + while (v1 && v2) { + var overlaps = Curve.getOverlaps(v1, v2); + if (overlaps) { + var t1 = overlaps[0][0]; + if (abs(t1 - end1) < epsilon) { + end1 = overlaps[1][0]; + if (end1 === 1) { + v1 = ++pos1 < length1 ? curves1[pos1].getValues() : null; + end1 = 0; + } + var t2 = overlaps[0][1]; + if (abs(t2 - end2) < epsilon) { + if (!start2) + start2 = [pos2, t2]; + end2 = overlaps[1][1]; + if (end2 === 1) { + if (++pos2 >= length2) + pos2 = 0; + v2 = values2[pos2] || curves2[pos2].getValues(); + end2 = 0; + } + if (!v1) { + return start2[0] === pos2 && start2[1] === end2; + } + continue; + } + } + } + break; + } + return false; + }, + + _hitTestSelf: function(point, options, viewMatrix, strokeMatrix) { + var that = this, + style = this.getStyle(), + segments = this._segments, + numSegments = segments.length, + closed = this._closed, + tolerancePadding = options._tolerancePadding, + strokePadding = tolerancePadding, + join, cap, miterLimit, + area, loc, res, + hitStroke = options.stroke && style.hasStroke(), + hitFill = options.fill && style.hasFill(), + hitCurves = options.curves, + strokeRadius = hitStroke + ? style.getStrokeWidth() / 2 + : hitFill && options.tolerance > 0 || hitCurves + ? 0 : null; + if (strokeRadius !== null) { + if (strokeRadius > 0) { + join = style.getStrokeJoin(); + cap = style.getStrokeCap(); + miterLimit = style.getMiterLimit(); + strokePadding = strokePadding.add( + Path._getStrokePadding(strokeRadius, strokeMatrix)); + } else { + join = cap = 'round'; + } + } + + function isCloseEnough(pt, padding) { + return point.subtract(pt).divide(padding).length <= 1; + } + + function checkSegmentPoint(seg, pt, name) { + if (!options.selected || pt.isSelected()) { + var anchor = seg._point; + if (pt !== anchor) + pt = pt.add(anchor); + if (isCloseEnough(pt, strokePadding)) { + return new HitResult(name, that, { + segment: seg, + point: pt + }); + } + } + } + + function checkSegmentPoints(seg, ends) { + return (ends || options.segments) + && checkSegmentPoint(seg, seg._point, 'segment') + || (!ends && options.handles) && ( + checkSegmentPoint(seg, seg._handleIn, 'handle-in') || + checkSegmentPoint(seg, seg._handleOut, 'handle-out')); + } + + function addToArea(point) { + area.add(point); + } + + function checkSegmentStroke(segment) { + var isJoin = closed || segment._index > 0 + && segment._index < numSegments - 1; + if ((isJoin ? join : cap) === 'round') { + return isCloseEnough(segment._point, strokePadding); + } else { + area = new Path({ internal: true, closed: true }); + if (isJoin) { + if (!segment.isSmooth()) { + Path._addBevelJoin(segment, join, strokeRadius, + miterLimit, null, strokeMatrix, addToArea, true); + } + } else if (cap === 'square') { + Path._addSquareCap(segment, cap, strokeRadius, null, + strokeMatrix, addToArea, true); + } + if (!area.isEmpty()) { + var loc; + return area.contains(point) + || (loc = area.getNearestLocation(point)) + && isCloseEnough(loc.getPoint(), tolerancePadding); + } + } + } + + if (options.ends && !options.segments && !closed) { + if (res = checkSegmentPoints(segments[0], true) + || checkSegmentPoints(segments[numSegments - 1], true)) + return res; + } else if (options.segments || options.handles) { + for (var i = 0; i < numSegments; i++) + if (res = checkSegmentPoints(segments[i])) + return res; + } + if (strokeRadius !== null) { + loc = this.getNearestLocation(point); + if (loc) { + var time = loc.getTime(); + if (time === 0 || time === 1 && numSegments > 1) { + if (!checkSegmentStroke(loc.getSegment())) + loc = null; + } else if (!isCloseEnough(loc.getPoint(), strokePadding)) { + loc = null; + } + } + if (!loc && join === 'miter' && numSegments > 1) { + for (var i = 0; i < numSegments; i++) { + var segment = segments[i]; + if (point.getDistance(segment._point) + <= miterLimit * strokeRadius + && checkSegmentStroke(segment)) { + loc = segment.getLocation(); + break; + } + } + } + } + return !loc && hitFill && this._contains(point) + || loc && !hitStroke && !hitCurves + ? new HitResult('fill', this) + : loc + ? new HitResult(hitStroke ? 'stroke' : 'curve', this, { + location: loc, + point: loc.getPoint() + }) + : null; + } + +}, Base.each(Curve._evaluateMethods, + function(name) { + this[name + 'At'] = function(offset) { + var loc = this.getLocationAt(offset); + return loc && loc[name](); + }; + }, +{ + beans: false, + + getLocationOf: function() { + var point = Point.read(arguments), + curves = this.getCurves(); + for (var i = 0, l = curves.length; i < l; i++) { + var loc = curves[i].getLocationOf(point); + if (loc) + return loc; + } + return null; + }, + + getOffsetOf: function() { + var loc = this.getLocationOf.apply(this, arguments); + return loc ? loc.getOffset() : null; + }, + + getLocationAt: function(offset) { + if (typeof offset === 'number') { + var curves = this.getCurves(), + length = 0; + for (var i = 0, l = curves.length; i < l; i++) { + var start = length, + curve = curves[i]; + length += curve.getLength(); + if (length > offset) { + return curve.getLocationAt(offset - start); + } + } + if (curves.length > 0 && offset <= this.getLength()) { + return new CurveLocation(curves[curves.length - 1], 1); + } + } else if (offset && offset.getPath && offset.getPath() === this) { + return offset; + } + return null; + } + +}), +new function() { + + function drawHandles(ctx, segments, matrix, size) { + var half = size / 2, + coords = new Array(6), + pX, pY; + + function drawHandle(index) { + var hX = coords[index], + hY = coords[index + 1]; + if (pX != hX || pY != hY) { + ctx.beginPath(); + ctx.moveTo(pX, pY); + ctx.lineTo(hX, hY); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(hX, hY, half, 0, Math.PI * 2, true); + ctx.fill(); + } + } + + for (var i = 0, l = segments.length; i < l; i++) { + var segment = segments[i], + selection = segment._selection; + segment._transformCoordinates(matrix, coords); + pX = coords[0]; + pY = coords[1]; + if (selection & 2) + drawHandle(2); + if (selection & 4) + drawHandle(4); + ctx.fillRect(pX - half, pY - half, size, size); + if (!(selection & 1)) { + var fillStyle = ctx.fillStyle; + ctx.fillStyle = '#ffffff'; + ctx.fillRect(pX - half + 1, pY - half + 1, size - 2, size - 2); + ctx.fillStyle = fillStyle; + } + } + } + + function drawSegments(ctx, path, matrix) { + var segments = path._segments, + length = segments.length, + coords = new Array(6), + first = true, + curX, curY, + prevX, prevY, + inX, inY, + outX, outY; + + function drawSegment(segment) { + if (matrix) { + segment._transformCoordinates(matrix, coords); + curX = coords[0]; + curY = coords[1]; + } else { + var point = segment._point; + curX = point._x; + curY = point._y; + } + if (first) { + ctx.moveTo(curX, curY); + first = false; + } else { + if (matrix) { + inX = coords[2]; + inY = coords[3]; + } else { + var handle = segment._handleIn; + inX = curX + handle._x; + inY = curY + handle._y; + } + if (inX === curX && inY === curY + && outX === prevX && outY === prevY) { + ctx.lineTo(curX, curY); + } else { + ctx.bezierCurveTo(outX, outY, inX, inY, curX, curY); + } + } + prevX = curX; + prevY = curY; + if (matrix) { + outX = coords[4]; + outY = coords[5]; + } else { + var handle = segment._handleOut; + outX = prevX + handle._x; + outY = prevY + handle._y; + } + } + + for (var i = 0; i < length; i++) + drawSegment(segments[i]); + if (path._closed && length > 0) + drawSegment(segments[0]); + } + + return { + _draw: function(ctx, param, viewMatrix, strokeMatrix) { + var dontStart = param.dontStart, + dontPaint = param.dontFinish || param.clip, + style = this.getStyle(), + hasFill = style.hasFill(), + hasStroke = style.hasStroke(), + dashArray = style.getDashArray(), + dashLength = !paper.support.nativeDash && hasStroke + && dashArray && dashArray.length; + + if (!dontStart) + ctx.beginPath(); + + if (hasFill || hasStroke && !dashLength || dontPaint) { + drawSegments(ctx, this, strokeMatrix); + if (this._closed) + ctx.closePath(); + } + + function getOffset(i) { + return dashArray[((i % dashLength) + dashLength) % dashLength]; + } + + if (!dontPaint && (hasFill || hasStroke)) { + this._setStyles(ctx, param, viewMatrix); + if (hasFill) { + ctx.fill(style.getFillRule()); + ctx.shadowColor = 'rgba(0,0,0,0)'; + } + if (hasStroke) { + if (dashLength) { + if (!dontStart) + ctx.beginPath(); + var flattener = new PathFlattener(this, 0.25, 32, false, + strokeMatrix), + length = flattener.length, + from = -style.getDashOffset(), to, + i = 0; + from = from % length; + while (from > 0) { + from -= getOffset(i--) + getOffset(i--); + } + while (from < length) { + to = from + getOffset(i++); + if (from > 0 || to > 0) + flattener.drawPart(ctx, + Math.max(from, 0), Math.max(to, 0)); + from = to + getOffset(i++); + } + } + ctx.stroke(); + } + } + }, + + _drawSelected: function(ctx, matrix) { + ctx.beginPath(); + drawSegments(ctx, this, matrix); + ctx.stroke(); + drawHandles(ctx, this._segments, matrix, paper.settings.handleSize); + } + }; +}, +new function() { + function getCurrentSegment(that) { + var segments = that._segments; + if (!segments.length) + throw new Error('Use a moveTo() command first'); + return segments[segments.length - 1]; + } + + return { + moveTo: function() { + var segments = this._segments; + if (segments.length === 1) + this.removeSegment(0); + if (!segments.length) + this._add([ new Segment(Point.read(arguments)) ]); + }, + + moveBy: function() { + throw new Error('moveBy() is unsupported on Path items.'); + }, + + lineTo: function() { + this._add([ new Segment(Point.read(arguments)) ]); + }, + + cubicCurveTo: function() { + var handle1 = Point.read(arguments), + handle2 = Point.read(arguments), + to = Point.read(arguments), + current = getCurrentSegment(this); + current.setHandleOut(handle1.subtract(current._point)); + this._add([ new Segment(to, handle2.subtract(to)) ]); + }, + + quadraticCurveTo: function() { + var handle = Point.read(arguments), + to = Point.read(arguments), + current = getCurrentSegment(this)._point; + this.cubicCurveTo( + handle.add(current.subtract(handle).multiply(1 / 3)), + handle.add(to.subtract(handle).multiply(1 / 3)), + to + ); + }, + + curveTo: function() { + var through = Point.read(arguments), + to = Point.read(arguments), + t = Base.pick(Base.read(arguments), 0.5), + t1 = 1 - t, + current = getCurrentSegment(this)._point, + handle = through.subtract(current.multiply(t1 * t1)) + .subtract(to.multiply(t * t)).divide(2 * t * t1); + if (handle.isNaN()) + throw new Error( + 'Cannot put a curve through points with parameter = ' + t); + this.quadraticCurveTo(handle, to); + }, + + arcTo: function() { + var abs = Math.abs, + sqrt = Math.sqrt, + current = getCurrentSegment(this), + from = current._point, + to = Point.read(arguments), + through, + peek = Base.peek(arguments), + clockwise = Base.pick(peek, true), + center, extent, vector, matrix; + if (typeof clockwise === 'boolean') { + var middle = from.add(to).divide(2), + through = middle.add(middle.subtract(from).rotate( + clockwise ? -90 : 90)); + } else if (Base.remain(arguments) <= 2) { + through = to; + to = Point.read(arguments); + } else { + var radius = Size.read(arguments), + isZero = Numerical.isZero; + if (isZero(radius.width) || isZero(radius.height)) + return this.lineTo(to); + var rotation = Base.read(arguments), + clockwise = !!Base.read(arguments), + large = !!Base.read(arguments), + middle = from.add(to).divide(2), + pt = from.subtract(middle).rotate(-rotation), + x = pt.x, + y = pt.y, + rx = abs(radius.width), + ry = abs(radius.height), + rxSq = rx * rx, + rySq = ry * ry, + xSq = x * x, + ySq = y * y; + var factor = sqrt(xSq / rxSq + ySq / rySq); + if (factor > 1) { + rx *= factor; + ry *= factor; + rxSq = rx * rx; + rySq = ry * ry; + } + factor = (rxSq * rySq - rxSq * ySq - rySq * xSq) / + (rxSq * ySq + rySq * xSq); + if (abs(factor) < 1e-12) + factor = 0; + if (factor < 0) + throw new Error( + 'Cannot create an arc with the given arguments'); + center = new Point(rx * y / ry, -ry * x / rx) + .multiply((large === clockwise ? -1 : 1) * sqrt(factor)) + .rotate(rotation).add(middle); + matrix = new Matrix().translate(center).rotate(rotation) + .scale(rx, ry); + vector = matrix._inverseTransform(from); + extent = vector.getDirectedAngle(matrix._inverseTransform(to)); + if (!clockwise && extent > 0) + extent -= 360; + else if (clockwise && extent < 0) + extent += 360; + } + if (through) { + var l1 = new Line(from.add(through).divide(2), + through.subtract(from).rotate(90), true), + l2 = new Line(through.add(to).divide(2), + to.subtract(through).rotate(90), true), + line = new Line(from, to), + throughSide = line.getSide(through); + center = l1.intersect(l2, true); + if (!center) { + if (!throughSide) + return this.lineTo(to); + throw new Error( + 'Cannot create an arc with the given arguments'); + } + vector = from.subtract(center); + extent = vector.getDirectedAngle(to.subtract(center)); + var centerSide = line.getSide(center); + if (centerSide === 0) { + extent = throughSide * abs(extent); + } else if (throughSide === centerSide) { + extent += extent < 0 ? 360 : -360; + } + } + var epsilon = 1e-7, + ext = abs(extent), + count = ext >= 360 ? 4 : Math.ceil((ext - epsilon) / 90), + inc = extent / count, + half = inc * Math.PI / 360, + z = 4 / 3 * Math.sin(half) / (1 + Math.cos(half)), + segments = []; + for (var i = 0; i <= count; i++) { + var pt = to, + out = null; + if (i < count) { + out = vector.rotate(90).multiply(z); + if (matrix) { + pt = matrix._transformPoint(vector); + out = matrix._transformPoint(vector.add(out)) + .subtract(pt); + } else { + pt = center.add(vector); + } + } + if (!i) { + current.setHandleOut(out); + } else { + var _in = vector.rotate(-90).multiply(z); + if (matrix) { + _in = matrix._transformPoint(vector.add(_in)) + .subtract(pt); + } + segments.push(new Segment(pt, _in, out)); + } + vector = vector.rotate(inc); + } + this._add(segments); + }, + + lineBy: function() { + var to = Point.read(arguments), + current = getCurrentSegment(this)._point; + this.lineTo(current.add(to)); + }, + + curveBy: function() { + var through = Point.read(arguments), + to = Point.read(arguments), + parameter = Base.read(arguments), + current = getCurrentSegment(this)._point; + this.curveTo(current.add(through), current.add(to), parameter); + }, + + cubicCurveBy: function() { + var handle1 = Point.read(arguments), + handle2 = Point.read(arguments), + to = Point.read(arguments), + current = getCurrentSegment(this)._point; + this.cubicCurveTo(current.add(handle1), current.add(handle2), + current.add(to)); + }, + + quadraticCurveBy: function() { + var handle = Point.read(arguments), + to = Point.read(arguments), + current = getCurrentSegment(this)._point; + this.quadraticCurveTo(current.add(handle), current.add(to)); + }, + + arcBy: function() { + var current = getCurrentSegment(this)._point, + point = current.add(Point.read(arguments)), + clockwise = Base.pick(Base.peek(arguments), true); + if (typeof clockwise === 'boolean') { + this.arcTo(point, clockwise); + } else { + this.arcTo(point, current.add(Point.read(arguments))); + } + }, + + closePath: function(tolerance) { + this.setClosed(true); + this.join(this, tolerance); + } + }; +}, { + + _getBounds: function(matrix, options) { + var method = options.handle + ? 'getHandleBounds' + : options.stroke + ? 'getStrokeBounds' + : 'getBounds'; + return Path[method](this._segments, this._closed, this, matrix, options); + }, + +statics: { + getBounds: function(segments, closed, path, matrix, options, strokePadding) { + var first = segments[0]; + if (!first) + return new Rectangle(); + var coords = new Array(6), + prevCoords = first._transformCoordinates(matrix, new Array(6)), + min = prevCoords.slice(0, 2), + max = min.slice(), + roots = new Array(2); + + function processSegment(segment) { + segment._transformCoordinates(matrix, coords); + for (var i = 0; i < 2; i++) { + Curve._addBounds( + prevCoords[i], + prevCoords[i + 4], + coords[i + 2], + coords[i], + i, strokePadding ? strokePadding[i] : 0, min, max, roots); + } + var tmp = prevCoords; + prevCoords = coords; + coords = tmp; + } + + for (var i = 1, l = segments.length; i < l; i++) + processSegment(segments[i]); + if (closed) + processSegment(first); + return new Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]); + }, + + getStrokeBounds: function(segments, closed, path, matrix, options) { + var style = path.getStyle(), + stroke = style.hasStroke(), + strokeWidth = style.getStrokeWidth(), + strokeMatrix = stroke && path._getStrokeMatrix(matrix, options), + strokePadding = stroke && Path._getStrokePadding(strokeWidth, + strokeMatrix), + bounds = Path.getBounds(segments, closed, path, matrix, options, + strokePadding); + if (!stroke) + return bounds; + var strokeRadius = strokeWidth / 2, + join = style.getStrokeJoin(), + cap = style.getStrokeCap(), + miterLimit = style.getMiterLimit(), + joinBounds = new Rectangle(new Size(strokePadding)); + + function addPoint(point) { + bounds = bounds.include(point); + } + + function addRound(segment) { + bounds = bounds.unite( + joinBounds.setCenter(segment._point.transform(matrix))); + } + + function addJoin(segment, join) { + if (join === 'round' || segment.isSmooth()) { + addRound(segment); + } else { + Path._addBevelJoin(segment, join, strokeRadius, miterLimit, + matrix, strokeMatrix, addPoint); + } + } + + function addCap(segment, cap) { + if (cap === 'round') { + addRound(segment); + } else { + Path._addSquareCap(segment, cap, strokeRadius, matrix, + strokeMatrix, addPoint); + } + } + + var length = segments.length - (closed ? 0 : 1); + for (var i = 1; i < length; i++) + addJoin(segments[i], join); + if (closed) { + addJoin(segments[0], join); + } else if (length > 0) { + addCap(segments[0], cap); + addCap(segments[segments.length - 1], cap); + } + return bounds; + }, + + _getStrokePadding: function(radius, matrix) { + if (!matrix) + return [radius, radius]; + var hor = new Point(radius, 0).transform(matrix), + ver = new Point(0, radius).transform(matrix), + phi = hor.getAngleInRadians(), + a = hor.getLength(), + b = ver.getLength(); + var sin = Math.sin(phi), + cos = Math.cos(phi), + tan = Math.tan(phi), + tx = Math.atan2(b * tan, a), + ty = Math.atan2(b, tan * a); + return [Math.abs(a * Math.cos(tx) * cos + b * Math.sin(tx) * sin), + Math.abs(b * Math.sin(ty) * cos + a * Math.cos(ty) * sin)]; + }, + + _addBevelJoin: function(segment, join, radius, miterLimit, matrix, + strokeMatrix, addPoint, isArea) { + var curve2 = segment.getCurve(), + curve1 = curve2.getPrevious(), + point = curve2.getPoint1().transform(matrix), + normal1 = curve1.getNormalAtTime(1).multiply(radius) + .transform(strokeMatrix), + normal2 = curve2.getNormalAtTime(0).multiply(radius) + .transform(strokeMatrix); + if (normal1.getDirectedAngle(normal2) < 0) { + normal1 = normal1.negate(); + normal2 = normal2.negate(); + } + if (isArea) + addPoint(point); + addPoint(point.add(normal1)); + if (join === 'miter') { + var corner = new Line(point.add(normal1), + new Point(-normal1.y, normal1.x), true + ).intersect(new Line(point.add(normal2), + new Point(-normal2.y, normal2.x), true + ), true); + if (corner && point.getDistance(corner) <= miterLimit * radius) { + addPoint(corner); + } + } + addPoint(point.add(normal2)); + }, + + _addSquareCap: function(segment, cap, radius, matrix, strokeMatrix, + addPoint, isArea) { + var point = segment._point.transform(matrix), + loc = segment.getLocation(), + normal = loc.getNormal() + .multiply(loc.getTime() === 0 ? radius : -radius) + .transform(strokeMatrix); + if (cap === 'square') { + if (isArea) { + addPoint(point.subtract(normal)); + addPoint(point.add(normal)); + } + point = point.add(normal.rotate(-90)); + } + addPoint(point.add(normal)); + addPoint(point.subtract(normal)); + }, + + getHandleBounds: function(segments, closed, path, matrix, options) { + var style = path.getStyle(), + stroke = options.stroke && style.hasStroke(), + strokePadding, + joinPadding; + if (stroke) { + var strokeMatrix = path._getStrokeMatrix(matrix, options), + strokeRadius = style.getStrokeWidth() / 2, + joinRadius = strokeRadius; + if (style.getStrokeJoin() === 'miter') + joinRadius = strokeRadius * style.getMiterLimit(); + if (style.getStrokeCap() === 'square') + joinRadius = Math.max(joinRadius, strokeRadius * Math.SQRT2); + strokePadding = Path._getStrokePadding(strokeRadius, strokeMatrix); + joinPadding = Path._getStrokePadding(joinRadius, strokeMatrix); + } + var coords = new Array(6), + x1 = Infinity, + x2 = -x1, + y1 = x1, + y2 = x2; + for (var i = 0, l = segments.length; i < l; i++) { + var segment = segments[i]; + segment._transformCoordinates(matrix, coords); + for (var j = 0; j < 6; j += 2) { + var padding = !j ? joinPadding : strokePadding, + paddingX = padding ? padding[0] : 0, + paddingY = padding ? padding[1] : 0, + x = coords[j], + y = coords[j + 1], + xn = x - paddingX, + xx = x + paddingX, + yn = y - paddingY, + yx = y + paddingY; + if (xn < x1) x1 = xn; + if (xx > x2) x2 = xx; + if (yn < y1) y1 = yn; + if (yx > y2) y2 = yx; + } + } + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } +}}); + +Path.inject({ statics: new function() { + + var kappa = 0.5522847498307936, + ellipseSegments = [ + new Segment([-1, 0], [0, kappa ], [0, -kappa]), + new Segment([0, -1], [-kappa, 0], [kappa, 0 ]), + new Segment([1, 0], [0, -kappa], [0, kappa ]), + new Segment([0, 1], [kappa, 0 ], [-kappa, 0]) + ]; + + function createPath(segments, closed, args) { + var props = Base.getNamed(args), + path = new Path(props && props.insert == false && Item.NO_INSERT); + path._add(segments); + path._closed = closed; + return path.set(props, { insert: true }); + } + + function createEllipse(center, radius, args) { + var segments = new Array(4); + for (var i = 0; i < 4; i++) { + var segment = ellipseSegments[i]; + segments[i] = new Segment( + segment._point.multiply(radius).add(center), + segment._handleIn.multiply(radius), + segment._handleOut.multiply(radius) + ); + } + return createPath(segments, true, args); + } + + return { + Line: function() { + return createPath([ + new Segment(Point.readNamed(arguments, 'from')), + new Segment(Point.readNamed(arguments, 'to')) + ], false, arguments); + }, + + Circle: function() { + var center = Point.readNamed(arguments, 'center'), + radius = Base.readNamed(arguments, 'radius'); + return createEllipse(center, new Size(radius), arguments); + }, + + Rectangle: function() { + var rect = Rectangle.readNamed(arguments, 'rectangle'), + radius = Size.readNamed(arguments, 'radius', 0, + { readNull: true }), + bl = rect.getBottomLeft(true), + tl = rect.getTopLeft(true), + tr = rect.getTopRight(true), + br = rect.getBottomRight(true), + segments; + if (!radius || radius.isZero()) { + segments = [ + new Segment(bl), + new Segment(tl), + new Segment(tr), + new Segment(br) + ]; + } else { + radius = Size.min(radius, rect.getSize(true).divide(2)); + var rx = radius.width, + ry = radius.height, + hx = rx * kappa, + hy = ry * kappa; + segments = [ + new Segment(bl.add(rx, 0), null, [-hx, 0]), + new Segment(bl.subtract(0, ry), [0, hy]), + new Segment(tl.add(0, ry), null, [0, -hy]), + new Segment(tl.add(rx, 0), [-hx, 0], null), + new Segment(tr.subtract(rx, 0), null, [hx, 0]), + new Segment(tr.add(0, ry), [0, -hy], null), + new Segment(br.subtract(0, ry), null, [0, hy]), + new Segment(br.subtract(rx, 0), [hx, 0]) + ]; + } + return createPath(segments, true, arguments); + }, + + RoundRectangle: '#Rectangle', + + Ellipse: function() { + var ellipse = Shape._readEllipse(arguments); + return createEllipse(ellipse.center, ellipse.radius, arguments); + }, + + Oval: '#Ellipse', + + Arc: function() { + var from = Point.readNamed(arguments, 'from'), + through = Point.readNamed(arguments, 'through'), + to = Point.readNamed(arguments, 'to'), + props = Base.getNamed(arguments), + path = new Path(props && props.insert == false + && Item.NO_INSERT); + path.moveTo(from); + path.arcTo(through, to); + return path.set(props); + }, + + RegularPolygon: function() { + var center = Point.readNamed(arguments, 'center'), + sides = Base.readNamed(arguments, 'sides'), + radius = Base.readNamed(arguments, 'radius'), + step = 360 / sides, + three = sides % 3 === 0, + vector = new Point(0, three ? -radius : radius), + offset = three ? -1 : 0.5, + segments = new Array(sides); + for (var i = 0; i < sides; i++) + segments[i] = new Segment(center.add( + vector.rotate((i + offset) * step))); + return createPath(segments, true, arguments); + }, + + Star: function() { + var center = Point.readNamed(arguments, 'center'), + points = Base.readNamed(arguments, 'points') * 2, + radius1 = Base.readNamed(arguments, 'radius1'), + radius2 = Base.readNamed(arguments, 'radius2'), + step = 360 / points, + vector = new Point(0, -1), + segments = new Array(points); + for (var i = 0; i < points; i++) + segments[i] = new Segment(center.add(vector.rotate(step * i) + .multiply(i % 2 ? radius2 : radius1))); + return createPath(segments, true, arguments); + } + }; +}}); + +var CompoundPath = PathItem.extend({ + _class: 'CompoundPath', + _serializeFields: { + children: [] + }, + beans: true, + + initialize: function CompoundPath(arg) { + this._children = []; + this._namedChildren = {}; + if (!this._initialize(arg)) { + if (typeof arg === 'string') { + this.setPathData(arg); + } else { + this.addChildren(Array.isArray(arg) ? arg : arguments); + } + } + }, + + insertChildren: function insertChildren(index, items) { + var list = items, + first = list[0]; + if (first && typeof first[0] === 'number') + list = [list]; + for (var i = items.length - 1; i >= 0; i--) { + var item = list[i]; + if (list === items && !(item instanceof Path)) + list = Base.slice(list); + if (Array.isArray(item)) { + list[i] = new Path({ segments: item, insert: false }); + } else if (item instanceof CompoundPath) { + list.splice.apply(list, [i, 1].concat(item.removeChildren())); + item.remove(); + } + } + return insertChildren.base.call(this, index, list); + }, + + reduce: function reduce(options) { + var children = this._children; + for (var i = children.length - 1; i >= 0; i--) { + var path = children[i].reduce(options); + if (path.isEmpty()) + path.remove(); + } + if (!children.length) { + var path = new Path(Item.NO_INSERT); + path.copyAttributes(this); + path.insertAbove(this); + this.remove(); + return path; + } + return reduce.base.call(this); + }, + + isClosed: function() { + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) { + if (!children[i]._closed) + return false; + } + return true; + }, + + setClosed: function(closed) { + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) { + children[i].setClosed(closed); + } + }, + + getFirstSegment: function() { + var first = this.getFirstChild(); + return first && first.getFirstSegment(); + }, + + getLastSegment: function() { + var last = this.getLastChild(); + return last && last.getLastSegment(); + }, + + getCurves: function() { + var children = this._children, + curves = []; + for (var i = 0, l = children.length; i < l; i++) + curves.push.apply(curves, children[i].getCurves()); + return curves; + }, + + getFirstCurve: function() { + var first = this.getFirstChild(); + return first && first.getFirstCurve(); + }, + + getLastCurve: function() { + var last = this.getLastChild(); + return last && last.getLastCurve(); + }, + + getArea: function() { + var children = this._children, + area = 0; + for (var i = 0, l = children.length; i < l; i++) + area += children[i].getArea(); + return area; + }, + + getLength: function() { + var children = this._children, + length = 0; + for (var i = 0, l = children.length; i < l; i++) + length += children[i].getLength(); + return length; + }, + + getPathData: function(_matrix, _precision) { + var children = this._children, + paths = []; + for (var i = 0, l = children.length; i < l; i++) { + var child = children[i], + mx = child._matrix; + paths.push(child.getPathData(_matrix && !mx.isIdentity() + ? _matrix.appended(mx) : _matrix, _precision)); + } + return paths.join(''); + }, + + _hitTestChildren: function _hitTestChildren(point, options, viewMatrix) { + return _hitTestChildren.base.call(this, point, + options.class === Path || options.type === 'path' ? options + : Base.set({}, options, { fill: false }), + viewMatrix); + }, + + _draw: function(ctx, param, viewMatrix, strokeMatrix) { + var children = this._children; + if (!children.length) + return; + + param = param.extend({ dontStart: true, dontFinish: true }); + ctx.beginPath(); + for (var i = 0, l = children.length; i < l; i++) + children[i].draw(ctx, param, strokeMatrix); + + if (!param.clip) { + this._setStyles(ctx, param, viewMatrix); + var style = this._style; + if (style.hasFill()) { + ctx.fill(style.getFillRule()); + ctx.shadowColor = 'rgba(0,0,0,0)'; + } + if (style.hasStroke()) + ctx.stroke(); + } + }, + + _drawSelected: function(ctx, matrix, selectionItems) { + var children = this._children; + for (var i = 0, l = children.length; i < l; i++) { + var child = children[i], + mx = child._matrix; + if (!selectionItems[child._id]) { + child._drawSelected(ctx, mx.isIdentity() ? matrix + : matrix.appended(mx)); + } + } + } +}, +new function() { + function getCurrentPath(that, check) { + var children = that._children; + if (check && !children.length) + throw new Error('Use a moveTo() command first'); + return children[children.length - 1]; + } + + return Base.each(['lineTo', 'cubicCurveTo', 'quadraticCurveTo', 'curveTo', + 'arcTo', 'lineBy', 'cubicCurveBy', 'quadraticCurveBy', 'curveBy', + 'arcBy'], + function(key) { + this[key] = function() { + var path = getCurrentPath(this, true); + path[key].apply(path, arguments); + }; + }, { + moveTo: function() { + var current = getCurrentPath(this), + path = current && current.isEmpty() ? current + : new Path(Item.NO_INSERT); + if (path !== current) + this.addChild(path); + path.moveTo.apply(path, arguments); + }, + + moveBy: function() { + var current = getCurrentPath(this, true), + last = current && current.getLastSegment(), + point = Point.read(arguments); + this.moveTo(last ? point.add(last._point) : point); + }, + + closePath: function(tolerance) { + getCurrentPath(this, true).closePath(tolerance); + } + } + ); +}, Base.each(['reverse', 'flatten', 'simplify', 'smooth'], function(key) { + this[key] = function(param) { + var children = this._children, + res; + for (var i = 0, l = children.length; i < l; i++) { + res = children[i][key](param) || res; + } + return res; + }; +}, {})); + +PathItem.inject(new function() { + var min = Math.min, + max = Math.max, + abs = Math.abs, + operators = { + unite: { '1': true, '2': true }, + intersect: { '2': true }, + subtract: { '1': true }, + exclude: { '1': true, '-1': true } + }; + + function preparePath(path, resolve) { + var res = path.clone(false).reduce({ simplify: true }) + .transform(null, true, true); + return resolve + ? res.resolveCrossings().reorient( + res.getFillRule() === 'nonzero', true) + : res; + } + + function createResult(paths, simplify, path1, path2, options) { + var result = new CompoundPath(Item.NO_INSERT); + result.addChildren(paths, true); + result = result.reduce({ simplify: simplify }); + if (!(options && options.insert == false)) { + result.insertAbove(path2 && path1.isSibling(path2) + && path1.getIndex() < path2.getIndex() ? path2 : path1); + } + result.copyAttributes(path1, true); + return result; + } + + function traceBoolean(path1, path2, operation, options) { + if (options && (options.trace == false || options.stroke) && + /^(subtract|intersect)$/.test(operation)) + return splitBoolean(path1, path2, operation); + var _path1 = preparePath(path1, true), + _path2 = path2 && path1 !== path2 && preparePath(path2, true), + operator = operators[operation]; + operator[operation] = true; + if (_path2 && (operator.subtract || operator.exclude) + ^ (_path2.isClockwise() ^ _path1.isClockwise())) + _path2.reverse(); + var crossings = divideLocations( + CurveLocation.expand(_path1.getCrossings(_path2))), + paths1 = _path1._children || [_path1], + paths2 = _path2 && (_path2._children || [_path2]), + segments = [], + curves = [], + paths; + + function collect(paths) { + for (var i = 0, l = paths.length; i < l; i++) { + var path = paths[i]; + segments.push.apply(segments, path._segments); + curves.push.apply(curves, path.getCurves()); + path._overlapsOnly = true; + } + } + + if (crossings.length) { + collect(paths1); + if (paths2) + collect(paths2); + for (var i = 0, l = crossings.length; i < l; i++) { + propagateWinding(crossings[i]._segment, _path1, _path2, curves, + operator); + } + for (var i = 0, l = segments.length; i < l; i++) { + var segment = segments[i], + inter = segment._intersection; + if (!segment._winding) { + propagateWinding(segment, _path1, _path2, curves, operator); + } + if (!(inter && inter._overlap)) + segment._path._overlapsOnly = false; + } + paths = tracePaths(segments, operator); + } else { + paths = reorientPaths( + paths2 ? paths1.concat(paths2) : paths1.slice(), + function(w) { + return !!operator[w]; + }); + } + + return createResult(paths, true, path1, path2, options); + } + + function splitBoolean(path1, path2, operation) { + var _path1 = preparePath(path1), + _path2 = preparePath(path2), + crossings = _path1.getCrossings(_path2), + subtract = operation === 'subtract', + divide = operation === 'divide', + added = {}, + paths = []; + + function addPath(path) { + if (!added[path._id] && (divide || + _path2.contains(path.getPointAt(path.getLength() / 2)) + ^ subtract)) { + paths.unshift(path); + return added[path._id] = true; + } + } + + for (var i = crossings.length - 1; i >= 0; i--) { + var path = crossings[i].split(); + if (path) { + if (addPath(path)) + path.getFirstSegment().setHandleIn(0, 0); + _path1.getLastSegment().setHandleOut(0, 0); + } + } + addPath(_path1); + return createResult(paths, false, path1, path2); + } + + function linkIntersections(from, to) { + var prev = from; + while (prev) { + if (prev === to) + return; + prev = prev._previous; + } + while (from._next && from._next !== to) + from = from._next; + if (!from._next) { + while (to._previous) + to = to._previous; + from._next = to; + to._previous = from; + } + } + + function clearCurveHandles(curves) { + for (var i = curves.length - 1; i >= 0; i--) + curves[i].clearHandles(); + } + + function reorientPaths(paths, isInside, clockwise) { + var length = paths && paths.length; + if (length) { + var lookup = Base.each(paths, function (path, i) { + this[path._id] = { + container: null, + winding: path.isClockwise() ? 1 : -1, + index: i + }; + }, {}), + sorted = paths.slice().sort(function (a, b) { + return abs(b.getArea()) - abs(a.getArea()); + }), + first = sorted[0]; + if (clockwise == null) + clockwise = first.isClockwise(); + for (var i = 0; i < length; i++) { + var path1 = sorted[i], + entry1 = lookup[path1._id], + point = path1.getInteriorPoint(), + containerWinding = 0; + for (var j = i - 1; j >= 0; j--) { + var path2 = sorted[j]; + if (path2.contains(point)) { + var entry2 = lookup[path2._id]; + containerWinding = entry2.winding; + entry1.winding += containerWinding; + entry1.container = entry2.exclude ? entry2.container + : path2; + break; + } + } + if (isInside(entry1.winding) === isInside(containerWinding)) { + entry1.exclude = true; + paths[entry1.index] = null; + } else { + var container = entry1.container; + path1.setClockwise(container ? !container.isClockwise() + : clockwise); + } + } + } + return paths; + } + + function divideLocations(locations, include, clearLater) { + var results = include && [], + tMin = 1e-8, + tMax = 1 - tMin, + clearHandles = false, + clearCurves = clearLater || [], + clearLookup = clearLater && {}, + renormalizeLocs, + prevCurve, + prevTime; + + function getId(curve) { + return curve._path._id + '.' + curve._segment1._index; + } + + for (var i = (clearLater && clearLater.length) - 1; i >= 0; i--) { + var curve = clearLater[i]; + if (curve._path) + clearLookup[getId(curve)] = true; + } + + for (var i = locations.length - 1; i >= 0; i--) { + var loc = locations[i], + time = loc._time, + origTime = time, + exclude = include && !include(loc), + curve = loc._curve, + segment; + if (curve) { + if (curve !== prevCurve) { + clearHandles = !curve.hasHandles() + || clearLookup && clearLookup[getId(curve)]; + renormalizeLocs = []; + prevTime = null; + prevCurve = curve; + } else if (prevTime >= tMin) { + time /= prevTime; + } + } + if (exclude) { + if (renormalizeLocs) + renormalizeLocs.push(loc); + continue; + } else if (include) { + results.unshift(loc); + } + prevTime = origTime; + if (time < tMin) { + segment = curve._segment1; + } else if (time > tMax) { + segment = curve._segment2; + } else { + var newCurve = curve.divideAtTime(time, true); + if (clearHandles) + clearCurves.push(curve, newCurve); + segment = newCurve._segment1; + for (var j = renormalizeLocs.length - 1; j >= 0; j--) { + var l = renormalizeLocs[j]; + l._time = (l._time - time) / (1 - time); + } + } + loc._setSegment(segment); + var inter = segment._intersection, + dest = loc._intersection; + if (inter) { + linkIntersections(inter, dest); + var other = inter; + while (other) { + linkIntersections(other._intersection, inter); + other = other._next; + } + } else { + segment._intersection = dest; + } + } + if (!clearLater) + clearCurveHandles(clearCurves); + return results || locations; + } + + function getWinding(point, curves, dir, closed, dontFlip) { + var ia = dir ? 1 : 0, + io = ia ^ 1, + pv = [point.x, point.y], + pa = pv[ia], + po = pv[io], + windingEpsilon = 1e-9, + qualityEpsilon = 1e-6, + paL = pa - windingEpsilon, + paR = pa + windingEpsilon, + windingL = 0, + windingR = 0, + pathWindingL = 0, + pathWindingR = 0, + onPath = false, + onAnyPath = false, + quality = 1, + roots = [], + vPrev, + vClose; + + function addWinding(v) { + var o0 = v[io + 0], + o3 = v[io + 6]; + if (po < min(o0, o3) || po > max(o0, o3)) { + return; + } + var a0 = v[ia + 0], + a1 = v[ia + 2], + a2 = v[ia + 4], + a3 = v[ia + 6]; + if (o0 === o3) { + if (a0 < paR && a3 > paL || a3 < paR && a0 > paL) { + onPath = true; + } + return; + } + var t = po === o0 ? 0 + : po === o3 ? 1 + : paL > max(a0, a1, a2, a3) || paR < min(a0, a1, a2, a3) + ? 1 + : Curve.solveCubic(v, io, po, roots, 0, 1) > 0 + ? roots[0] + : 1, + a = t === 0 ? a0 + : t === 1 ? a3 + : Curve.getPoint(v, t)[dir ? 'y' : 'x'], + winding = o0 > o3 ? 1 : -1, + windingPrev = vPrev[io] > vPrev[io + 6] ? 1 : -1, + a3Prev = vPrev[ia + 6]; + if (po !== o0) { + if (a < paL) { + pathWindingL += winding; + } else if (a > paR) { + pathWindingR += winding; + } else { + onPath = true; + } + if (a > pa - qualityEpsilon && a < pa + qualityEpsilon) + quality /= 2; + } else { + if (winding !== windingPrev) { + if (a0 < paL) { + pathWindingL += winding; + } else if (a0 > paR) { + pathWindingR += winding; + } + } else if (a0 != a3Prev) { + if (a3Prev < paR && a > paR) { + pathWindingR += winding; + onPath = true; + } else if (a3Prev > paL && a < paL) { + pathWindingL += winding; + onPath = true; + } + } + quality = 0; + } + vPrev = v; + return !dontFlip && a > paL && a < paR + && Curve.getTangent(v, t)[dir ? 'x' : 'y'] === 0 + && getWinding(point, curves, !dir, closed, true); + } + + function handleCurve(v) { + var o0 = v[io + 0], + o1 = v[io + 2], + o2 = v[io + 4], + o3 = v[io + 6]; + if (po <= max(o0, o1, o2, o3) && po >= min(o0, o1, o2, o3)) { + var a0 = v[ia + 0], + a1 = v[ia + 2], + a2 = v[ia + 4], + a3 = v[ia + 6], + monoCurves = paL > max(a0, a1, a2, a3) || + paR < min(a0, a1, a2, a3) + ? [v] : Curve.getMonoCurves(v, dir), + res; + for (var i = 0, l = monoCurves.length; i < l; i++) { + if (res = addWinding(monoCurves[i])) + return res; + } + } + } + + for (var i = 0, l = curves.length; i < l; i++) { + var curve = curves[i], + path = curve._path, + v = curve.getValues(), + res; + if (!i || curves[i - 1]._path !== path) { + vPrev = null; + if (!path._closed) { + vClose = Curve.getValues( + path.getLastCurve().getSegment2(), + curve.getSegment1(), + null, !closed); + if (vClose[io] !== vClose[io + 6]) { + vPrev = vClose; + } + } + + if (!vPrev) { + vPrev = v; + var prev = path.getLastCurve(); + while (prev && prev !== curve) { + var v2 = prev.getValues(); + if (v2[io] !== v2[io + 6]) { + vPrev = v2; + break; + } + prev = prev.getPrevious(); + } + } + } + + if (res = handleCurve(v)) + return res; + + if (i + 1 === l || curves[i + 1]._path !== path) { + if (vClose && (res = handleCurve(vClose))) + return res; + if (onPath && !pathWindingL && !pathWindingR) { + pathWindingL = pathWindingR = path.isClockwise(closed) ^ dir + ? 1 : -1; + } + windingL += pathWindingL; + windingR += pathWindingR; + pathWindingL = pathWindingR = 0; + if (onPath) { + onAnyPath = true; + onPath = false; + } + vClose = null; + } + } + windingL = abs(windingL); + windingR = abs(windingR); + return { + winding: max(windingL, windingR), + windingL: windingL, + windingR: windingR, + quality: quality, + onPath: onAnyPath + }; + } + + function propagateWinding(segment, path1, path2, curves, operator) { + var chain = [], + start = segment, + totalLength = 0, + winding; + do { + var curve = segment.getCurve(), + length = curve.getLength(); + chain.push({ segment: segment, curve: curve, length: length }); + totalLength += length; + segment = segment.getNext(); + } while (segment && !segment._intersection && segment !== start); + var offsets = [0.5, 0.25, 0.75], + winding = { winding: 0, quality: -1 }, + tMin = 1e-8, + tMax = 1 - tMin; + for (var i = 0; i < offsets.length && winding.quality < 0.5; i++) { + var length = totalLength * offsets[i]; + for (var j = 0, l = chain.length; j < l; j++) { + var entry = chain[j], + curveLength = entry.length; + if (length <= curveLength) { + var curve = entry.curve, + path = curve._path, + parent = path._parent, + operand = parent instanceof CompoundPath ? parent : path, + t = Numerical.clamp(curve.getTimeAt(length), tMin, tMax), + pt = curve.getPointAtTime(t), + dir = abs(curve.getTangentAtTime(t).y) < Math.SQRT1_2; + var wind = !(operator.subtract && path2 && ( + operand === path1 && + path2._getWinding(pt, dir, true).winding || + operand === path2 && + !path1._getWinding(pt, dir, true).winding)) + ? getWinding(pt, curves, dir, true) + : { winding: 0, quality: 1 }; + if (wind.quality > winding.quality) + winding = wind; + break; + } + length -= curveLength; + } + } + for (var j = chain.length - 1; j >= 0; j--) { + chain[j].segment._winding = winding; + } + } + + function tracePaths(segments, operator) { + var paths = [], + starts; + + function isValid(seg) { + var winding; + return !!(seg && !seg._visited && (!operator + || operator[(winding = seg._winding || {}).winding] + && !(operator.unite && winding.winding === 2 + && winding.windingL && winding.windingR))); + } + + function isStart(seg) { + if (seg) { + for (var i = 0, l = starts.length; i < l; i++) { + if (seg === starts[i]) + return true; + } + } + return false; + } + + function visitPath(path) { + var segments = path._segments; + for (var i = 0, l = segments.length; i < l; i++) { + segments[i]._visited = true; + } + } + + function getCrossingSegments(segment, collectStarts) { + var inter = segment._intersection, + start = inter, + crossings = []; + if (collectStarts) + starts = [segment]; + + function collect(inter, end) { + while (inter && inter !== end) { + var other = inter._segment, + path = other && other._path; + if (path) { + var next = other.getNext() || path.getFirstSegment(), + nextInter = next._intersection; + if (other !== segment && (isStart(other) + || isStart(next) + || next && (isValid(other) && (isValid(next) + || nextInter && isValid(nextInter._segment)))) + ) { + crossings.push(other); + } + if (collectStarts) + starts.push(other); + } + inter = inter._next; + } + } + + if (inter) { + collect(inter); + while (inter && inter._prev) + inter = inter._prev; + collect(inter, start); + } + return crossings; + } + + segments.sort(function(seg1, seg2) { + var inter1 = seg1._intersection, + inter2 = seg2._intersection, + over1 = !!(inter1 && inter1._overlap), + over2 = !!(inter2 && inter2._overlap), + path1 = seg1._path, + path2 = seg2._path; + return over1 ^ over2 + ? over1 ? 1 : -1 + : !inter1 ^ !inter2 + ? inter1 ? 1 : -1 + : path1 !== path2 + ? path1._id - path2._id + : seg1._index - seg2._index; + }); + + for (var i = 0, l = segments.length; i < l; i++) { + var seg = segments[i], + valid = isValid(seg), + path = null, + finished = false, + closed = true, + branches = [], + branch, + visited, + handleIn; + if (valid && seg._path._overlapsOnly) { + var path1 = seg._path, + path2 = seg._intersection._segment._path; + if (path1.compare(path2)) { + if (path1.getArea()) + paths.push(path1.clone(false)); + visitPath(path1); + visitPath(path2); + valid = false; + } + } + while (valid) { + var first = !path, + crossings = getCrossingSegments(seg, first), + other = crossings.shift(), + finished = !first && (isStart(seg) || isStart(other)), + cross = !finished && other; + if (first) { + path = new Path(Item.NO_INSERT); + branch = null; + } + if (finished) { + if (seg.isFirst() || seg.isLast()) + closed = seg._path._closed; + seg._visited = true; + break; + } + if (cross && branch) { + branches.push(branch); + branch = null; + } + if (!branch) { + if (cross) + crossings.push(seg); + branch = { + start: path._segments.length, + crossings: crossings, + visited: visited = [], + handleIn: handleIn + }; + } + if (cross) + seg = other; + if (!isValid(seg)) { + path.removeSegments(branch.start); + for (var j = 0, k = visited.length; j < k; j++) { + visited[j]._visited = false; + } + visited.length = 0; + do { + seg = branch && branch.crossings.shift(); + if (!seg || !seg._path) { + seg = null; + branch = branches.pop(); + if (branch) { + visited = branch.visited; + handleIn = branch.handleIn; + } + } + } while (branch && !isValid(seg)); + if (!seg) + break; + } + var next = seg.getNext(); + path.add(new Segment(seg._point, handleIn, + next && seg._handleOut)); + seg._visited = true; + visited.push(seg); + seg = next || seg._path.getFirstSegment(); + handleIn = next && next._handleIn; + } + if (finished) { + if (closed) { + path.getFirstSegment().setHandleIn(handleIn); + path.setClosed(closed); + } + if (path.getArea() !== 0) { + paths.push(path); + } + } + } + return paths; + } + + return { + _getWinding: function(point, dir, closed) { + return getWinding(point, this.getCurves(), dir, closed); + }, + + unite: function(path, options) { + return traceBoolean(this, path, 'unite', options); + }, + + intersect: function(path, options) { + return traceBoolean(this, path, 'intersect', options); + }, + + subtract: function(path, options) { + return traceBoolean(this, path, 'subtract', options); + }, + + exclude: function(path, options) { + return traceBoolean(this, path, 'exclude', options); + }, + + divide: function(path, options) { + return options && (options.trace == false || options.stroke) + ? splitBoolean(this, path, 'divide') + : createResult([ + this.subtract(path, options), + this.intersect(path, options) + ], true, this, path, options); + }, + + resolveCrossings: function() { + var children = this._children, + paths = children || [this]; + + function hasOverlap(seg, path) { + var inter = seg && seg._intersection; + return inter && inter._overlap && inter._path === path; + } + + var hasOverlaps = false, + hasCrossings = false, + intersections = this.getIntersections(null, function(inter) { + return inter.hasOverlap() && (hasOverlaps = true) || + inter.isCrossing() && (hasCrossings = true); + }), + clearCurves = hasOverlaps && hasCrossings && []; + intersections = CurveLocation.expand(intersections); + if (hasOverlaps) { + var overlaps = divideLocations(intersections, function(inter) { + return inter.hasOverlap(); + }, clearCurves); + for (var i = overlaps.length - 1; i >= 0; i--) { + var overlap = overlaps[i], + path = overlap._path, + seg = overlap._segment, + prev = seg.getPrevious(), + next = seg.getNext(); + if (hasOverlap(prev, path) && hasOverlap(next, path)) { + seg.remove(); + prev._handleOut._set(0, 0); + next._handleIn._set(0, 0); + if (prev !== seg && !prev.getCurve().hasLength()) { + next._handleIn.set(prev._handleIn); + prev.remove(); + } + } + } + } + if (hasCrossings) { + divideLocations(intersections, hasOverlaps && function(inter) { + var curve1 = inter.getCurve(), + seg1 = inter.getSegment(), + other = inter._intersection, + curve2 = other._curve, + seg2 = other._segment; + if (curve1 && curve2 && curve1._path && curve2._path) + return true; + if (seg1) + seg1._intersection = null; + if (seg2) + seg2._intersection = null; + }, clearCurves); + if (clearCurves) + clearCurveHandles(clearCurves); + paths = tracePaths(Base.each(paths, function(path) { + this.push.apply(this, path._segments); + }, [])); + } + var length = paths.length, + item; + if (length > 1 && children) { + if (paths !== children) + this.setChildren(paths); + item = this; + } else if (length === 1 && !children) { + if (paths[0] !== this) + this.setSegments(paths[0].removeSegments()); + item = this; + } + if (!item) { + item = new CompoundPath(Item.NO_INSERT); + item.addChildren(paths); + item = item.reduce(); + item.copyAttributes(this); + this.replaceWith(item); + } + return item; + }, + + reorient: function(nonZero, clockwise) { + var children = this._children; + if (children && children.length) { + this.setChildren(reorientPaths(this.removeChildren(), + function(w) { + return !!(nonZero ? w : w & 1); + }, + clockwise)); + } else if (clockwise !== undefined) { + this.setClockwise(clockwise); + } + return this; + }, + + getInteriorPoint: function() { + var bounds = this.getBounds(), + point = bounds.getCenter(true); + if (!this.contains(point)) { + var curves = this.getCurves(), + y = point.y, + intercepts = [], + roots = []; + for (var i = 0, l = curves.length; i < l; i++) { + var v = curves[i].getValues(), + o0 = v[1], + o1 = v[3], + o2 = v[5], + o3 = v[7]; + if (y >= min(o0, o1, o2, o3) && y <= max(o0, o1, o2, o3)) { + var monoCurves = Curve.getMonoCurves(v); + for (var j = 0, m = monoCurves.length; j < m; j++) { + var mv = monoCurves[j], + mo0 = mv[1], + mo3 = mv[7]; + if ((mo0 !== mo3) && + (y >= mo0 && y <= mo3 || y >= mo3 && y <= mo0)){ + var x = y === mo0 ? mv[0] + : y === mo3 ? mv[6] + : Curve.solveCubic(mv, 1, y, roots, 0, 1) + === 1 + ? Curve.getPoint(mv, roots[0]).x + : (mv[0] + mv[6]) / 2; + intercepts.push(x); + } + } + } + } + if (intercepts.length > 1) { + intercepts.sort(function(a, b) { return a - b; }); + point.x = (intercepts[0] + intercepts[1]) / 2; + } + } + return point; + } + }; +}); + +var PathFlattener = Base.extend({ + _class: 'PathFlattener', + + initialize: function(path, flatness, maxRecursion, ignoreStraight, matrix) { + var curves = [], + parts = [], + length = 0, + minSpan = 1 / (maxRecursion || 32), + segments = path._segments, + segment1 = segments[0], + segment2; + + function addCurve(segment1, segment2) { + var curve = Curve.getValues(segment1, segment2, matrix); + curves.push(curve); + computeParts(curve, segment1._index, 0, 1); + } + + function computeParts(curve, index, t1, t2) { + if ((t2 - t1) > minSpan + && !(ignoreStraight && Curve.isStraight(curve)) + && !Curve.isFlatEnough(curve, flatness || 0.25)) { + var halves = Curve.subdivide(curve, 0.5), + tMid = (t1 + t2) / 2; + computeParts(halves[0], index, t1, tMid); + computeParts(halves[1], index, tMid, t2); + } else { + var dx = curve[6] - curve[0], + dy = curve[7] - curve[1], + dist = Math.sqrt(dx * dx + dy * dy); + if (dist > 0) { + length += dist; + parts.push({ + offset: length, + curve: curve, + index: index, + time: t2, + }); + } + } + } + + for (var i = 1, l = segments.length; i < l; i++) { + segment2 = segments[i]; + addCurve(segment1, segment2); + segment1 = segment2; + } + if (path._closed) + addCurve(segment2, segments[0]); + this.curves = curves; + this.parts = parts; + this.length = length; + this.index = 0; + }, + + _get: function(offset) { + var parts = this.parts, + length = parts.length, + start, + i, j = this.index; + for (;;) { + i = j; + if (!j || parts[--j].offset < offset) + break; + } + for (; i < length; i++) { + var part = parts[i]; + if (part.offset >= offset) { + this.index = i; + var prev = parts[i - 1], + prevTime = prev && prev.index === part.index ? prev.time : 0, + prevOffset = prev ? prev.offset : 0; + return { + index: part.index, + time: prevTime + (part.time - prevTime) + * (offset - prevOffset) / (part.offset - prevOffset) + }; + } + } + return { + index: parts[length - 1].index, + time: 1 + }; + }, + + drawPart: function(ctx, from, to) { + var start = this._get(from), + end = this._get(to); + for (var i = start.index, l = end.index; i <= l; i++) { + var curve = Curve.getPart(this.curves[i], + i === start.index ? start.time : 0, + i === end.index ? end.time : 1); + if (i === start.index) + ctx.moveTo(curve[0], curve[1]); + ctx.bezierCurveTo.apply(ctx, curve.slice(2)); + } + } +}, Base.each(Curve._evaluateMethods, + function(name) { + this[name + 'At'] = function(offset) { + var param = this._get(offset); + return Curve[name](this.curves[param.index], param.time); + }; + }, {}) +); + +var PathFitter = Base.extend({ + initialize: function(path) { + var points = this.points = [], + segments = path._segments, + closed = path._closed; + for (var i = 0, prev, l = segments.length; i < l; i++) { + var point = segments[i].point; + if (!prev || !prev.equals(point)) { + points.push(prev = point.clone()); + } + } + if (closed) { + points.unshift(points[points.length - 1]); + points.push(points[1]); + } + this.closed = closed; + }, + + fit: function(error) { + var points = this.points, + length = points.length, + segments = null; + if (length > 0) { + segments = [new Segment(points[0])]; + if (length > 1) { + this.fitCubic(segments, error, 0, length - 1, + points[1].subtract(points[0]), + points[length - 2].subtract(points[length - 1])); + if (this.closed) { + segments.shift(); + segments.pop(); + } + } + } + return segments; + }, + + fitCubic: function(segments, error, first, last, tan1, tan2) { + var points = this.points; + if (last - first === 1) { + var pt1 = points[first], + pt2 = points[last], + dist = pt1.getDistance(pt2) / 3; + this.addCurve(segments, [pt1, pt1.add(tan1.normalize(dist)), + pt2.add(tan2.normalize(dist)), pt2]); + return; + } + var uPrime = this.chordLengthParameterize(first, last), + maxError = Math.max(error, error * error), + split, + parametersInOrder = true; + for (var i = 0; i <= 4; i++) { + var curve = this.generateBezier(first, last, uPrime, tan1, tan2); + var max = this.findMaxError(first, last, curve, uPrime); + if (max.error < error && parametersInOrder) { + this.addCurve(segments, curve); + return; + } + split = max.index; + if (max.error >= maxError) + break; + parametersInOrder = this.reparameterize(first, last, uPrime, curve); + maxError = max.error; + } + var tanCenter = points[split - 1].subtract(points[split + 1]); + this.fitCubic(segments, error, first, split, tan1, tanCenter); + this.fitCubic(segments, error, split, last, tanCenter.negate(), tan2); + }, + + addCurve: function(segments, curve) { + var prev = segments[segments.length - 1]; + prev.setHandleOut(curve[1].subtract(curve[0])); + segments.push(new Segment(curve[3], curve[2].subtract(curve[3]))); + }, + + generateBezier: function(first, last, uPrime, tan1, tan2) { + var epsilon = 1e-12, + abs = Math.abs, + points = this.points, + pt1 = points[first], + pt2 = points[last], + C = [[0, 0], [0, 0]], + X = [0, 0]; + + for (var i = 0, l = last - first + 1; i < l; i++) { + var u = uPrime[i], + t = 1 - u, + b = 3 * u * t, + b0 = t * t * t, + b1 = b * t, + b2 = b * u, + b3 = u * u * u, + a1 = tan1.normalize(b1), + a2 = tan2.normalize(b2), + tmp = points[first + i] + .subtract(pt1.multiply(b0 + b1)) + .subtract(pt2.multiply(b2 + b3)); + C[0][0] += a1.dot(a1); + C[0][1] += a1.dot(a2); + C[1][0] = C[0][1]; + C[1][1] += a2.dot(a2); + X[0] += a1.dot(tmp); + X[1] += a2.dot(tmp); + } + + var detC0C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1], + alpha1, + alpha2; + if (abs(detC0C1) > epsilon) { + var detC0X = C[0][0] * X[1] - C[1][0] * X[0], + detXC1 = X[0] * C[1][1] - X[1] * C[0][1]; + alpha1 = detXC1 / detC0C1; + alpha2 = detC0X / detC0C1; + } else { + var c0 = C[0][0] + C[0][1], + c1 = C[1][0] + C[1][1]; + alpha1 = alpha2 = abs(c0) > epsilon ? X[0] / c0 + : abs(c1) > epsilon ? X[1] / c1 + : 0; + } + + var segLength = pt2.getDistance(pt1), + eps = epsilon * segLength, + handle1, + handle2; + if (alpha1 < eps || alpha2 < eps) { + alpha1 = alpha2 = segLength / 3; + } else { + var line = pt2.subtract(pt1); + handle1 = tan1.normalize(alpha1); + handle2 = tan2.normalize(alpha2); + if (handle1.dot(line) - handle2.dot(line) > segLength * segLength) { + alpha1 = alpha2 = segLength / 3; + handle1 = handle2 = null; + } + } + + return [pt1, + pt1.add(handle1 || tan1.normalize(alpha1)), + pt2.add(handle2 || tan2.normalize(alpha2)), + pt2]; + }, + + reparameterize: function(first, last, u, curve) { + for (var i = first; i <= last; i++) { + u[i - first] = this.findRoot(curve, this.points[i], u[i - first]); + } + for (var i = 1, l = u.length; i < l; i++) { + if (u[i] <= u[i - 1]) + return false; + } + return true; + }, + + findRoot: function(curve, point, u) { + var curve1 = [], + curve2 = []; + for (var i = 0; i <= 2; i++) { + curve1[i] = curve[i + 1].subtract(curve[i]).multiply(3); + } + for (var i = 0; i <= 1; i++) { + curve2[i] = curve1[i + 1].subtract(curve1[i]).multiply(2); + } + var pt = this.evaluate(3, curve, u), + pt1 = this.evaluate(2, curve1, u), + pt2 = this.evaluate(1, curve2, u), + diff = pt.subtract(point), + df = pt1.dot(pt1) + diff.dot(pt2); + return Numerical.isZero(df) ? u : u - diff.dot(pt1) / df; + }, + + evaluate: function(degree, curve, t) { + var tmp = curve.slice(); + for (var i = 1; i <= degree; i++) { + for (var j = 0; j <= degree - i; j++) { + tmp[j] = tmp[j].multiply(1 - t).add(tmp[j + 1].multiply(t)); + } + } + return tmp[0]; + }, + + chordLengthParameterize: function(first, last) { + var u = [0]; + for (var i = first + 1; i <= last; i++) { + u[i - first] = u[i - first - 1] + + this.points[i].getDistance(this.points[i - 1]); + } + for (var i = 1, m = last - first; i <= m; i++) { + u[i] /= u[m]; + } + return u; + }, + + findMaxError: function(first, last, curve, u) { + var index = Math.floor((last - first + 1) / 2), + maxDist = 0; + for (var i = first + 1; i < last; i++) { + var P = this.evaluate(3, curve, u[i - first]); + var v = P.subtract(this.points[i]); + var dist = v.x * v.x + v.y * v.y; + if (dist >= maxDist) { + maxDist = dist; + index = i; + } + } + return { + error: maxDist, + index: index + }; + } +}); + +var TextItem = Item.extend({ + _class: 'TextItem', + _applyMatrix: false, + _canApplyMatrix: false, + _serializeFields: { + content: null + }, + _boundsOptions: { stroke: false, handle: false }, + + initialize: function TextItem(arg) { + this._content = ''; + this._lines = []; + var hasProps = arg && Base.isPlainObject(arg) + && arg.x === undefined && arg.y === undefined; + this._initialize(hasProps && arg, !hasProps && Point.read(arguments)); + }, + + _equals: function(item) { + return this._content === item._content; + }, + + copyContent: function(source) { + this.setContent(source._content); + }, + + getContent: function() { + return this._content; + }, + + setContent: function(content) { + this._content = '' + content; + this._lines = this._content.split(/\r\n|\n|\r/mg); + this._changed(265); + }, + + isEmpty: function() { + return !this._content; + }, + + getCharacterStyle: '#getStyle', + setCharacterStyle: '#setStyle', + + getParagraphStyle: '#getStyle', + setParagraphStyle: '#setStyle' +}); + +var PointText = TextItem.extend({ + _class: 'PointText', + + initialize: function PointText() { + TextItem.apply(this, arguments); + }, + + getPoint: function() { + var point = this._matrix.getTranslation(); + return new LinkedPoint(point.x, point.y, this, 'setPoint'); + }, + + setPoint: function() { + var point = Point.read(arguments); + this.translate(point.subtract(this._matrix.getTranslation())); + }, + + _draw: function(ctx, param, viewMatrix) { + if (!this._content) + return; + this._setStyles(ctx, param, viewMatrix); + var lines = this._lines, + style = this._style, + hasFill = style.hasFill(), + hasStroke = style.hasStroke(), + leading = style.getLeading(), + shadowColor = ctx.shadowColor; + ctx.font = style.getFontStyle(); + ctx.textAlign = style.getJustification(); + for (var i = 0, l = lines.length; i < l; i++) { + ctx.shadowColor = shadowColor; + var line = lines[i]; + if (hasFill) { + ctx.fillText(line, 0, 0); + ctx.shadowColor = 'rgba(0,0,0,0)'; + } + if (hasStroke) + ctx.strokeText(line, 0, 0); + ctx.translate(0, leading); + } + }, + + _getBounds: function(matrix, options) { + var style = this._style, + lines = this._lines, + numLines = lines.length, + justification = style.getJustification(), + leading = style.getLeading(), + width = this.getView().getTextWidth(style.getFontStyle(), lines), + x = 0; + if (justification !== 'left') + x -= width / (justification === 'center' ? 2: 1); + var rect = new Rectangle(x, + numLines ? - 0.75 * leading : 0, + width, numLines * leading); + return matrix ? matrix._transformBounds(rect, rect) : rect; + } +}); + +var Color = Base.extend(new function() { + var types = { + gray: ['gray'], + rgb: ['red', 'green', 'blue'], + hsb: ['hue', 'saturation', 'brightness'], + hsl: ['hue', 'saturation', 'lightness'], + gradient: ['gradient', 'origin', 'destination', 'highlight'] + }; + + var componentParsers = {}, + colorCache = {}, + colorCtx; + + function fromCSS(string) { + var match = string.match(/^#(\w{1,2})(\w{1,2})(\w{1,2})$/), + components; + if (match) { + components = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + var value = match[i + 1]; + components[i] = parseInt(value.length == 1 + ? value + value : value, 16) / 255; + } + } else if (match = string.match(/^rgba?\((.*)\)$/)) { + components = match[1].split(','); + for (var i = 0, l = components.length; i < l; i++) { + var value = +components[i]; + components[i] = i < 3 ? value / 255 : value; + } + } else if (window) { + var cached = colorCache[string]; + if (!cached) { + if (!colorCtx) { + colorCtx = CanvasProvider.getContext(1, 1); + colorCtx.globalCompositeOperation = 'copy'; + } + colorCtx.fillStyle = 'rgba(0,0,0,0)'; + colorCtx.fillStyle = string; + colorCtx.fillRect(0, 0, 1, 1); + var data = colorCtx.getImageData(0, 0, 1, 1).data; + cached = colorCache[string] = [ + data[0] / 255, + data[1] / 255, + data[2] / 255 + ]; + } + components = cached.slice(); + } else { + components = [0, 0, 0]; + } + return components; + } + + var hsbIndices = [ + [0, 3, 1], + [2, 0, 1], + [1, 0, 3], + [1, 2, 0], + [3, 1, 0], + [0, 1, 2] + ]; + + var converters = { + 'rgb-hsb': function(r, g, b) { + var max = Math.max(r, g, b), + min = Math.min(r, g, b), + delta = max - min, + h = delta === 0 ? 0 + : ( max == r ? (g - b) / delta + (g < b ? 6 : 0) + : max == g ? (b - r) / delta + 2 + : (r - g) / delta + 4) * 60; + return [h, max === 0 ? 0 : delta / max, max]; + }, + + 'hsb-rgb': function(h, s, b) { + h = (((h / 60) % 6) + 6) % 6; + var i = Math.floor(h), + f = h - i, + i = hsbIndices[i], + v = [ + b, + b * (1 - s), + b * (1 - s * f), + b * (1 - s * (1 - f)) + ]; + return [v[i[0]], v[i[1]], v[i[2]]]; + }, + + 'rgb-hsl': function(r, g, b) { + var max = Math.max(r, g, b), + min = Math.min(r, g, b), + delta = max - min, + achromatic = delta === 0, + h = achromatic ? 0 + : ( max == r ? (g - b) / delta + (g < b ? 6 : 0) + : max == g ? (b - r) / delta + 2 + : (r - g) / delta + 4) * 60, + l = (max + min) / 2, + s = achromatic ? 0 : l < 0.5 + ? delta / (max + min) + : delta / (2 - max - min); + return [h, s, l]; + }, + + 'hsl-rgb': function(h, s, l) { + h = (((h / 360) % 1) + 1) % 1; + if (s === 0) + return [l, l, l]; + var t3s = [ h + 1 / 3, h, h - 1 / 3 ], + t2 = l < 0.5 ? l * (1 + s) : l + s - l * s, + t1 = 2 * l - t2, + c = []; + for (var i = 0; i < 3; i++) { + var t3 = t3s[i]; + if (t3 < 0) t3 += 1; + if (t3 > 1) t3 -= 1; + c[i] = 6 * t3 < 1 + ? t1 + (t2 - t1) * 6 * t3 + : 2 * t3 < 1 + ? t2 + : 3 * t3 < 2 + ? t1 + (t2 - t1) * ((2 / 3) - t3) * 6 + : t1; + } + return c; + }, + + 'rgb-gray': function(r, g, b) { + return [r * 0.2989 + g * 0.587 + b * 0.114]; + }, + + 'gray-rgb': function(g) { + return [g, g, g]; + }, + + 'gray-hsb': function(g) { + return [0, 0, g]; + }, + + 'gray-hsl': function(g) { + return [0, 0, g]; + }, + + 'gradient-rgb': function() { + return []; + }, + + 'rgb-gradient': function() { + return []; + } + + }; + + return Base.each(types, function(properties, type) { + componentParsers[type] = []; + Base.each(properties, function(name, index) { + var part = Base.capitalize(name), + hasOverlap = /^(hue|saturation)$/.test(name), + parser = componentParsers[type][index] = name === 'gradient' + ? function(value) { + var current = this._components[0]; + value = Gradient.read(Array.isArray(value) ? value + : arguments, 0, { readNull: true }); + if (current !== value) { + if (current) + current._removeOwner(this); + if (value) + value._addOwner(this); + } + return value; + } + : type === 'gradient' + ? function() { + return Point.read(arguments, 0, { + readNull: name === 'highlight', + clone: true + }); + } + : function(value) { + return value == null || isNaN(value) ? 0 : value; + }; + + this['get' + part] = function() { + return this._type === type + || hasOverlap && /^hs[bl]$/.test(this._type) + ? this._components[index] + : this._convert(type)[index]; + }; + + this['set' + part] = function(value) { + if (this._type !== type + && !(hasOverlap && /^hs[bl]$/.test(this._type))) { + this._components = this._convert(type); + this._properties = types[type]; + this._type = type; + } + this._components[index] = parser.call(this, value); + this._changed(); + }; + }, this); + }, { + _class: 'Color', + _readIndex: true, + + initialize: function Color(arg) { + var args = arguments, + reading = this.__read, + read = 0, + type, + components, + alpha, + values; + if (Array.isArray(arg)) { + args = arg; + arg = args[0]; + } + var argType = arg != null && typeof arg; + if (argType === 'string' && arg in types) { + type = arg; + arg = args[1]; + if (Array.isArray(arg)) { + components = arg; + alpha = args[2]; + } else { + if (reading) + read = 1; + args = Base.slice(args, 1); + argType = typeof arg; + } + } + if (!components) { + values = argType === 'number' + ? args + : argType === 'object' && arg.length != null + ? arg + : null; + if (values) { + if (!type) + type = values.length >= 3 + ? 'rgb' + : 'gray'; + var length = types[type].length; + alpha = values[length]; + if (reading) { + read += values === arguments + ? length + (alpha != null ? 1 : 0) + : 1; + } + if (values.length > length) + values = Base.slice(values, 0, length); + } else if (argType === 'string') { + type = 'rgb'; + components = fromCSS(arg); + if (components.length === 4) { + alpha = components[3]; + components.length--; + } + } else if (argType === 'object') { + if (arg.constructor === Color) { + type = arg._type; + components = arg._components.slice(); + alpha = arg._alpha; + if (type === 'gradient') { + for (var i = 1, l = components.length; i < l; i++) { + var point = components[i]; + if (point) + components[i] = point.clone(); + } + } + } else if (arg.constructor === Gradient) { + type = 'gradient'; + values = args; + } else { + type = 'hue' in arg + ? 'lightness' in arg + ? 'hsl' + : 'hsb' + : 'gradient' in arg || 'stops' in arg + || 'radial' in arg + ? 'gradient' + : 'gray' in arg + ? 'gray' + : 'rgb'; + var properties = types[type], + parsers = componentParsers[type]; + this._components = components = []; + for (var i = 0, l = properties.length; i < l; i++) { + var value = arg[properties[i]]; + if (value == null && !i && type === 'gradient' + && 'stops' in arg) { + value = { + stops: arg.stops, + radial: arg.radial + }; + } + value = parsers[i].call(this, value); + if (value != null) + components[i] = value; + } + alpha = arg.alpha; + } + } + if (reading && type) + read = 1; + } + this._type = type || 'rgb'; + if (!components) { + this._components = components = []; + var parsers = componentParsers[this._type]; + for (var i = 0, l = parsers.length; i < l; i++) { + var value = parsers[i].call(this, values && values[i]); + if (value != null) + components[i] = value; + } + } + this._components = components; + this._properties = types[this._type]; + this._alpha = alpha; + if (reading) + this.__read = read; + return this; + }, + + set: '#initialize', + + _serialize: function(options, dictionary) { + var components = this.getComponents(); + return Base.serialize( + /^(gray|rgb)$/.test(this._type) + ? components + : [this._type].concat(components), + options, true, dictionary); + }, + + _changed: function() { + this._canvasStyle = null; + if (this._owner) + this._owner._changed(65); + }, + + _convert: function(type) { + var converter; + return this._type === type + ? this._components.slice() + : (converter = converters[this._type + '-' + type]) + ? converter.apply(this, this._components) + : converters['rgb-' + type].apply(this, + converters[this._type + '-rgb'].apply(this, + this._components)); + }, + + convert: function(type) { + return new Color(type, this._convert(type), this._alpha); + }, + + getType: function() { + return this._type; + }, + + setType: function(type) { + this._components = this._convert(type); + this._properties = types[type]; + this._type = type; + }, + + getComponents: function() { + var components = this._components.slice(); + if (this._alpha != null) + components.push(this._alpha); + return components; + }, + + getAlpha: function() { + return this._alpha != null ? this._alpha : 1; + }, + + setAlpha: function(alpha) { + this._alpha = alpha == null ? null : Math.min(Math.max(alpha, 0), 1); + this._changed(); + }, + + hasAlpha: function() { + return this._alpha != null; + }, + + equals: function(color) { + var col = Base.isPlainValue(color, true) + ? Color.read(arguments) + : color; + return col === this || col && this._class === col._class + && this._type === col._type + && this.getAlpha() === col.getAlpha() + && Base.equals(this._components, col._components) + || false; + }, + + toString: function() { + var properties = this._properties, + parts = [], + isGradient = this._type === 'gradient', + f = Formatter.instance; + for (var i = 0, l = properties.length; i < l; i++) { + var value = this._components[i]; + if (value != null) + parts.push(properties[i] + ': ' + + (isGradient ? value : f.number(value))); + } + if (this._alpha != null) + parts.push('alpha: ' + f.number(this._alpha)); + return '{ ' + parts.join(', ') + ' }'; + }, + + toCSS: function(hex) { + var components = this._convert('rgb'), + alpha = hex || this._alpha == null ? 1 : this._alpha; + function convert(val) { + return Math.round((val < 0 ? 0 : val > 1 ? 1 : val) * 255); + } + components = [ + convert(components[0]), + convert(components[1]), + convert(components[2]) + ]; + if (alpha < 1) + components.push(alpha < 0 ? 0 : alpha); + return hex + ? '#' + ((1 << 24) + (components[0] << 16) + + (components[1] << 8) + + components[2]).toString(16).slice(1) + : (components.length == 4 ? 'rgba(' : 'rgb(') + + components.join(',') + ')'; + }, + + toCanvasStyle: function(ctx, matrix) { + if (this._canvasStyle) + return this._canvasStyle; + if (this._type !== 'gradient') + return this._canvasStyle = this.toCSS(); + var components = this._components, + gradient = components[0], + stops = gradient._stops, + origin = components[1], + destination = components[2], + highlight = components[3], + inverse = matrix && matrix.inverted(), + canvasGradient; + if (inverse) { + origin = inverse._transformPoint(origin); + destination = inverse._transformPoint(destination); + if (highlight) + highlight = inverse._transformPoint(highlight); + } + if (gradient._radial) { + var radius = destination.getDistance(origin); + if (highlight) { + var vector = highlight.subtract(origin); + if (vector.getLength() > radius) + highlight = origin.add(vector.normalize(radius - 0.1)); + } + var start = highlight || origin; + canvasGradient = ctx.createRadialGradient(start.x, start.y, + 0, origin.x, origin.y, radius); + } else { + canvasGradient = ctx.createLinearGradient(origin.x, origin.y, + destination.x, destination.y); + } + for (var i = 0, l = stops.length; i < l; i++) { + var stop = stops[i], + offset = stop._offset; + canvasGradient.addColorStop( + offset == null ? i / (l - 1) : offset, + stop._color.toCanvasStyle()); + } + return this._canvasStyle = canvasGradient; + }, + + transform: function(matrix) { + if (this._type === 'gradient') { + var components = this._components; + for (var i = 1, l = components.length; i < l; i++) { + var point = components[i]; + matrix._transformPoint(point, point, true); + } + this._changed(); + } + }, + + statics: { + _types: types, + + random: function() { + var random = Math.random; + return new Color(random(), random(), random()); + } + } + }); +}, +new function() { + var operators = { + add: function(a, b) { + return a + b; + }, + + subtract: function(a, b) { + return a - b; + }, + + multiply: function(a, b) { + return a * b; + }, + + divide: function(a, b) { + return a / b; + } + }; + + return Base.each(operators, function(operator, name) { + this[name] = function(color) { + color = Color.read(arguments); + var type = this._type, + components1 = this._components, + components2 = color._convert(type); + for (var i = 0, l = components1.length; i < l; i++) + components2[i] = operator(components1[i], components2[i]); + return new Color(type, components2, + this._alpha != null + ? operator(this._alpha, color.getAlpha()) + : null); + }; + }, { + }); +}); + +var Gradient = Base.extend({ + _class: 'Gradient', + + initialize: function Gradient(stops, radial) { + this._id = UID.get(); + if (stops && Base.isPlainObject(stops)) { + this.set(stops); + stops = radial = null; + } + if (this._stops == null) { + this.setStops(stops || ['white', 'black']); + } + if (this._radial == null) { + this.setRadial(typeof radial === 'string' && radial === 'radial' + || radial || false); + } + }, + + _serialize: function(options, dictionary) { + return dictionary.add(this, function() { + return Base.serialize([this._stops, this._radial], + options, true, dictionary); + }); + }, + + _changed: function() { + for (var i = 0, l = this._owners && this._owners.length; i < l; i++) { + this._owners[i]._changed(); + } + }, + + _addOwner: function(color) { + if (!this._owners) + this._owners = []; + this._owners.push(color); + }, + + _removeOwner: function(color) { + var index = this._owners ? this._owners.indexOf(color) : -1; + if (index != -1) { + this._owners.splice(index, 1); + if (!this._owners.length) + this._owners = undefined; + } + }, + + clone: function() { + var stops = []; + for (var i = 0, l = this._stops.length; i < l; i++) { + stops[i] = this._stops[i].clone(); + } + return new Gradient(stops, this._radial); + }, + + getStops: function() { + return this._stops; + }, + + setStops: function(stops) { + if (stops.length < 2) { + throw new Error( + 'Gradient stop list needs to contain at least two stops.'); + } + var _stops = this._stops; + if (_stops) { + for (var i = 0, l = _stops.length; i < l; i++) + _stops[i]._owner = undefined; + } + _stops = this._stops = GradientStop.readList(stops, 0, { clone: true }); + for (var i = 0, l = _stops.length; i < l; i++) + _stops[i]._owner = this; + this._changed(); + }, + + getRadial: function() { + return this._radial; + }, + + setRadial: function(radial) { + this._radial = radial; + this._changed(); + }, + + equals: function(gradient) { + if (gradient === this) + return true; + if (gradient && this._class === gradient._class) { + var stops1 = this._stops, + stops2 = gradient._stops, + length = stops1.length; + if (length === stops2.length) { + for (var i = 0; i < length; i++) { + if (!stops1[i].equals(stops2[i])) + return false; + } + return true; + } + } + return false; + } +}); + +var GradientStop = Base.extend({ + _class: 'GradientStop', + + initialize: function GradientStop(arg0, arg1) { + var color = arg0, + offset = arg1; + if (typeof arg0 === 'object' && arg1 === undefined) { + if (Array.isArray(arg0) && typeof arg0[0] !== 'number') { + color = arg0[0]; + offset = arg0[1]; + } else if ('color' in arg0 || 'offset' in arg0 + || 'rampPoint' in arg0) { + color = arg0.color; + offset = arg0.offset || arg0.rampPoint || 0; + } + } + this.setColor(color); + this.setOffset(offset); + }, + + clone: function() { + return new GradientStop(this._color.clone(), this._offset); + }, + + _serialize: function(options, dictionary) { + var color = this._color, + offset = this._offset; + return Base.serialize(offset == null ? [color] : [color, offset], + options, true, dictionary); + }, + + _changed: function() { + if (this._owner) + this._owner._changed(65); + }, + + getOffset: function() { + return this._offset; + }, + + setOffset: function(offset) { + this._offset = offset; + this._changed(); + }, + + getRampPoint: '#getOffset', + setRampPoint: '#setOffset', + + getColor: function() { + return this._color; + }, + + setColor: function() { + var color = Color.read(arguments, 0, { clone: true }); + if (color) + color._owner = this; + this._color = color; + this._changed(); + }, + + equals: function(stop) { + return stop === this || stop && this._class === stop._class + && this._color.equals(stop._color) + && this._offset == stop._offset + || false; + } +}); + +var Style = Base.extend(new function() { + var itemDefaults = { + fillColor: null, + fillRule: 'nonzero', + strokeColor: null, + strokeWidth: 1, + strokeCap: 'butt', + strokeJoin: 'miter', + strokeScaling: true, + miterLimit: 10, + dashOffset: 0, + dashArray: [], + shadowColor: null, + shadowBlur: 0, + shadowOffset: new Point(), + selectedColor: null + }, + groupDefaults = Base.set({}, itemDefaults, { + fontFamily: 'sans-serif', + fontWeight: 'normal', + fontSize: 12, + leading: null, + justification: 'left' + }), + textDefaults = Base.set({}, groupDefaults, { + fillColor: new Color() + }), + flags = { + strokeWidth: 97, + strokeCap: 97, + strokeJoin: 97, + strokeScaling: 105, + miterLimit: 97, + fontFamily: 9, + fontWeight: 9, + fontSize: 9, + font: 9, + leading: 9, + justification: 9 + }, + item = { + beans: true + }, + fields = { + _class: 'Style', + beans: true, + + initialize: function Style(style, _owner, _project) { + this._values = {}; + this._owner = _owner; + this._project = _owner && _owner._project || _project + || paper.project; + this._defaults = !_owner || _owner instanceof Group ? groupDefaults + : _owner instanceof TextItem ? textDefaults + : itemDefaults; + if (style) + this.set(style); + } + }; + + Base.each(groupDefaults, function(value, key) { + var isColor = /Color$/.test(key), + isPoint = key === 'shadowOffset', + part = Base.capitalize(key), + flag = flags[key], + set = 'set' + part, + get = 'get' + part; + + fields[set] = function(value) { + var owner = this._owner, + children = owner && owner._children; + if (children && children.length > 0 + && !(owner instanceof CompoundPath)) { + for (var i = 0, l = children.length; i < l; i++) + children[i]._style[set](value); + } else if (key in this._defaults) { + var old = this._values[key]; + if (old !== value) { + if (isColor) { + if (old && old._owner !== undefined) + old._owner = undefined; + if (value && value.constructor === Color) { + if (value._owner) + value = value.clone(); + value._owner = owner; + } + } + this._values[key] = value; + if (owner) + owner._changed(flag || 65); + } + } + }; + + fields[get] = function(_dontMerge) { + var owner = this._owner, + children = owner && owner._children, + value; + if (key in this._defaults && (!children || !children.length + || _dontMerge || owner instanceof CompoundPath)) { + var value = this._values[key]; + if (value === undefined) { + value = this._defaults[key]; + if (value && value.clone) + value = value.clone(); + } else { + var ctor = isColor ? Color : isPoint ? Point : null; + if (ctor && !(value && value.constructor === ctor)) { + this._values[key] = value = ctor.read([value], 0, + { readNull: true, clone: true }); + if (value && isColor) + value._owner = owner; + } + } + } else if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var childValue = children[i]._style[get](); + if (!i) { + value = childValue; + } else if (!Base.equals(value, childValue)) { + return undefined; + } + } + } + return value; + }; + + item[get] = function(_dontMerge) { + return this._style[get](_dontMerge); + }; + + item[set] = function(value) { + this._style[set](value); + }; + }); + + Base.each({ + Font: 'FontFamily', + WindingRule: 'FillRule' + }, function(value, key) { + var get = 'get' + key, + set = 'set' + key; + fields[get] = item[get] = '#get' + value; + fields[set] = item[set] = '#set' + value; + }); + + Item.inject(item); + return fields; +}, { + set: function(style) { + var isStyle = style instanceof Style, + values = isStyle ? style._values : style; + if (values) { + for (var key in values) { + if (key in this._defaults) { + var value = values[key]; + this[key] = value && isStyle && value.clone + ? value.clone() : value; + } + } + } + }, + + equals: function(style) { + function compare(style1, style2, secondary) { + var values1 = style1._values, + values2 = style2._values, + defaults2 = style2._defaults; + for (var key in values1) { + var value1 = values1[key], + value2 = values2[key]; + if (!(secondary && key in values2) && !Base.equals(value1, + value2 === undefined ? defaults2[key] : value2)) + return false; + } + return true; + } + + return style === this || style && this._class === style._class + && compare(this, style) + && compare(style, this, true) + || false; + }, + + hasFill: function() { + var color = this.getFillColor(); + return !!color && color.alpha > 0; + }, + + hasStroke: function() { + var color = this.getStrokeColor(); + return !!color && color.alpha > 0 && this.getStrokeWidth() > 0; + }, + + hasShadow: function() { + var color = this.getShadowColor(); + return !!color && color.alpha > 0 && (this.getShadowBlur() > 0 + || !this.getShadowOffset().isZero()); + }, + + getView: function() { + return this._project._view; + }, + + getFontStyle: function() { + var fontSize = this.getFontSize(); + return this.getFontWeight() + + ' ' + fontSize + (/[a-z]/i.test(fontSize + '') ? ' ' : 'px ') + + this.getFontFamily(); + }, + + getFont: '#getFontFamily', + setFont: '#setFontFamily', + + getLeading: function getLeading() { + var leading = getLeading.base.call(this), + fontSize = this.getFontSize(); + if (/pt|em|%|px/.test(fontSize)) + fontSize = this.getView().getPixelSize(fontSize); + return leading != null ? leading : fontSize * 1.2; + } + +}); + +var DomElement = new function() { + function handlePrefix(el, name, set, value) { + var prefixes = ['', 'webkit', 'moz', 'Moz', 'ms', 'o'], + suffix = name[0].toUpperCase() + name.substring(1); + for (var i = 0; i < 6; i++) { + var prefix = prefixes[i], + key = prefix ? prefix + suffix : name; + if (key in el) { + if (set) { + el[key] = value; + } else { + return el[key]; + } + break; + } + } + } + + return { + getStyles: function(el) { + var doc = el && el.nodeType !== 9 ? el.ownerDocument : el, + view = doc && doc.defaultView; + return view && view.getComputedStyle(el, ''); + }, + + getBounds: function(el, viewport) { + var doc = el.ownerDocument, + body = doc.body, + html = doc.documentElement, + rect; + try { + rect = el.getBoundingClientRect(); + } catch (e) { + rect = { left: 0, top: 0, width: 0, height: 0 }; + } + var x = rect.left - (html.clientLeft || body.clientLeft || 0), + y = rect.top - (html.clientTop || body.clientTop || 0); + if (!viewport) { + var view = doc.defaultView; + x += view.pageXOffset || html.scrollLeft || body.scrollLeft; + y += view.pageYOffset || html.scrollTop || body.scrollTop; + } + return new Rectangle(x, y, rect.width, rect.height); + }, + + getViewportBounds: function(el) { + var doc = el.ownerDocument, + view = doc.defaultView, + html = doc.documentElement; + return new Rectangle(0, 0, + view.innerWidth || html.clientWidth, + view.innerHeight || html.clientHeight + ); + }, + + getOffset: function(el, viewport) { + return DomElement.getBounds(el, viewport).getPoint(); + }, + + getSize: function(el) { + return DomElement.getBounds(el, true).getSize(); + }, + + isInvisible: function(el) { + return DomElement.getSize(el).equals(new Size(0, 0)); + }, + + isInView: function(el) { + return !DomElement.isInvisible(el) + && DomElement.getViewportBounds(el).intersects( + DomElement.getBounds(el, true)); + }, + + isInserted: function(el) { + return document.body.contains(el); + }, + + getPrefixed: function(el, name) { + return el && handlePrefix(el, name); + }, + + setPrefixed: function(el, name, value) { + if (typeof name === 'object') { + for (var key in name) + handlePrefix(el, key, true, name[key]); + } else { + handlePrefix(el, name, true, value); + } + } + }; +}; + +var DomEvent = { + add: function(el, events) { + if (el) { + for (var type in events) { + var func = events[type], + parts = type.split(/[\s,]+/g); + for (var i = 0, l = parts.length; i < l; i++) + el.addEventListener(parts[i], func, false); + } + } + }, + + remove: function(el, events) { + if (el) { + for (var type in events) { + var func = events[type], + parts = type.split(/[\s,]+/g); + for (var i = 0, l = parts.length; i < l; i++) + el.removeEventListener(parts[i], func, false); + } + } + }, + + getPoint: function(event) { + var pos = event.targetTouches + ? event.targetTouches.length + ? event.targetTouches[0] + : event.changedTouches[0] + : event; + return new Point( + pos.pageX || pos.clientX + document.documentElement.scrollLeft, + pos.pageY || pos.clientY + document.documentElement.scrollTop + ); + }, + + getTarget: function(event) { + return event.target || event.srcElement; + }, + + getRelatedTarget: function(event) { + return event.relatedTarget || event.toElement; + }, + + getOffset: function(event, target) { + return DomEvent.getPoint(event).subtract(DomElement.getOffset( + target || DomEvent.getTarget(event))); + } +}; + +DomEvent.requestAnimationFrame = new function() { + var nativeRequest = DomElement.getPrefixed(window, 'requestAnimationFrame'), + requested = false, + callbacks = [], + timer; + + function handleCallbacks() { + var functions = callbacks; + callbacks = []; + for (var i = 0, l = functions.length; i < l; i++) + functions[i](); + requested = nativeRequest && callbacks.length; + if (requested) + nativeRequest(handleCallbacks); + } + + return function(callback) { + callbacks.push(callback); + if (nativeRequest) { + if (!requested) { + nativeRequest(handleCallbacks); + requested = true; + } + } else if (!timer) { + timer = setInterval(handleCallbacks, 1000 / 60); + } + }; +}; + +var View = Base.extend(Emitter, { + _class: 'View', + + initialize: function View(project, element) { + + function getSize(name) { + return element[name] || parseInt(element.getAttribute(name), 10); + } + + function getCanvasSize() { + var size = DomElement.getSize(element); + return size.isNaN() || size.isZero() + ? new Size(getSize('width'), getSize('height')) + : size; + } + + var size; + if (window && element) { + this._id = element.getAttribute('id'); + if (this._id == null) + element.setAttribute('id', this._id = 'view-' + View._id++); + DomEvent.add(element, this._viewEvents); + var none = 'none'; + DomElement.setPrefixed(element.style, { + userDrag: none, + userSelect: none, + touchCallout: none, + contentZooming: none, + tapHighlightColor: 'rgba(0,0,0,0)' + }); + + if (PaperScope.hasAttribute(element, 'resize')) { + var that = this; + DomEvent.add(window, this._windowEvents = { + resize: function() { + that.setViewSize(getCanvasSize()); + } + }); + } + + size = getCanvasSize(); + + if (PaperScope.hasAttribute(element, 'stats') + && typeof Stats !== 'undefined') { + this._stats = new Stats(); + var stats = this._stats.domElement, + style = stats.style, + offset = DomElement.getOffset(element); + style.position = 'absolute'; + style.left = offset.x + 'px'; + style.top = offset.y + 'px'; + document.body.appendChild(stats); + } + } else { + size = new Size(element); + element = null; + } + this._project = project; + this._scope = project._scope; + this._element = element; + if (!this._pixelRatio) + this._pixelRatio = window && window.devicePixelRatio || 1; + this._setElementSize(size.width, size.height); + this._viewSize = size; + View._views.push(this); + View._viewsById[this._id] = this; + (this._matrix = new Matrix())._owner = this; + if (!View._focused) + View._focused = this; + this._frameItems = {}; + this._frameItemCount = 0; + this._itemEvents = { native: {}, virtual: {} }; + this._autoUpdate = !paper.agent.node; + this._needsUpdate = false; + }, + + remove: function() { + if (!this._project) + return false; + if (View._focused === this) + View._focused = null; + View._views.splice(View._views.indexOf(this), 1); + delete View._viewsById[this._id]; + var project = this._project; + if (project._view === this) + project._view = null; + DomEvent.remove(this._element, this._viewEvents); + DomEvent.remove(window, this._windowEvents); + this._element = this._project = null; + this.off('frame'); + this._animate = false; + this._frameItems = {}; + return true; + }, + + _events: Base.each( + Item._itemHandlers.concat(['onResize', 'onKeyDown', 'onKeyUp']), + function(name) { + this[name] = {}; + }, { + onFrame: { + install: function() { + this.play(); + }, + + uninstall: function() { + this.pause(); + } + } + } + ), + + _animate: false, + _time: 0, + _count: 0, + + getAutoUpdate: function() { + return this._autoUpdate; + }, + + setAutoUpdate: function(autoUpdate) { + this._autoUpdate = autoUpdate; + if (autoUpdate) + this.requestUpdate(); + }, + + update: function() { + }, + + draw: function() { + this.update(); + }, + + requestUpdate: function() { + if (!this._requested) { + var that = this; + DomEvent.requestAnimationFrame(function() { + that._requested = false; + if (that._animate) { + that.requestUpdate(); + var element = that._element; + if ((!DomElement.getPrefixed(document, 'hidden') + || PaperScope.getAttribute(element, 'keepalive') + === 'true') && DomElement.isInView(element)) { + that._handleFrame(); + } + } + if (that._autoUpdate) + that.update(); + }); + this._requested = true; + } + }, + + play: function() { + this._animate = true; + this.requestUpdate(); + }, + + pause: function() { + this._animate = false; + }, + + _handleFrame: function() { + paper = this._scope; + var now = Date.now() / 1000, + delta = this._last ? now - this._last : 0; + this._last = now; + this.emit('frame', new Base({ + delta: delta, + time: this._time += delta, + count: this._count++ + })); + if (this._stats) + this._stats.update(); + }, + + _animateItem: function(item, animate) { + var items = this._frameItems; + if (animate) { + items[item._id] = { + item: item, + time: 0, + count: 0 + }; + if (++this._frameItemCount === 1) + this.on('frame', this._handleFrameItems); + } else { + delete items[item._id]; + if (--this._frameItemCount === 0) { + this.off('frame', this._handleFrameItems); + } + } + }, + + _handleFrameItems: function(event) { + for (var i in this._frameItems) { + var entry = this._frameItems[i]; + entry.item.emit('frame', new Base(event, { + time: entry.time += event.delta, + count: entry.count++ + })); + } + }, + + _changed: function() { + this._project._changed(2049); + this._bounds = this._decomposed = undefined; + }, + + getElement: function() { + return this._element; + }, + + getPixelRatio: function() { + return this._pixelRatio; + }, + + getResolution: function() { + return this._pixelRatio * 72; + }, + + getViewSize: function() { + var size = this._viewSize; + return new LinkedSize(size.width, size.height, this, 'setViewSize'); + }, + + setViewSize: function() { + var size = Size.read(arguments), + delta = size.subtract(this._viewSize); + if (delta.isZero()) + return; + this._setElementSize(size.width, size.height); + this._viewSize.set(size); + this._changed(); + this.emit('resize', { size: size, delta: delta }); + if (this._autoUpdate) { + this.update(); + } + }, + + _setElementSize: function(width, height) { + var element = this._element; + if (element) { + if (element.width !== width) + element.width = width; + if (element.height !== height) + element.height = height; + } + }, + + getBounds: function() { + if (!this._bounds) + this._bounds = this._matrix.inverted()._transformBounds( + new Rectangle(new Point(), this._viewSize)); + return this._bounds; + }, + + getSize: function() { + return this.getBounds().getSize(); + }, + + isVisible: function() { + return DomElement.isInView(this._element); + }, + + isInserted: function() { + return DomElement.isInserted(this._element); + }, + + getPixelSize: function(size) { + var element = this._element, + pixels; + if (element) { + var parent = element.parentNode, + temp = document.createElement('div'); + temp.style.fontSize = size; + parent.appendChild(temp); + pixels = parseFloat(DomElement.getStyles(temp).fontSize); + parent.removeChild(temp); + } else { + pixels = parseFloat(pixels); + } + return pixels; + }, + + getTextWidth: function(font, lines) { + return 0; + } +}, Base.each(['rotate', 'scale', 'shear', 'skew'], function(key) { + var rotate = key === 'rotate'; + this[key] = function() { + var value = (rotate ? Base : Point).read(arguments), + center = Point.read(arguments, 0, { readNull: true }); + return this.transform(new Matrix()[key](value, + center || this.getCenter(true))); + }; +}, { + _decompose: function() { + return this._decomposed || (this._decomposed = this._matrix.decompose()); + }, + + translate: function() { + var mx = new Matrix(); + return this.transform(mx.translate.apply(mx, arguments)); + }, + + getCenter: function() { + return this.getBounds().getCenter(); + }, + + setCenter: function() { + var center = Point.read(arguments); + this.translate(this.getCenter().subtract(center)); + }, + + getZoom: function() { + var decomposed = this._decompose(), + scaling = decomposed && decomposed.scaling; + return scaling ? (scaling.x + scaling.y) / 2 : 0; + }, + + setZoom: function(zoom) { + this.transform(new Matrix().scale(zoom / this.getZoom(), + this.getCenter())); + }, + + getRotation: function() { + var decomposed = this._decompose(); + return decomposed && decomposed.rotation; + }, + + setRotation: function(rotation) { + var current = this.getRotation(); + if (current != null && rotation != null) { + this.rotate(rotation - current); + } + }, + + getScaling: function() { + var decomposed = this._decompose(), + scaling = decomposed && decomposed.scaling; + return scaling + ? new LinkedPoint(scaling.x, scaling.y, this, 'setScaling') + : undefined; + }, + + setScaling: function() { + var current = this.getScaling(), + scaling = Point.read(arguments, 0, { clone: true, readNull: true }); + if (current && scaling) { + this.scale(scaling.x / current.x, scaling.y / current.y); + } + }, + + getMatrix: function() { + return this._matrix; + }, + + setMatrix: function() { + var matrix = this._matrix; + matrix.initialize.apply(matrix, arguments); + }, + + transform: function(matrix) { + this._matrix.append(matrix); + }, + + scrollBy: function() { + this.translate(Point.read(arguments).negate()); + } +}), { + + projectToView: function() { + return this._matrix._transformPoint(Point.read(arguments)); + }, + + viewToProject: function() { + return this._matrix._inverseTransform(Point.read(arguments)); + }, + + getEventPoint: function(event) { + return this.viewToProject(DomEvent.getOffset(event, this._element)); + }, + +}, { + statics: { + _views: [], + _viewsById: {}, + _id: 0, + + create: function(project, element) { + if (document && typeof element === 'string') + element = document.getElementById(element); + var ctor = window ? CanvasView : View; + return new ctor(project, element); + } + } +}, +new function() { + if (!window) + return; + var prevFocus, + tempFocus, + dragging = false, + mouseDown = false; + + function getView(event) { + var target = DomEvent.getTarget(event); + return target.getAttribute && View._viewsById[ + target.getAttribute('id')]; + } + + function updateFocus() { + var view = View._focused; + if (!view || !view.isVisible()) { + for (var i = 0, l = View._views.length; i < l; i++) { + if ((view = View._views[i]).isVisible()) { + View._focused = tempFocus = view; + break; + } + } + } + } + + function handleMouseMove(view, event, point) { + view._handleMouseEvent('mousemove', event, point); + } + + var navigator = window.navigator, + mousedown, mousemove, mouseup; + if (navigator.pointerEnabled || navigator.msPointerEnabled) { + mousedown = 'pointerdown MSPointerDown'; + mousemove = 'pointermove MSPointerMove'; + mouseup = 'pointerup pointercancel MSPointerUp MSPointerCancel'; + } else { + mousedown = 'touchstart'; + mousemove = 'touchmove'; + mouseup = 'touchend touchcancel'; + if (!('ontouchstart' in window && navigator.userAgent.match( + /mobile|tablet|ip(ad|hone|od)|android|silk/i))) { + mousedown += ' mousedown'; + mousemove += ' mousemove'; + mouseup += ' mouseup'; + } + } + + var viewEvents = {}, + docEvents = { + mouseout: function(event) { + var view = View._focused, + target = DomEvent.getRelatedTarget(event); + if (view && (!target || target.nodeName === 'HTML')) { + var offset = DomEvent.getOffset(event, view._element), + x = offset.x, + abs = Math.abs, + ax = abs(x), + max = 1 << 25, + diff = ax - max; + offset.x = abs(diff) < ax ? diff * (x < 0 ? -1 : 1) : x; + handleMouseMove(view, event, view.viewToProject(offset)); + } + }, + + scroll: updateFocus + }; + + viewEvents[mousedown] = function(event) { + var view = View._focused = getView(event); + if (!dragging) { + dragging = true; + view._handleMouseEvent('mousedown', event); + } + }; + + docEvents[mousemove] = function(event) { + var view = View._focused; + if (!mouseDown) { + var target = getView(event); + if (target) { + if (view !== target) { + if (view) + handleMouseMove(view, event); + if (!prevFocus) + prevFocus = view; + view = View._focused = tempFocus = target; + } + } else if (tempFocus && tempFocus === view) { + if (prevFocus && !prevFocus.isInserted()) + prevFocus = null; + view = View._focused = prevFocus; + prevFocus = null; + updateFocus(); + } + } + if (view) + handleMouseMove(view, event); + }; + + docEvents[mousedown] = function() { + mouseDown = true; + }; + + docEvents[mouseup] = function(event) { + var view = View._focused; + if (view && dragging) + view._handleMouseEvent('mouseup', event); + mouseDown = dragging = false; + }; + + DomEvent.add(document, docEvents); + + DomEvent.add(window, { + load: updateFocus + }); + + var called = false, + prevented = false, + fallbacks = { + doubleclick: 'click', + mousedrag: 'mousemove' + }, + wasInView = false, + overView, + downPoint, + lastPoint, + downItem, + overItem, + dragItem, + clickItem, + clickTime, + dblClick; + + function emitMouseEvent(obj, target, type, event, point, prevPoint, + stopItem) { + var stopped = false, + mouseEvent; + + function emit(obj, type) { + if (obj.responds(type)) { + if (!mouseEvent) { + mouseEvent = new MouseEvent(type, event, point, + target || obj, + prevPoint ? point.subtract(prevPoint) : null); + } + if (obj.emit(type, mouseEvent)) { + called = true; + if (mouseEvent.prevented) + prevented = true; + if (mouseEvent.stopped) + return stopped = true; + } + } else { + var fallback = fallbacks[type]; + if (fallback) + return emit(obj, fallback); + } + } + + while (obj && obj !== stopItem) { + if (emit(obj, type)) + break; + obj = obj._parent; + } + return stopped; + } + + function emitMouseEvents(view, hitItem, type, event, point, prevPoint) { + view._project.removeOn(type); + prevented = called = false; + return (dragItem && emitMouseEvent(dragItem, null, type, event, + point, prevPoint) + || hitItem && hitItem !== dragItem + && !hitItem.isDescendant(dragItem) + && emitMouseEvent(hitItem, null, type, event, point, prevPoint, + dragItem) + || emitMouseEvent(view, dragItem || hitItem || view, type, event, + point, prevPoint)); + } + + var itemEventsMap = { + mousedown: { + mousedown: 1, + mousedrag: 1, + click: 1, + doubleclick: 1 + }, + mouseup: { + mouseup: 1, + mousedrag: 1, + click: 1, + doubleclick: 1 + }, + mousemove: { + mousedrag: 1, + mousemove: 1, + mouseenter: 1, + mouseleave: 1 + } + }; + + return { + _viewEvents: viewEvents, + + _handleMouseEvent: function(type, event, point) { + var itemEvents = this._itemEvents, + hitItems = itemEvents.native[type], + nativeMove = type === 'mousemove', + tool = this._scope.tool, + view = this; + + function responds(type) { + return itemEvents.virtual[type] || view.responds(type) + || tool && tool.responds(type); + } + + if (nativeMove && dragging && responds('mousedrag')) + type = 'mousedrag'; + if (!point) + point = this.getEventPoint(event); + + var inView = this.getBounds().contains(point), + hit = hitItems && inView && view._project.hitTest(point, { + tolerance: 0, + fill: true, + stroke: true + }), + hitItem = hit && hit.item || null, + handle = false, + mouse = {}; + mouse[type.substr(5)] = true; + + if (hitItems && hitItem !== overItem) { + if (overItem) { + emitMouseEvent(overItem, null, 'mouseleave', event, point); + } + if (hitItem) { + emitMouseEvent(hitItem, null, 'mouseenter', event, point); + } + overItem = hitItem; + } + if (wasInView ^ inView) { + emitMouseEvent(this, null, inView ? 'mouseenter' : 'mouseleave', + event, point); + overView = inView ? this : null; + handle = true; + } + if ((inView || mouse.drag) && !point.equals(lastPoint)) { + emitMouseEvents(this, hitItem, nativeMove ? type : 'mousemove', + event, point, lastPoint); + handle = true; + } + wasInView = inView; + if (mouse.down && inView || mouse.up && downPoint) { + emitMouseEvents(this, hitItem, type, event, point, downPoint); + if (mouse.down) { + dblClick = hitItem === clickItem + && (Date.now() - clickTime < 300); + downItem = clickItem = hitItem; + if (!prevented && hitItem) { + var item = hitItem; + while (item && !item.responds('mousedrag')) + item = item._parent; + if (item) + dragItem = hitItem; + } + downPoint = point; + } else if (mouse.up) { + if (!prevented && hitItem === downItem) { + clickTime = Date.now(); + emitMouseEvents(this, hitItem, dblClick ? 'doubleclick' + : 'click', event, point, downPoint); + dblClick = false; + } + downItem = dragItem = null; + } + wasInView = false; + handle = true; + } + lastPoint = point; + if (handle && tool) { + called = tool._handleMouseEvent(type, event, point, mouse) + || called; + } + + if (called && !mouse.move || mouse.down && responds('mouseup')) + event.preventDefault(); + }, + + _handleKeyEvent: function(type, event, key, character) { + var scope = this._scope, + tool = scope.tool, + keyEvent; + + function emit(obj) { + if (obj.responds(type)) { + paper = scope; + obj.emit(type, keyEvent = keyEvent + || new KeyEvent(type, event, key, character)); + } + } + + if (this.isVisible()) { + emit(this); + if (tool && tool.responds(type)) + emit(tool); + } + }, + + _countItemEvent: function(type, sign) { + var itemEvents = this._itemEvents, + native = itemEvents.native, + virtual = itemEvents.virtual; + for (var key in itemEventsMap) { + native[key] = (native[key] || 0) + + (itemEventsMap[key][type] || 0) * sign; + } + virtual[type] = (virtual[type] || 0) + sign; + }, + + statics: { + updateFocus: updateFocus + } + }; +}); + +var CanvasView = View.extend({ + _class: 'CanvasView', + + initialize: function CanvasView(project, canvas) { + if (!(canvas instanceof window.HTMLCanvasElement)) { + var size = Size.read(arguments, 1); + if (size.isZero()) + throw new Error( + 'Cannot create CanvasView with the provided argument: ' + + Base.slice(arguments, 1)); + canvas = CanvasProvider.getCanvas(size); + } + var ctx = this._context = canvas.getContext('2d'); + ctx.save(); + this._pixelRatio = 1; + if (!/^off|false$/.test(PaperScope.getAttribute(canvas, 'hidpi'))) { + var deviceRatio = window.devicePixelRatio || 1, + backingStoreRatio = DomElement.getPrefixed(ctx, + 'backingStorePixelRatio') || 1; + this._pixelRatio = deviceRatio / backingStoreRatio; + } + View.call(this, project, canvas); + this._needsUpdate = true; + }, + + remove: function remove() { + this._context.restore(); + return remove.base.call(this); + }, + + _setElementSize: function _setElementSize(width, height) { + var pixelRatio = this._pixelRatio; + _setElementSize.base.call(this, width * pixelRatio, height * pixelRatio); + if (pixelRatio !== 1) { + var element = this._element, + ctx = this._context; + if (!PaperScope.hasAttribute(element, 'resize')) { + var style = element.style; + style.width = width + 'px'; + style.height = height + 'px'; + } + ctx.restore(); + ctx.save(); + ctx.scale(pixelRatio, pixelRatio); + } + }, + + getPixelSize: function getPixelSize(size) { + var agent = paper.agent, + pixels; + if (agent && agent.firefox) { + pixels = getPixelSize.base.call(this, size); + } else { + var ctx = this._context, + prevFont = ctx.font; + ctx.font = size + ' serif'; + pixels = parseFloat(ctx.font); + ctx.font = prevFont; + } + return pixels; + }, + + getTextWidth: function(font, lines) { + var ctx = this._context, + prevFont = ctx.font, + width = 0; + ctx.font = font; + for (var i = 0, l = lines.length; i < l; i++) + width = Math.max(width, ctx.measureText(lines[i]).width); + ctx.font = prevFont; + return width; + }, + + update: function() { + if (!this._needsUpdate) + return false; + var project = this._project, + ctx = this._context, + size = this._viewSize; + ctx.clearRect(0, 0, size.width + 1, size.height + 1); + if (project) + project.draw(ctx, this._matrix, this._pixelRatio); + this._needsUpdate = false; + return true; + } +}); + +var Event = Base.extend({ + _class: 'Event', + + initialize: function Event(event) { + this.event = event; + this.type = event && event.type; + }, + + prevented: false, + stopped: false, + + preventDefault: function() { + this.prevented = true; + this.event.preventDefault(); + }, + + stopPropagation: function() { + this.stopped = true; + this.event.stopPropagation(); + }, + + stop: function() { + this.stopPropagation(); + this.preventDefault(); + }, + + getTimeStamp: function() { + return this.event.timeStamp; + }, + + getModifiers: function() { + return Key.modifiers; + } +}); + +var KeyEvent = Event.extend({ + _class: 'KeyEvent', + + initialize: function KeyEvent(type, event, key, character) { + this.type = type; + this.event = event; + this.key = key; + this.character = character; + }, + + toString: function() { + return "{ type: '" + this.type + + "', key: '" + this.key + + "', character: '" + this.character + + "', modifiers: " + this.getModifiers() + + " }"; + } +}); + +var Key = new function() { + var keyLookup = { + '\t': 'tab', + ' ': 'space', + '\b': 'backspace', + '\x7f': 'delete', + 'Spacebar': 'space', + 'Del': 'delete', + 'Win': 'meta', + 'Esc': 'escape' + }, + + charLookup = { + 'tab': '\t', + 'space': ' ', + 'enter': '\r' + }, + + keyMap = {}, + charMap = {}, + metaFixMap, + downKey, + + modifiers = new Base({ + shift: false, + control: false, + alt: false, + meta: false, + capsLock: false, + space: false + }).inject({ + option: { + get: function() { + return this.alt; + } + }, + + command: { + get: function() { + var agent = paper && paper.agent; + return agent && agent.mac ? this.meta : this.control; + } + } + }); + + function getKey(event) { + var key = event.key || event.keyIdentifier; + key = /^U\+/.test(key) + ? String.fromCharCode(parseInt(key.substr(2), 16)) + : /^Arrow[A-Z]/.test(key) ? key.substr(5) + : key === 'Unidentified' || key === undefined + ? String.fromCharCode(event.keyCode) + : key; + return keyLookup[key] || + (key.length > 1 ? Base.hyphenate(key) : key.toLowerCase()); + } + + function handleKey(down, key, character, event) { + var type = down ? 'keydown' : 'keyup', + view = View._focused, + name; + keyMap[key] = down; + if (down) { + charMap[key] = character; + } else { + delete charMap[key]; + } + if (key.length > 1 && (name = Base.camelize(key)) in modifiers) { + modifiers[name] = down; + var agent = paper && paper.agent; + if (name === 'meta' && agent && agent.mac) { + if (down) { + metaFixMap = {}; + } else { + for (var k in metaFixMap) { + if (k in charMap) + handleKey(false, k, metaFixMap[k], event); + } + metaFixMap = null; + } + } + } else if (down && metaFixMap) { + metaFixMap[key] = character; + } + if (view) { + view._handleKeyEvent(down ? 'keydown' : 'keyup', event, key, + character); + } + } + + DomEvent.add(document, { + keydown: function(event) { + var key = getKey(event), + agent = paper && paper.agent; + if (key.length > 1 || agent && (agent.chrome && (event.altKey + || agent.mac && event.metaKey + || !agent.mac && event.ctrlKey))) { + handleKey(true, key, + charLookup[key] || (key.length > 1 ? '' : key), event); + } else { + downKey = key; + } + }, + + keypress: function(event) { + if (downKey) { + var key = getKey(event), + code = event.charCode, + character = code >= 32 ? String.fromCharCode(code) + : key.length > 1 ? '' : key; + if (key !== downKey) { + key = character.toLowerCase(); + } + handleKey(true, key, character, event); + downKey = null; + } + }, + + keyup: function(event) { + var key = getKey(event); + if (key in charMap) + handleKey(false, key, charMap[key], event); + } + }); + + DomEvent.add(window, { + blur: function(event) { + for (var key in charMap) + handleKey(false, key, charMap[key], event); + } + }); + + return { + modifiers: modifiers, + + isDown: function(key) { + return !!keyMap[key]; + } + }; +}; + +var MouseEvent = Event.extend({ + _class: 'MouseEvent', + + initialize: function MouseEvent(type, event, point, target, delta) { + this.type = type; + this.event = event; + this.point = point; + this.target = target; + this.delta = delta; + }, + + toString: function() { + return "{ type: '" + this.type + + "', point: " + this.point + + ', target: ' + this.target + + (this.delta ? ', delta: ' + this.delta : '') + + ', modifiers: ' + this.getModifiers() + + ' }'; + } +}); + +var ToolEvent = Event.extend({ + _class: 'ToolEvent', + _item: null, + + initialize: function ToolEvent(tool, type, event) { + this.tool = tool; + this.type = type; + this.event = event; + }, + + _choosePoint: function(point, toolPoint) { + return point ? point : toolPoint ? toolPoint.clone() : null; + }, + + getPoint: function() { + return this._choosePoint(this._point, this.tool._point); + }, + + setPoint: function(point) { + this._point = point; + }, + + getLastPoint: function() { + return this._choosePoint(this._lastPoint, this.tool._lastPoint); + }, + + setLastPoint: function(lastPoint) { + this._lastPoint = lastPoint; + }, + + getDownPoint: function() { + return this._choosePoint(this._downPoint, this.tool._downPoint); + }, + + setDownPoint: function(downPoint) { + this._downPoint = downPoint; + }, + + getMiddlePoint: function() { + if (!this._middlePoint && this.tool._lastPoint) { + return this.tool._point.add(this.tool._lastPoint).divide(2); + } + return this._middlePoint; + }, + + setMiddlePoint: function(middlePoint) { + this._middlePoint = middlePoint; + }, + + getDelta: function() { + return !this._delta && this.tool._lastPoint + ? this.tool._point.subtract(this.tool._lastPoint) + : this._delta; + }, + + setDelta: function(delta) { + this._delta = delta; + }, + + getCount: function() { + return this.tool[/^mouse(down|up)$/.test(this.type) + ? '_downCount' : '_moveCount']; + }, + + setCount: function(count) { + this.tool[/^mouse(down|up)$/.test(this.type) ? 'downCount' : 'count'] + = count; + }, + + getItem: function() { + if (!this._item) { + var result = this.tool._scope.project.hitTest(this.getPoint()); + if (result) { + var item = result.item, + parent = item._parent; + while (/^(Group|CompoundPath)$/.test(parent._class)) { + item = parent; + parent = parent._parent; + } + this._item = item; + } + } + return this._item; + }, + + setItem: function(item) { + this._item = item; + }, + + toString: function() { + return '{ type: ' + this.type + + ', point: ' + this.getPoint() + + ', count: ' + this.getCount() + + ', modifiers: ' + this.getModifiers() + + ' }'; + } +}); + +var Tool = PaperScopeItem.extend({ + _class: 'Tool', + _list: 'tools', + _reference: 'tool', + _events: ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onMouseMove', + 'onActivate', 'onDeactivate', 'onEditOptions', 'onKeyDown', + 'onKeyUp'], + + initialize: function Tool(props) { + PaperScopeItem.call(this); + this._moveCount = -1; + this._downCount = -1; + this.set(props); + }, + + getMinDistance: function() { + return this._minDistance; + }, + + setMinDistance: function(minDistance) { + this._minDistance = minDistance; + if (minDistance != null && this._maxDistance != null + && minDistance > this._maxDistance) { + this._maxDistance = minDistance; + } + }, + + getMaxDistance: function() { + return this._maxDistance; + }, + + setMaxDistance: function(maxDistance) { + this._maxDistance = maxDistance; + if (this._minDistance != null && maxDistance != null + && maxDistance < this._minDistance) { + this._minDistance = maxDistance; + } + }, + + getFixedDistance: function() { + return this._minDistance == this._maxDistance + ? this._minDistance : null; + }, + + setFixedDistance: function(distance) { + this._minDistance = this._maxDistance = distance; + }, + + _handleMouseEvent: function(type, event, point, mouse) { + paper = this._scope; + if (mouse.drag && !this.responds(type)) + type = 'mousemove'; + var move = mouse.move || mouse.drag, + responds = this.responds(type), + minDistance = this.minDistance, + maxDistance = this.maxDistance, + called = false, + tool = this; + function update(minDistance, maxDistance) { + var pt = point, + toolPoint = move ? tool._point : (tool._downPoint || pt); + if (move) { + if (tool._moveCount && pt.equals(toolPoint)) { + return false; + } + if (toolPoint && (minDistance != null || maxDistance != null)) { + var vector = pt.subtract(toolPoint), + distance = vector.getLength(); + if (distance < (minDistance || 0)) + return false; + if (maxDistance) { + pt = toolPoint.add(vector.normalize( + Math.min(distance, maxDistance))); + } + } + tool._moveCount++; + } + tool._point = pt; + tool._lastPoint = toolPoint || pt; + if (mouse.down) { + tool._moveCount = -1; + tool._downPoint = pt; + tool._downCount++; + } + return true; + } + + function emit() { + if (responds) { + called = tool.emit(type, new ToolEvent(tool, type, event)) + || called; + } + } + + if (mouse.down) { + update(); + emit(); + } else if (mouse.up) { + update(null, maxDistance); + emit(); + } else if (responds) { + while (update(minDistance, maxDistance)) + emit(); + } + return called; + } + +}); + +var Http = { + request: function(options) { + var xhr = new self.XMLHttpRequest(); + xhr.open((options.method || 'get').toUpperCase(), options.url, + Base.pick(options.async, true)); + if (options.mimeType) + xhr.overrideMimeType(options.mimeType); + xhr.onload = function() { + var status = xhr.status; + if (status === 0 || status === 200) { + if (options.onLoad) { + options.onLoad.call(xhr, xhr.responseText); + } + } else { + xhr.onerror(); + } + }; + xhr.onerror = function() { + var status = xhr.status, + message = 'Could not load "' + options.url + '" (Status: ' + + status + ')'; + if (options.onError) { + options.onError(message, status); + } else { + throw new Error(message); + } + }; + return xhr.send(null); + } +}; + +var CanvasProvider = { + canvases: [], + + getCanvas: function(width, height) { + if (!window) + return null; + var canvas, + clear = true; + if (typeof width === 'object') { + height = width.height; + width = width.width; + } + if (this.canvases.length) { + canvas = this.canvases.pop(); + } else { + canvas = document.createElement('canvas'); + clear = false; + } + var ctx = canvas.getContext('2d'); + if (!ctx) { + throw new Error('Canvas ' + canvas + + ' is unable to provide a 2D context.'); + } + if (canvas.width === width && canvas.height === height) { + if (clear) + ctx.clearRect(0, 0, width + 1, height + 1); + } else { + canvas.width = width; + canvas.height = height; + } + ctx.save(); + return canvas; + }, + + getContext: function(width, height) { + var canvas = this.getCanvas(width, height); + return canvas ? canvas.getContext('2d') : null; + }, + + release: function(obj) { + var canvas = obj && obj.canvas ? obj.canvas : obj; + if (canvas && canvas.getContext) { + canvas.getContext('2d').restore(); + this.canvases.push(canvas); + } + } +}; + +var BlendMode = new function() { + var min = Math.min, + max = Math.max, + abs = Math.abs, + sr, sg, sb, sa, + br, bg, bb, ba, + dr, dg, db; + + function getLum(r, g, b) { + return 0.2989 * r + 0.587 * g + 0.114 * b; + } + + function setLum(r, g, b, l) { + var d = l - getLum(r, g, b); + dr = r + d; + dg = g + d; + db = b + d; + var l = getLum(dr, dg, db), + mn = min(dr, dg, db), + mx = max(dr, dg, db); + if (mn < 0) { + var lmn = l - mn; + dr = l + (dr - l) * l / lmn; + dg = l + (dg - l) * l / lmn; + db = l + (db - l) * l / lmn; + } + if (mx > 255) { + var ln = 255 - l, + mxl = mx - l; + dr = l + (dr - l) * ln / mxl; + dg = l + (dg - l) * ln / mxl; + db = l + (db - l) * ln / mxl; + } + } + + function getSat(r, g, b) { + return max(r, g, b) - min(r, g, b); + } + + function setSat(r, g, b, s) { + var col = [r, g, b], + mx = max(r, g, b), + mn = min(r, g, b), + md; + mn = mn === r ? 0 : mn === g ? 1 : 2; + mx = mx === r ? 0 : mx === g ? 1 : 2; + md = min(mn, mx) === 0 ? max(mn, mx) === 1 ? 2 : 1 : 0; + if (col[mx] > col[mn]) { + col[md] = (col[md] - col[mn]) * s / (col[mx] - col[mn]); + col[mx] = s; + } else { + col[md] = col[mx] = 0; + } + col[mn] = 0; + dr = col[0]; + dg = col[1]; + db = col[2]; + } + + var modes = { + multiply: function() { + dr = br * sr / 255; + dg = bg * sg / 255; + db = bb * sb / 255; + }, + + screen: function() { + dr = br + sr - (br * sr / 255); + dg = bg + sg - (bg * sg / 255); + db = bb + sb - (bb * sb / 255); + }, + + overlay: function() { + dr = br < 128 ? 2 * br * sr / 255 : 255 - 2 * (255 - br) * (255 - sr) / 255; + dg = bg < 128 ? 2 * bg * sg / 255 : 255 - 2 * (255 - bg) * (255 - sg) / 255; + db = bb < 128 ? 2 * bb * sb / 255 : 255 - 2 * (255 - bb) * (255 - sb) / 255; + }, + + 'soft-light': function() { + var t = sr * br / 255; + dr = t + br * (255 - (255 - br) * (255 - sr) / 255 - t) / 255; + t = sg * bg / 255; + dg = t + bg * (255 - (255 - bg) * (255 - sg) / 255 - t) / 255; + t = sb * bb / 255; + db = t + bb * (255 - (255 - bb) * (255 - sb) / 255 - t) / 255; + }, + + 'hard-light': function() { + dr = sr < 128 ? 2 * sr * br / 255 : 255 - 2 * (255 - sr) * (255 - br) / 255; + dg = sg < 128 ? 2 * sg * bg / 255 : 255 - 2 * (255 - sg) * (255 - bg) / 255; + db = sb < 128 ? 2 * sb * bb / 255 : 255 - 2 * (255 - sb) * (255 - bb) / 255; + }, + + 'color-dodge': function() { + dr = br === 0 ? 0 : sr === 255 ? 255 : min(255, 255 * br / (255 - sr)); + dg = bg === 0 ? 0 : sg === 255 ? 255 : min(255, 255 * bg / (255 - sg)); + db = bb === 0 ? 0 : sb === 255 ? 255 : min(255, 255 * bb / (255 - sb)); + }, + + 'color-burn': function() { + dr = br === 255 ? 255 : sr === 0 ? 0 : max(0, 255 - (255 - br) * 255 / sr); + dg = bg === 255 ? 255 : sg === 0 ? 0 : max(0, 255 - (255 - bg) * 255 / sg); + db = bb === 255 ? 255 : sb === 0 ? 0 : max(0, 255 - (255 - bb) * 255 / sb); + }, + + darken: function() { + dr = br < sr ? br : sr; + dg = bg < sg ? bg : sg; + db = bb < sb ? bb : sb; + }, + + lighten: function() { + dr = br > sr ? br : sr; + dg = bg > sg ? bg : sg; + db = bb > sb ? bb : sb; + }, + + difference: function() { + dr = br - sr; + if (dr < 0) + dr = -dr; + dg = bg - sg; + if (dg < 0) + dg = -dg; + db = bb - sb; + if (db < 0) + db = -db; + }, + + exclusion: function() { + dr = br + sr * (255 - br - br) / 255; + dg = bg + sg * (255 - bg - bg) / 255; + db = bb + sb * (255 - bb - bb) / 255; + }, + + hue: function() { + setSat(sr, sg, sb, getSat(br, bg, bb)); + setLum(dr, dg, db, getLum(br, bg, bb)); + }, + + saturation: function() { + setSat(br, bg, bb, getSat(sr, sg, sb)); + setLum(dr, dg, db, getLum(br, bg, bb)); + }, + + luminosity: function() { + setLum(br, bg, bb, getLum(sr, sg, sb)); + }, + + color: function() { + setLum(sr, sg, sb, getLum(br, bg, bb)); + }, + + add: function() { + dr = min(br + sr, 255); + dg = min(bg + sg, 255); + db = min(bb + sb, 255); + }, + + subtract: function() { + dr = max(br - sr, 0); + dg = max(bg - sg, 0); + db = max(bb - sb, 0); + }, + + average: function() { + dr = (br + sr) / 2; + dg = (bg + sg) / 2; + db = (bb + sb) / 2; + }, + + negation: function() { + dr = 255 - abs(255 - sr - br); + dg = 255 - abs(255 - sg - bg); + db = 255 - abs(255 - sb - bb); + } + }; + + var nativeModes = this.nativeModes = Base.each([ + 'source-over', 'source-in', 'source-out', 'source-atop', + 'destination-over', 'destination-in', 'destination-out', + 'destination-atop', 'lighter', 'darker', 'copy', 'xor' + ], function(mode) { + this[mode] = true; + }, {}); + + var ctx = CanvasProvider.getContext(1, 1); + if (ctx) { + Base.each(modes, function(func, mode) { + var darken = mode === 'darken', + ok = false; + ctx.save(); + try { + ctx.fillStyle = darken ? '#300' : '#a00'; + ctx.fillRect(0, 0, 1, 1); + ctx.globalCompositeOperation = mode; + if (ctx.globalCompositeOperation === mode) { + ctx.fillStyle = darken ? '#a00' : '#300'; + ctx.fillRect(0, 0, 1, 1); + ok = ctx.getImageData(0, 0, 1, 1).data[0] !== darken + ? 170 : 51; + } + } catch (e) {} + ctx.restore(); + nativeModes[mode] = ok; + }); + CanvasProvider.release(ctx); + } + + this.process = function(mode, srcContext, dstContext, alpha, offset) { + var srcCanvas = srcContext.canvas, + normal = mode === 'normal'; + if (normal || nativeModes[mode]) { + dstContext.save(); + dstContext.setTransform(1, 0, 0, 1, 0, 0); + dstContext.globalAlpha = alpha; + if (!normal) + dstContext.globalCompositeOperation = mode; + dstContext.drawImage(srcCanvas, offset.x, offset.y); + dstContext.restore(); + } else { + var process = modes[mode]; + if (!process) + return; + var dstData = dstContext.getImageData(offset.x, offset.y, + srcCanvas.width, srcCanvas.height), + dst = dstData.data, + src = srcContext.getImageData(0, 0, + srcCanvas.width, srcCanvas.height).data; + for (var i = 0, l = dst.length; i < l; i += 4) { + sr = src[i]; + br = dst[i]; + sg = src[i + 1]; + bg = dst[i + 1]; + sb = src[i + 2]; + bb = dst[i + 2]; + sa = src[i + 3]; + ba = dst[i + 3]; + process(); + var a1 = sa * alpha / 255, + a2 = 1 - a1; + dst[i] = a1 * dr + a2 * br; + dst[i + 1] = a1 * dg + a2 * bg; + dst[i + 2] = a1 * db + a2 * bb; + dst[i + 3] = sa * alpha + a2 * ba; + } + dstContext.putImageData(dstData, offset.x, offset.y); + } + }; +}; + +var SvgElement = new function() { + var svg = 'http://www.w3.org/2000/svg', + xmlns = 'http://www.w3.org/2000/xmlns', + xlink = 'http://www.w3.org/1999/xlink', + attributeNamespace = { + href: xlink, + xlink: xmlns, + xmlns: xmlns + '/', + 'xmlns:xlink': xmlns + '/' + }; + + function create(tag, attributes, formatter) { + return set(document.createElementNS(svg, tag), attributes, formatter); + } + + function get(node, name) { + var namespace = attributeNamespace[name], + value = namespace + ? node.getAttributeNS(namespace, name) + : node.getAttribute(name); + return value === 'null' ? null : value; + } + + function set(node, attributes, formatter) { + for (var name in attributes) { + var value = attributes[name], + namespace = attributeNamespace[name]; + if (typeof value === 'number' && formatter) + value = formatter.number(value); + if (namespace) { + node.setAttributeNS(namespace, name, value); + } else { + node.setAttribute(name, value); + } + } + return node; + } + + return { + svg: svg, + xmlns: xmlns, + xlink: xlink, + + create: create, + get: get, + set: set + }; +}; + +var SvgStyles = Base.each({ + fillColor: ['fill', 'color'], + fillRule: ['fill-rule', 'string'], + strokeColor: ['stroke', 'color'], + strokeWidth: ['stroke-width', 'number'], + strokeCap: ['stroke-linecap', 'string'], + strokeJoin: ['stroke-linejoin', 'string'], + strokeScaling: ['vector-effect', 'lookup', { + true: 'none', + false: 'non-scaling-stroke' + }, function(item, value) { + return !value + && (item instanceof PathItem + || item instanceof Shape + || item instanceof TextItem); + }], + miterLimit: ['stroke-miterlimit', 'number'], + dashArray: ['stroke-dasharray', 'array'], + dashOffset: ['stroke-dashoffset', 'number'], + fontFamily: ['font-family', 'string'], + fontWeight: ['font-weight', 'string'], + fontSize: ['font-size', 'number'], + justification: ['text-anchor', 'lookup', { + left: 'start', + center: 'middle', + right: 'end' + }], + opacity: ['opacity', 'number'], + blendMode: ['mix-blend-mode', 'style'] +}, function(entry, key) { + var part = Base.capitalize(key), + lookup = entry[2]; + this[key] = { + type: entry[1], + property: key, + attribute: entry[0], + toSVG: lookup, + fromSVG: lookup && Base.each(lookup, function(value, name) { + this[value] = name; + }, {}), + exportFilter: entry[3], + get: 'get' + part, + set: 'set' + part + }; +}, {}); + +new function() { + var formatter; + + function getTransform(matrix, coordinates, center) { + var attrs = new Base(), + trans = matrix.getTranslation(); + if (coordinates) { + matrix = matrix._shiftless(); + var point = matrix._inverseTransform(trans); + attrs[center ? 'cx' : 'x'] = point.x; + attrs[center ? 'cy' : 'y'] = point.y; + trans = null; + } + if (!matrix.isIdentity()) { + var decomposed = matrix.decompose(); + if (decomposed) { + var parts = [], + angle = decomposed.rotation, + scale = decomposed.scaling, + skew = decomposed.skewing; + if (trans && !trans.isZero()) + parts.push('translate(' + formatter.point(trans) + ')'); + if (angle) + parts.push('rotate(' + formatter.number(angle) + ')'); + if (!Numerical.isZero(scale.x - 1) + || !Numerical.isZero(scale.y - 1)) + parts.push('scale(' + formatter.point(scale) +')'); + if (skew.x) + parts.push('skewX(' + formatter.number(skew.x) + ')'); + if (skew.y) + parts.push('skewY(' + formatter.number(skew.y) + ')'); + attrs.transform = parts.join(' '); + } else { + attrs.transform = 'matrix(' + matrix.getValues().join(',') + ')'; + } + } + return attrs; + } + + function exportGroup(item, options) { + var attrs = getTransform(item._matrix), + children = item._children; + var node = SvgElement.create('g', attrs, formatter); + for (var i = 0, l = children.length; i < l; i++) { + var child = children[i]; + var childNode = exportSVG(child, options); + if (childNode) { + if (child.isClipMask()) { + var clip = SvgElement.create('clipPath'); + clip.appendChild(childNode); + setDefinition(child, clip, 'clip'); + SvgElement.set(node, { + 'clip-path': 'url(#' + clip.id + ')' + }); + } else { + node.appendChild(childNode); + } + } + } + return node; + } + + function exportRaster(item, options) { + var attrs = getTransform(item._matrix, true), + size = item.getSize(), + image = item.getImage(); + attrs.x -= size.width / 2; + attrs.y -= size.height / 2; + attrs.width = size.width; + attrs.height = size.height; + attrs.href = options.embedImages == false && image && image.src + || item.toDataURL(); + return SvgElement.create('image', attrs, formatter); + } + + function exportPath(item, options) { + var matchShapes = options.matchShapes; + if (matchShapes) { + var shape = item.toShape(false); + if (shape) + return exportShape(shape, options); + } + var segments = item._segments, + length = segments.length, + type, + attrs = getTransform(item._matrix); + if (matchShapes && length >= 2 && !item.hasHandles()) { + if (length > 2) { + type = item._closed ? 'polygon' : 'polyline'; + var parts = []; + for (var i = 0; i < length; i++) { + parts.push(formatter.point(segments[i]._point)); + } + attrs.points = parts.join(' '); + } else { + type = 'line'; + var start = segments[0]._point, + end = segments[1]._point; + attrs.set({ + x1: start.x, + y1: start.y, + x2: end.x, + y2: end.y + }); + } + } else { + type = 'path'; + attrs.d = item.getPathData(null, options.precision); + } + return SvgElement.create(type, attrs, formatter); + } + + function exportShape(item) { + var type = item._type, + radius = item._radius, + attrs = getTransform(item._matrix, true, type !== 'rectangle'); + if (type === 'rectangle') { + type = 'rect'; + var size = item._size, + width = size.width, + height = size.height; + attrs.x -= width / 2; + attrs.y -= height / 2; + attrs.width = width; + attrs.height = height; + if (radius.isZero()) + radius = null; + } + if (radius) { + if (type === 'circle') { + attrs.r = radius; + } else { + attrs.rx = radius.width; + attrs.ry = radius.height; + } + } + return SvgElement.create(type, attrs, formatter); + } + + function exportCompoundPath(item, options) { + var attrs = getTransform(item._matrix); + var data = item.getPathData(null, options.precision); + if (data) + attrs.d = data; + return SvgElement.create('path', attrs, formatter); + } + + function exportSymbolItem(item, options) { + var attrs = getTransform(item._matrix, true), + definition = item._definition, + node = getDefinition(definition, 'symbol'), + definitionItem = definition._item, + bounds = definitionItem.getBounds(); + if (!node) { + node = SvgElement.create('symbol', { + viewBox: formatter.rectangle(bounds) + }); + node.appendChild(exportSVG(definitionItem, options)); + setDefinition(definition, node, 'symbol'); + } + attrs.href = '#' + node.id; + attrs.x += bounds.x; + attrs.y += bounds.y; + attrs.width = bounds.width; + attrs.height = bounds.height; + attrs.overflow = 'visible'; + return SvgElement.create('use', attrs, formatter); + } + + function exportGradient(color) { + var gradientNode = getDefinition(color, 'color'); + if (!gradientNode) { + var gradient = color.getGradient(), + radial = gradient._radial, + origin = color.getOrigin(), + destination = color.getDestination(), + attrs; + if (radial) { + attrs = { + cx: origin.x, + cy: origin.y, + r: origin.getDistance(destination) + }; + var highlight = color.getHighlight(); + if (highlight) { + attrs.fx = highlight.x; + attrs.fy = highlight.y; + } + } else { + attrs = { + x1: origin.x, + y1: origin.y, + x2: destination.x, + y2: destination.y + }; + } + attrs.gradientUnits = 'userSpaceOnUse'; + gradientNode = SvgElement.create((radial ? 'radial' : 'linear') + + 'Gradient', attrs, formatter); + var stops = gradient._stops; + for (var i = 0, l = stops.length; i < l; i++) { + var stop = stops[i], + stopColor = stop._color, + alpha = stopColor.getAlpha(), + offset = stop._offset; + attrs = { + offset: offset == null ? i / (l - 1) : offset + }; + if (stopColor) + attrs['stop-color'] = stopColor.toCSS(true); + if (alpha < 1) + attrs['stop-opacity'] = alpha; + gradientNode.appendChild( + SvgElement.create('stop', attrs, formatter)); + } + setDefinition(color, gradientNode, 'color'); + } + return 'url(#' + gradientNode.id + ')'; + } + + function exportText(item) { + var node = SvgElement.create('text', getTransform(item._matrix, true), + formatter); + node.textContent = item._content; + return node; + } + + var exporters = { + Group: exportGroup, + Layer: exportGroup, + Raster: exportRaster, + Path: exportPath, + Shape: exportShape, + CompoundPath: exportCompoundPath, + SymbolItem: exportSymbolItem, + PointText: exportText + }; + + function applyStyle(item, node, isRoot) { + var attrs = {}, + parent = !isRoot && item.getParent(), + style = []; + + if (item._name != null) + attrs.id = item._name; + + Base.each(SvgStyles, function(entry) { + var get = entry.get, + type = entry.type, + value = item[get](); + if (entry.exportFilter + ? entry.exportFilter(item, value) + : !parent || !Base.equals(parent[get](), value)) { + if (type === 'color' && value != null) { + var alpha = value.getAlpha(); + if (alpha < 1) + attrs[entry.attribute + '-opacity'] = alpha; + } + if (type === 'style') { + style.push(entry.attribute + ': ' + value); + } else { + attrs[entry.attribute] = value == null ? 'none' + : type === 'color' ? value.gradient + ? exportGradient(value, item) + : value.toCSS(true) + : type === 'array' ? value.join(',') + : type === 'lookup' ? entry.toSVG[value] + : value; + } + } + }); + + if (style.length) + attrs.style = style.join(';'); + + if (attrs.opacity === 1) + delete attrs.opacity; + + if (!item._visible) + attrs.visibility = 'hidden'; + + return SvgElement.set(node, attrs, formatter); + } + + var definitions; + function getDefinition(item, type) { + if (!definitions) + definitions = { ids: {}, svgs: {} }; + return item && definitions.svgs[type + '-' + + (item._id || item.__id || (item.__id = UID.get('svg')))]; + } + + function setDefinition(item, node, type) { + if (!definitions) + getDefinition(); + var typeId = definitions.ids[type] = (definitions.ids[type] || 0) + 1; + node.id = type + '-' + typeId; + definitions.svgs[type + '-' + (item._id || item.__id)] = node; + } + + function exportDefinitions(node, options) { + var svg = node, + defs = null; + if (definitions) { + svg = node.nodeName.toLowerCase() === 'svg' && node; + for (var i in definitions.svgs) { + if (!defs) { + if (!svg) { + svg = SvgElement.create('svg'); + svg.appendChild(node); + } + defs = svg.insertBefore(SvgElement.create('defs'), + svg.firstChild); + } + defs.appendChild(definitions.svgs[i]); + } + definitions = null; + } + return options.asString + ? new self.XMLSerializer().serializeToString(svg) + : svg; + } + + function exportSVG(item, options, isRoot) { + var exporter = exporters[item._class], + node = exporter && exporter(item, options); + if (node) { + var onExport = options.onExport; + if (onExport) + node = onExport(item, node, options) || node; + var data = JSON.stringify(item._data); + if (data && data !== '{}' && data !== 'null') + node.setAttribute('data-paper-data', data); + } + return node && applyStyle(item, node, isRoot); + } + + function setOptions(options) { + if (!options) + options = {}; + formatter = new Formatter(options.precision); + return options; + } + + Item.inject({ + exportSVG: function(options) { + options = setOptions(options); + return exportDefinitions(exportSVG(this, options, true), options); + } + }); + + Project.inject({ + exportSVG: function(options) { + options = setOptions(options); + var children = this._children, + view = this.getView(), + bounds = Base.pick(options.bounds, 'view'), + mx = options.matrix || bounds === 'view' && view._matrix, + matrix = mx && Matrix.read([mx]), + rect = bounds === 'view' + ? new Rectangle([0, 0], view.getViewSize()) + : bounds === 'content' + ? Item._getBounds(children, matrix, { stroke: true }) + .rect + : Rectangle.read([bounds], 0, { readNull: true }), + attrs = { + version: '1.1', + xmlns: SvgElement.svg, + 'xmlns:xlink': SvgElement.xlink, + }; + if (rect) { + attrs.width = rect.width; + attrs.height = rect.height; + if (rect.x || rect.y) + attrs.viewBox = formatter.rectangle(rect); + } + var node = SvgElement.create('svg', attrs, formatter), + parent = node; + if (matrix && !matrix.isIdentity()) { + parent = node.appendChild(SvgElement.create('g', + getTransform(matrix), formatter)); + } + for (var i = 0, l = children.length; i < l; i++) { + parent.appendChild(exportSVG(children[i], options, true)); + } + return exportDefinitions(node, options); + } + }); +}; + +new function() { + + var definitions = {}, + rootSize; + + function getValue(node, name, isString, allowNull, allowPercent) { + var value = SvgElement.get(node, name), + res = value == null + ? allowNull + ? null + : isString ? '' : 0 + : isString + ? value + : parseFloat(value); + return /%\s*$/.test(value) + ? (res / 100) * (allowPercent ? 1 + : rootSize[/x|^width/.test(name) ? 'width' : 'height']) + : res; + } + + function getPoint(node, x, y, allowNull, allowPercent) { + x = getValue(node, x || 'x', false, allowNull, allowPercent); + y = getValue(node, y || 'y', false, allowNull, allowPercent); + return allowNull && (x == null || y == null) ? null + : new Point(x, y); + } + + function getSize(node, w, h, allowNull, allowPercent) { + w = getValue(node, w || 'width', false, allowNull, allowPercent); + h = getValue(node, h || 'height', false, allowNull, allowPercent); + return allowNull && (w == null || h == null) ? null + : new Size(w, h); + } + + function convertValue(value, type, lookup) { + return value === 'none' ? null + : type === 'number' ? parseFloat(value) + : type === 'array' ? + value ? value.split(/[\s,]+/g).map(parseFloat) : [] + : type === 'color' ? getDefinition(value) || value + : type === 'lookup' ? lookup[value] + : value; + } + + function importGroup(node, type, options, isRoot) { + var nodes = node.childNodes, + isClip = type === 'clippath', + isDefs = type === 'defs', + item = new Group(), + project = item._project, + currentStyle = project._currentStyle, + children = []; + if (!isClip && !isDefs) { + item = applyAttributes(item, node, isRoot); + project._currentStyle = item._style.clone(); + } + if (isRoot) { + var defs = node.querySelectorAll('defs'); + for (var i = 0, l = defs.length; i < l; i++) { + importNode(defs[i], options, false); + } + } + for (var i = 0, l = nodes.length; i < l; i++) { + var childNode = nodes[i], + child; + if (childNode.nodeType === 1 + && !/^defs$/i.test(childNode.nodeName) + && (child = importNode(childNode, options, false)) + && !(child instanceof SymbolDefinition)) + children.push(child); + } + item.addChildren(children); + if (isClip) + item = applyAttributes(item.reduce(), node, isRoot); + project._currentStyle = currentStyle; + if (isClip || isDefs) { + item.remove(); + item = null; + } + return item; + } + + function importPoly(node, type) { + var coords = node.getAttribute('points').match( + /[+-]?(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g), + points = []; + for (var i = 0, l = coords.length; i < l; i += 2) + points.push(new Point( + parseFloat(coords[i]), + parseFloat(coords[i + 1]))); + var path = new Path(points); + if (type === 'polygon') + path.closePath(); + return path; + } + + function importPath(node) { + return PathItem.create(node.getAttribute('d')); + } + + function importGradient(node, type) { + var id = (getValue(node, 'href', true) || '').substring(1), + radial = type === 'radialgradient', + gradient; + if (id) { + gradient = definitions[id].getGradient(); + if (gradient._radial ^ radial) { + gradient = gradient.clone(); + gradient._radial = radial; + } + } else { + var nodes = node.childNodes, + stops = []; + for (var i = 0, l = nodes.length; i < l; i++) { + var child = nodes[i]; + if (child.nodeType === 1) + stops.push(applyAttributes(new GradientStop(), child)); + } + gradient = new Gradient(stops, radial); + } + var origin, destination, highlight, + scaleToBounds = getValue(node, 'gradientUnits', true) !== + 'userSpaceOnUse'; + if (radial) { + origin = getPoint(node, 'cx', 'cy', false, scaleToBounds); + destination = origin.add( + getValue(node, 'r', false, false, scaleToBounds), 0); + highlight = getPoint(node, 'fx', 'fy', true, scaleToBounds); + } else { + origin = getPoint(node, 'x1', 'y1', false, scaleToBounds); + destination = getPoint(node, 'x2', 'y2', false, scaleToBounds); + } + var color = applyAttributes( + new Color(gradient, origin, destination, highlight), node); + color._scaleToBounds = scaleToBounds; + return null; + } + + var importers = { + '#document': function (node, type, options, isRoot) { + var nodes = node.childNodes; + for (var i = 0, l = nodes.length; i < l; i++) { + var child = nodes[i]; + if (child.nodeType === 1) + return importNode(child, options, isRoot); + } + }, + g: importGroup, + svg: importGroup, + clippath: importGroup, + polygon: importPoly, + polyline: importPoly, + path: importPath, + lineargradient: importGradient, + radialgradient: importGradient, + + image: function (node) { + var raster = new Raster(getValue(node, 'href', true)); + raster.on('load', function() { + var size = getSize(node); + this.setSize(size); + var center = this._matrix._transformPoint( + getPoint(node).add(size.divide(2))); + this.translate(center); + }); + return raster; + }, + + symbol: function(node, type, options, isRoot) { + return new SymbolDefinition( + importGroup(node, type, options, isRoot), true); + }, + + defs: importGroup, + + use: function(node) { + var id = (getValue(node, 'href', true) || '').substring(1), + definition = definitions[id], + point = getPoint(node); + return definition + ? definition instanceof SymbolDefinition + ? definition.place(point) + : definition.clone().translate(point) + : null; + }, + + circle: function(node) { + return new Shape.Circle( + getPoint(node, 'cx', 'cy'), + getValue(node, 'r')); + }, + + ellipse: function(node) { + return new Shape.Ellipse({ + center: getPoint(node, 'cx', 'cy'), + radius: getSize(node, 'rx', 'ry') + }); + }, + + rect: function(node) { + return new Shape.Rectangle(new Rectangle( + getPoint(node), + getSize(node) + ), getSize(node, 'rx', 'ry')); + }, + + line: function(node) { + return new Path.Line( + getPoint(node, 'x1', 'y1'), + getPoint(node, 'x2', 'y2')); + }, + + text: function(node) { + var text = new PointText(getPoint(node).add( + getPoint(node, 'dx', 'dy'))); + text.setContent(node.textContent.trim() || ''); + return text; + } + }; + + function applyTransform(item, value, name, node) { + if (item.transform) { + var transforms = (node.getAttribute(name) || '').split(/\)\s*/g), + matrix = new Matrix(); + for (var i = 0, l = transforms.length; i < l; i++) { + var transform = transforms[i]; + if (!transform) + break; + var parts = transform.split(/\(\s*/), + command = parts[0], + v = parts[1].split(/[\s,]+/g); + for (var j = 0, m = v.length; j < m; j++) + v[j] = parseFloat(v[j]); + switch (command) { + case 'matrix': + matrix.append( + new Matrix(v[0], v[1], v[2], v[3], v[4], v[5])); + break; + case 'rotate': + matrix.rotate(v[0], v[1], v[2]); + break; + case 'translate': + matrix.translate(v[0], v[1]); + break; + case 'scale': + matrix.scale(v); + break; + case 'skewX': + matrix.skew(v[0], 0); + break; + case 'skewY': + matrix.skew(0, v[0]); + break; + } + } + item.transform(matrix); + } + } + + function applyOpacity(item, value, name) { + var key = name === 'fill-opacity' ? 'getFillColor' : 'getStrokeColor', + color = item[key] && item[key](); + if (color) + color.setAlpha(parseFloat(value)); + } + + var attributes = Base.set(Base.each(SvgStyles, function(entry) { + this[entry.attribute] = function(item, value) { + if (item[entry.set]) { + item[entry.set](convertValue(value, entry.type, entry.fromSVG)); + if (entry.type === 'color') { + var color = item[entry.get](); + if (color) { + if (color._scaleToBounds) { + var bounds = item.getBounds(); + color.transform(new Matrix() + .translate(bounds.getPoint()) + .scale(bounds.getSize())); + } + } + } + } + }; + }, {}), { + id: function(item, value) { + definitions[value] = item; + if (item.setName) + item.setName(value); + }, + + 'clip-path': function(item, value) { + var clip = getDefinition(value); + if (clip) { + clip = clip.clone(); + clip.setClipMask(true); + if (item instanceof Group) { + item.insertChild(0, clip); + } else { + return new Group(clip, item); + } + } + }, + + gradientTransform: applyTransform, + transform: applyTransform, + + 'fill-opacity': applyOpacity, + 'stroke-opacity': applyOpacity, + + visibility: function(item, value) { + if (item.setVisible) + item.setVisible(value === 'visible'); + }, + + display: function(item, value) { + if (item.setVisible) + item.setVisible(value !== null); + }, + + 'stop-color': function(item, value) { + if (item.setColor) + item.setColor(value); + }, + + 'stop-opacity': function(item, value) { + if (item._color) + item._color.setAlpha(parseFloat(value)); + }, + + offset: function(item, value) { + if (item.setOffset) { + var percent = value.match(/(.*)%$/); + item.setOffset(percent ? percent[1] / 100 : parseFloat(value)); + } + }, + + viewBox: function(item, value, name, node, styles) { + var rect = new Rectangle(convertValue(value, 'array')), + size = getSize(node, null, null, true), + group, + matrix; + if (item instanceof Group) { + var scale = size ? size.divide(rect.getSize()) : 1, + matrix = new Matrix().scale(scale) + .translate(rect.getPoint().negate()); + group = item; + } else if (item instanceof SymbolDefinition) { + if (size) + rect.setSize(size); + group = item._item; + } + if (group) { + if (getAttribute(node, 'overflow', styles) !== 'visible') { + var clip = new Shape.Rectangle(rect); + clip.setClipMask(true); + group.addChild(clip); + } + if (matrix) + group.transform(matrix); + } + } + }); + + function getAttribute(node, name, styles) { + var attr = node.attributes[name], + value = attr && attr.value; + if (!value) { + var style = Base.camelize(name); + value = node.style[style]; + if (!value && styles.node[style] !== styles.parent[style]) + value = styles.node[style]; + } + return !value ? undefined + : value === 'none' ? null + : value; + } + + function applyAttributes(item, node, isRoot) { + if (node.style) { + var parent = node.parentNode, + styles = { + node: DomElement.getStyles(node) || {}, + parent: !isRoot && !/^defs$/i.test(parent.tagName) + && DomElement.getStyles(parent) || {} + }; + Base.each(attributes, function(apply, name) { + var value = getAttribute(node, name, styles); + item = value !== undefined + && apply(item, value, name, node, styles) || item; + }); + } + return item; + } + + function getDefinition(value) { + var match = value && value.match(/\((?:["'#]*)([^"')]+)/), + name = match && match[1], + res = name && definitions[window + ? name.replace(window.location.href.split('#')[0] + '#', '') + : name]; + if (res && res._scaleToBounds) { + res = res.clone(); + res._scaleToBounds = true; + } + return res; + } + + function importNode(node, options, isRoot) { + var type = node.nodeName.toLowerCase(), + isElement = type !== '#document', + body = document.body, + container, + parent, + next; + if (isRoot && isElement) { + rootSize = paper.getView().getSize(); + rootSize = getSize(node, null, null, true) || rootSize; + container = SvgElement.create('svg', { + style: 'stroke-width: 1px; stroke-miterlimit: 10' + }); + parent = node.parentNode; + next = node.nextSibling; + container.appendChild(node); + body.appendChild(container); + } + var settings = paper.settings, + applyMatrix = settings.applyMatrix, + insertItems = settings.insertItems; + settings.applyMatrix = false; + settings.insertItems = false; + var importer = importers[type], + item = importer && importer(node, type, options, isRoot) || null; + settings.insertItems = insertItems; + settings.applyMatrix = applyMatrix; + if (item) { + if (isElement && !(item instanceof Group)) + item = applyAttributes(item, node, isRoot); + var onImport = options.onImport, + data = isElement && node.getAttribute('data-paper-data'); + if (onImport) + item = onImport(node, item, options) || item; + if (options.expandShapes && item instanceof Shape) { + item.remove(); + item = item.toPath(); + } + if (data) + item._data = JSON.parse(data); + } + if (container) { + body.removeChild(container); + if (parent) { + if (next) { + parent.insertBefore(node, next); + } else { + parent.appendChild(node); + } + } + } + if (isRoot) { + definitions = {}; + if (item && Base.pick(options.applyMatrix, applyMatrix)) + item.matrix.apply(true, true); + } + return item; + } + + function importSVG(source, options, owner) { + if (!source) + return null; + options = typeof options === 'function' ? { onLoad: options } + : options || {}; + var scope = paper, + item = null; + + function onLoad(svg) { + try { + var node = typeof svg === 'object' ? svg : new self.DOMParser() + .parseFromString(svg, 'image/svg+xml'); + if (!node.nodeName) { + node = null; + throw new Error('Unsupported SVG source: ' + source); + } + paper = scope; + item = importNode(node, options, true); + if (!options || options.insert !== false) { + owner._insertItem(undefined, item); + } + var onLoad = options.onLoad; + if (onLoad) + onLoad(item, svg); + } catch (e) { + onError(e); + } + } + + function onError(message, status) { + var onError = options.onError; + if (onError) { + onError(message, status); + } else { + throw new Error(message); + } + } + + if (typeof source === 'string' && !/^.* 3) { + cats.sort(function(a, b) {return b.length - a.length;}); + f += "switch(str.length){"; + for (var i = 0; i < cats.length; ++i) { + var cat = cats[i]; + f += "case " + cat[0].length + ":"; + compareTo(cat); + } + f += "}"; + + } else { + compareTo(words); + } + return new Function("str", f); + } + + var isReservedWord3 = makePredicate("abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile"); + + var isReservedWord5 = makePredicate("class enum extends super const export import"); + + var isStrictReservedWord = makePredicate("implements interface let package private protected public static yield"); + + var isStrictBadIdWord = makePredicate("eval arguments"); + + var isKeyword = makePredicate("break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"); + + var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + var nonASCIIidentifierChars = "\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + + var newline = /[\n\r\u2028\u2029]/; + + var lineBreak = /\r\n|[\n\r\u2028\u2029]/g; + + var isIdentifierStart = exports.isIdentifierStart = function(code) { + if (code < 65) return code === 36; + if (code < 91) return true; + if (code < 97) return code === 95; + if (code < 123)return true; + return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); + }; + + var isIdentifierChar = exports.isIdentifierChar = function(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code < 91) return true; + if (code < 97) return code === 95; + if (code < 123)return true; + return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + }; + + function line_loc_t() { + this.line = tokCurLine; + this.column = tokPos - tokLineStart; + } + + function initTokenState() { + tokCurLine = 1; + tokPos = tokLineStart = 0; + tokRegexpAllowed = true; + skipSpace(); + } + + function finishToken(type, val) { + tokEnd = tokPos; + if (options.locations) tokEndLoc = new line_loc_t; + tokType = type; + skipSpace(); + tokVal = val; + tokRegexpAllowed = type.beforeExpr; + } + + function skipBlockComment() { + var startLoc = options.onComment && options.locations && new line_loc_t; + var start = tokPos, end = input.indexOf("*/", tokPos += 2); + if (end === -1) raise(tokPos - 2, "Unterminated comment"); + tokPos = end + 2; + if (options.locations) { + lineBreak.lastIndex = start; + var match; + while ((match = lineBreak.exec(input)) && match.index < tokPos) { + ++tokCurLine; + tokLineStart = match.index + match[0].length; + } + } + if (options.onComment) + options.onComment(true, input.slice(start + 2, end), start, tokPos, + startLoc, options.locations && new line_loc_t); + } + + function skipLineComment() { + var start = tokPos; + var startLoc = options.onComment && options.locations && new line_loc_t; + var ch = input.charCodeAt(tokPos+=2); + while (tokPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) { + ++tokPos; + ch = input.charCodeAt(tokPos); + } + if (options.onComment) + options.onComment(false, input.slice(start + 2, tokPos), start, tokPos, + startLoc, options.locations && new line_loc_t); + } + + function skipSpace() { + while (tokPos < inputLen) { + var ch = input.charCodeAt(tokPos); + if (ch === 32) { + ++tokPos; + } else if (ch === 13) { + ++tokPos; + var next = input.charCodeAt(tokPos); + if (next === 10) { + ++tokPos; + } + if (options.locations) { + ++tokCurLine; + tokLineStart = tokPos; + } + } else if (ch === 10 || ch === 8232 || ch === 8233) { + ++tokPos; + if (options.locations) { + ++tokCurLine; + tokLineStart = tokPos; + } + } else if (ch > 8 && ch < 14) { + ++tokPos; + } else if (ch === 47) { + var next = input.charCodeAt(tokPos + 1); + if (next === 42) { + skipBlockComment(); + } else if (next === 47) { + skipLineComment(); + } else break; + } else if (ch === 160) { + ++tokPos; + } else if (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++tokPos; + } else { + break; + } + } + } + + function readToken_dot() { + var next = input.charCodeAt(tokPos + 1); + if (next >= 48 && next <= 57) return readNumber(true); + ++tokPos; + return finishToken(_dot); + } + + function readToken_slash() { + var next = input.charCodeAt(tokPos + 1); + if (tokRegexpAllowed) {++tokPos; return readRegexp();} + if (next === 61) return finishOp(_assign, 2); + return finishOp(_slash, 1); + } + + function readToken_mult_modulo() { + var next = input.charCodeAt(tokPos + 1); + if (next === 61) return finishOp(_assign, 2); + return finishOp(_multiplyModulo, 1); + } + + function readToken_pipe_amp(code) { + var next = input.charCodeAt(tokPos + 1); + if (next === code) return finishOp(code === 124 ? _logicalOR : _logicalAND, 2); + if (next === 61) return finishOp(_assign, 2); + return finishOp(code === 124 ? _bitwiseOR : _bitwiseAND, 1); + } + + function readToken_caret() { + var next = input.charCodeAt(tokPos + 1); + if (next === 61) return finishOp(_assign, 2); + return finishOp(_bitwiseXOR, 1); + } + + function readToken_plus_min(code) { + var next = input.charCodeAt(tokPos + 1); + if (next === code) { + if (next == 45 && input.charCodeAt(tokPos + 2) == 62 && + newline.test(input.slice(lastEnd, tokPos))) { + tokPos += 3; + skipLineComment(); + skipSpace(); + return readToken(); + } + return finishOp(_incDec, 2); + } + if (next === 61) return finishOp(_assign, 2); + return finishOp(_plusMin, 1); + } + + function readToken_lt_gt(code) { + var next = input.charCodeAt(tokPos + 1); + var size = 1; + if (next === code) { + size = code === 62 && input.charCodeAt(tokPos + 2) === 62 ? 3 : 2; + if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1); + return finishOp(_bitShift, size); + } + if (next == 33 && code == 60 && input.charCodeAt(tokPos + 2) == 45 && + input.charCodeAt(tokPos + 3) == 45) { + tokPos += 4; + skipLineComment(); + skipSpace(); + return readToken(); + } + if (next === 61) + size = input.charCodeAt(tokPos + 2) === 61 ? 3 : 2; + return finishOp(_relational, size); + } + + function readToken_eq_excl(code) { + var next = input.charCodeAt(tokPos + 1); + if (next === 61) return finishOp(_equality, input.charCodeAt(tokPos + 2) === 61 ? 3 : 2); + return finishOp(code === 61 ? _eq : _prefix, 1); + } + + function getTokenFromCode(code) { + switch(code) { + case 46: + return readToken_dot(); + + case 40: ++tokPos; return finishToken(_parenL); + case 41: ++tokPos; return finishToken(_parenR); + case 59: ++tokPos; return finishToken(_semi); + case 44: ++tokPos; return finishToken(_comma); + case 91: ++tokPos; return finishToken(_bracketL); + case 93: ++tokPos; return finishToken(_bracketR); + case 123: ++tokPos; return finishToken(_braceL); + case 125: ++tokPos; return finishToken(_braceR); + case 58: ++tokPos; return finishToken(_colon); + case 63: ++tokPos; return finishToken(_question); + + case 48: + var next = input.charCodeAt(tokPos + 1); + if (next === 120 || next === 88) return readHexNumber(); + case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: + return readNumber(false); + + case 34: case 39: + return readString(code); + + case 47: + return readToken_slash(code); + + case 37: case 42: + return readToken_mult_modulo(); + + case 124: case 38: + return readToken_pipe_amp(code); + + case 94: + return readToken_caret(); + + case 43: case 45: + return readToken_plus_min(code); + + case 60: case 62: + return readToken_lt_gt(code); + + case 61: case 33: + return readToken_eq_excl(code); + + case 126: + return finishOp(_prefix, 1); + } + + return false; + } + + function readToken(forceRegexp) { + if (!forceRegexp) tokStart = tokPos; + else tokPos = tokStart + 1; + if (options.locations) tokStartLoc = new line_loc_t; + if (forceRegexp) return readRegexp(); + if (tokPos >= inputLen) return finishToken(_eof); + + var code = input.charCodeAt(tokPos); + if (isIdentifierStart(code) || code === 92 ) return readWord(); + + var tok = getTokenFromCode(code); + + if (tok === false) { + var ch = String.fromCharCode(code); + if (ch === "\\" || nonASCIIidentifierStart.test(ch)) return readWord(); + raise(tokPos, "Unexpected character '" + ch + "'"); + } + return tok; + } + + function finishOp(type, size) { + var str = input.slice(tokPos, tokPos + size); + tokPos += size; + finishToken(type, str); + } + + function readRegexp() { + var content = "", escaped, inClass, start = tokPos; + for (;;) { + if (tokPos >= inputLen) raise(start, "Unterminated regular expression"); + var ch = input.charAt(tokPos); + if (newline.test(ch)) raise(start, "Unterminated regular expression"); + if (!escaped) { + if (ch === "[") inClass = true; + else if (ch === "]" && inClass) inClass = false; + else if (ch === "/" && !inClass) break; + escaped = ch === "\\"; + } else escaped = false; + ++tokPos; + } + var content = input.slice(start, tokPos); + ++tokPos; + var mods = readWord1(); + if (mods && !/^[gmsiy]*$/.test(mods)) raise(start, "Invalid regexp flag"); + try { + var value = new RegExp(content, mods); + } catch (e) { + if (e instanceof SyntaxError) raise(start, e.message); + raise(e); + } + return finishToken(_regexp, value); + } + + function readInt(radix, len) { + var start = tokPos, total = 0; + for (var i = 0, e = len == null ? Infinity : len; i < e; ++i) { + var code = input.charCodeAt(tokPos), val; + if (code >= 97) val = code - 97 + 10; + else if (code >= 65) val = code - 65 + 10; + else if (code >= 48 && code <= 57) val = code - 48; + else val = Infinity; + if (val >= radix) break; + ++tokPos; + total = total * radix + val; + } + if (tokPos === start || len != null && tokPos - start !== len) return null; + + return total; + } + + function readHexNumber() { + tokPos += 2; + var val = readInt(16); + if (val == null) raise(tokStart + 2, "Expected hexadecimal number"); + if (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, "Identifier directly after number"); + return finishToken(_num, val); + } + + function readNumber(startsWithDot) { + var start = tokPos, isFloat = false, octal = input.charCodeAt(tokPos) === 48; + if (!startsWithDot && readInt(10) === null) raise(start, "Invalid number"); + if (input.charCodeAt(tokPos) === 46) { + ++tokPos; + readInt(10); + isFloat = true; + } + var next = input.charCodeAt(tokPos); + if (next === 69 || next === 101) { + next = input.charCodeAt(++tokPos); + if (next === 43 || next === 45) ++tokPos; + if (readInt(10) === null) raise(start, "Invalid number"); + isFloat = true; + } + if (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, "Identifier directly after number"); + + var str = input.slice(start, tokPos), val; + if (isFloat) val = parseFloat(str); + else if (!octal || str.length === 1) val = parseInt(str, 10); + else if (/[89]/.test(str) || strict) raise(start, "Invalid number"); + else val = parseInt(str, 8); + return finishToken(_num, val); + } + + function readString(quote) { + tokPos++; + var out = ""; + for (;;) { + if (tokPos >= inputLen) raise(tokStart, "Unterminated string constant"); + var ch = input.charCodeAt(tokPos); + if (ch === quote) { + ++tokPos; + return finishToken(_string, out); + } + if (ch === 92) { + ch = input.charCodeAt(++tokPos); + var octal = /^[0-7]+/.exec(input.slice(tokPos, tokPos + 3)); + if (octal) octal = octal[0]; + while (octal && parseInt(octal, 8) > 255) octal = octal.slice(0, -1); + if (octal === "0") octal = null; + ++tokPos; + if (octal) { + if (strict) raise(tokPos - 2, "Octal literal in strict mode"); + out += String.fromCharCode(parseInt(octal, 8)); + tokPos += octal.length - 1; + } else { + switch (ch) { + case 110: out += "\n"; break; + case 114: out += "\r"; break; + case 120: out += String.fromCharCode(readHexChar(2)); break; + case 117: out += String.fromCharCode(readHexChar(4)); break; + case 85: out += String.fromCharCode(readHexChar(8)); break; + case 116: out += "\t"; break; + case 98: out += "\b"; break; + case 118: out += "\u000b"; break; + case 102: out += "\f"; break; + case 48: out += "\0"; break; + case 13: if (input.charCodeAt(tokPos) === 10) ++tokPos; + case 10: + if (options.locations) { tokLineStart = tokPos; ++tokCurLine; } + break; + default: out += String.fromCharCode(ch); break; + } + } + } else { + if (ch === 13 || ch === 10 || ch === 8232 || ch === 8233) raise(tokStart, "Unterminated string constant"); + out += String.fromCharCode(ch); + ++tokPos; + } + } + } + + function readHexChar(len) { + var n = readInt(16, len); + if (n === null) raise(tokStart, "Bad character escape sequence"); + return n; + } + + var containsEsc; + + function readWord1() { + containsEsc = false; + var word, first = true, start = tokPos; + for (;;) { + var ch = input.charCodeAt(tokPos); + if (isIdentifierChar(ch)) { + if (containsEsc) word += input.charAt(tokPos); + ++tokPos; + } else if (ch === 92) { + if (!containsEsc) word = input.slice(start, tokPos); + containsEsc = true; + if (input.charCodeAt(++tokPos) != 117) + raise(tokPos, "Expecting Unicode escape sequence \\uXXXX"); + ++tokPos; + var esc = readHexChar(4); + var escStr = String.fromCharCode(esc); + if (!escStr) raise(tokPos - 1, "Invalid Unicode escape"); + if (!(first ? isIdentifierStart(esc) : isIdentifierChar(esc))) + raise(tokPos - 4, "Invalid Unicode escape"); + word += escStr; + } else { + break; + } + first = false; + } + return containsEsc ? word : input.slice(start, tokPos); + } + + function readWord() { + var word = readWord1(); + var type = _name; + if (!containsEsc && isKeyword(word)) + type = keywordTypes[word]; + return finishToken(type, word); + } + + function next() { + lastStart = tokStart; + lastEnd = tokEnd; + lastEndLoc = tokEndLoc; + readToken(); + } + + function setStrict(strct) { + strict = strct; + tokPos = tokStart; + if (options.locations) { + while (tokPos < tokLineStart) { + tokLineStart = input.lastIndexOf("\n", tokLineStart - 2) + 1; + --tokCurLine; + } + } + skipSpace(); + readToken(); + } + + function node_t() { + this.type = null; + this.start = tokStart; + this.end = null; + } + + function node_loc_t() { + this.start = tokStartLoc; + this.end = null; + if (sourceFile !== null) this.source = sourceFile; + } + + function startNode() { + var node = new node_t(); + if (options.locations) + node.loc = new node_loc_t(); + if (options.directSourceFile) + node.sourceFile = options.directSourceFile; + if (options.ranges) + node.range = [tokStart, 0]; + return node; + } + + function startNodeFrom(other) { + var node = new node_t(); + node.start = other.start; + if (options.locations) { + node.loc = new node_loc_t(); + node.loc.start = other.loc.start; + } + if (options.ranges) + node.range = [other.range[0], 0]; + + return node; + } + + function finishNode(node, type) { + node.type = type; + node.end = lastEnd; + if (options.locations) + node.loc.end = lastEndLoc; + if (options.ranges) + node.range[1] = lastEnd; + return node; + } + + function isUseStrict(stmt) { + return options.ecmaVersion >= 5 && stmt.type === "ExpressionStatement" && + stmt.expression.type === "Literal" && stmt.expression.value === "use strict"; + } + + function eat(type) { + if (tokType === type) { + next(); + return true; + } + } + + function canInsertSemicolon() { + return !options.strictSemicolons && + (tokType === _eof || tokType === _braceR || newline.test(input.slice(lastEnd, tokStart))); + } + + function semicolon() { + if (!eat(_semi) && !canInsertSemicolon()) unexpected(); + } + + function expect(type) { + if (tokType === type) next(); + else unexpected(); + } + + function unexpected() { + raise(tokStart, "Unexpected token"); + } + + function checkLVal(expr) { + if (expr.type !== "Identifier" && expr.type !== "MemberExpression") + raise(expr.start, "Assigning to rvalue"); + if (strict && expr.type === "Identifier" && isStrictBadIdWord(expr.name)) + raise(expr.start, "Assigning to " + expr.name + " in strict mode"); + } + + function parseTopLevel(program) { + lastStart = lastEnd = tokPos; + if (options.locations) lastEndLoc = new line_loc_t; + inFunction = strict = null; + labels = []; + readToken(); + + var node = program || startNode(), first = true; + if (!program) node.body = []; + while (tokType !== _eof) { + var stmt = parseStatement(); + node.body.push(stmt); + if (first && isUseStrict(stmt)) setStrict(true); + first = false; + } + return finishNode(node, "Program"); + } + + var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"}; + + function parseStatement() { + if (tokType === _slash || tokType === _assign && tokVal == "/=") + readToken(true); + + var starttype = tokType, node = startNode(); + + switch (starttype) { + case _break: case _continue: + next(); + var isBreak = starttype === _break; + if (eat(_semi) || canInsertSemicolon()) node.label = null; + else if (tokType !== _name) unexpected(); + else { + node.label = parseIdent(); + semicolon(); + } + + for (var i = 0; i < labels.length; ++i) { + var lab = labels[i]; + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) break; + if (node.label && isBreak) break; + } + } + if (i === labels.length) raise(node.start, "Unsyntactic " + starttype.keyword); + return finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement"); + + case _debugger: + next(); + semicolon(); + return finishNode(node, "DebuggerStatement"); + + case _do: + next(); + labels.push(loopLabel); + node.body = parseStatement(); + labels.pop(); + expect(_while); + node.test = parseParenExpression(); + semicolon(); + return finishNode(node, "DoWhileStatement"); + + case _for: + next(); + labels.push(loopLabel); + expect(_parenL); + if (tokType === _semi) return parseFor(node, null); + if (tokType === _var) { + var init = startNode(); + next(); + parseVar(init, true); + finishNode(init, "VariableDeclaration"); + if (init.declarations.length === 1 && eat(_in)) + return parseForIn(node, init); + return parseFor(node, init); + } + var init = parseExpression(false, true); + if (eat(_in)) {checkLVal(init); return parseForIn(node, init);} + return parseFor(node, init); + + case _function: + next(); + return parseFunction(node, true); + + case _if: + next(); + node.test = parseParenExpression(); + node.consequent = parseStatement(); + node.alternate = eat(_else) ? parseStatement() : null; + return finishNode(node, "IfStatement"); + + case _return: + if (!inFunction && !options.allowReturnOutsideFunction) + raise(tokStart, "'return' outside of function"); + next(); + + if (eat(_semi) || canInsertSemicolon()) node.argument = null; + else { node.argument = parseExpression(); semicolon(); } + return finishNode(node, "ReturnStatement"); + + case _switch: + next(); + node.discriminant = parseParenExpression(); + node.cases = []; + expect(_braceL); + labels.push(switchLabel); + + for (var cur, sawDefault; tokType != _braceR;) { + if (tokType === _case || tokType === _default) { + var isCase = tokType === _case; + if (cur) finishNode(cur, "SwitchCase"); + node.cases.push(cur = startNode()); + cur.consequent = []; + next(); + if (isCase) cur.test = parseExpression(); + else { + if (sawDefault) raise(lastStart, "Multiple default clauses"); sawDefault = true; + cur.test = null; + } + expect(_colon); + } else { + if (!cur) unexpected(); + cur.consequent.push(parseStatement()); + } + } + if (cur) finishNode(cur, "SwitchCase"); + next(); + labels.pop(); + return finishNode(node, "SwitchStatement"); + + case _throw: + next(); + if (newline.test(input.slice(lastEnd, tokStart))) + raise(lastEnd, "Illegal newline after throw"); + node.argument = parseExpression(); + semicolon(); + return finishNode(node, "ThrowStatement"); + + case _try: + next(); + node.block = parseBlock(); + node.handler = null; + if (tokType === _catch) { + var clause = startNode(); + next(); + expect(_parenL); + clause.param = parseIdent(); + if (strict && isStrictBadIdWord(clause.param.name)) + raise(clause.param.start, "Binding " + clause.param.name + " in strict mode"); + expect(_parenR); + clause.guard = null; + clause.body = parseBlock(); + node.handler = finishNode(clause, "CatchClause"); + } + node.guardedHandlers = empty; + node.finalizer = eat(_finally) ? parseBlock() : null; + if (!node.handler && !node.finalizer) + raise(node.start, "Missing catch or finally clause"); + return finishNode(node, "TryStatement"); + + case _var: + next(); + parseVar(node); + semicolon(); + return finishNode(node, "VariableDeclaration"); + + case _while: + next(); + node.test = parseParenExpression(); + labels.push(loopLabel); + node.body = parseStatement(); + labels.pop(); + return finishNode(node, "WhileStatement"); + + case _with: + if (strict) raise(tokStart, "'with' in strict mode"); + next(); + node.object = parseParenExpression(); + node.body = parseStatement(); + return finishNode(node, "WithStatement"); + + case _braceL: + return parseBlock(); + + case _semi: + next(); + return finishNode(node, "EmptyStatement"); + + default: + var maybeName = tokVal, expr = parseExpression(); + if (starttype === _name && expr.type === "Identifier" && eat(_colon)) { + for (var i = 0; i < labels.length; ++i) + if (labels[i].name === maybeName) raise(expr.start, "Label '" + maybeName + "' is already declared"); + var kind = tokType.isLoop ? "loop" : tokType === _switch ? "switch" : null; + labels.push({name: maybeName, kind: kind}); + node.body = parseStatement(); + labels.pop(); + node.label = expr; + return finishNode(node, "LabeledStatement"); + } else { + node.expression = expr; + semicolon(); + return finishNode(node, "ExpressionStatement"); + } + } + } + + function parseParenExpression() { + expect(_parenL); + var val = parseExpression(); + expect(_parenR); + return val; + } + + function parseBlock(allowStrict) { + var node = startNode(), first = true, strict = false, oldStrict; + node.body = []; + expect(_braceL); + while (!eat(_braceR)) { + var stmt = parseStatement(); + node.body.push(stmt); + if (first && allowStrict && isUseStrict(stmt)) { + oldStrict = strict; + setStrict(strict = true); + } + first = false; + } + if (strict && !oldStrict) setStrict(false); + return finishNode(node, "BlockStatement"); + } + + function parseFor(node, init) { + node.init = init; + expect(_semi); + node.test = tokType === _semi ? null : parseExpression(); + expect(_semi); + node.update = tokType === _parenR ? null : parseExpression(); + expect(_parenR); + node.body = parseStatement(); + labels.pop(); + return finishNode(node, "ForStatement"); + } + + function parseForIn(node, init) { + node.left = init; + node.right = parseExpression(); + expect(_parenR); + node.body = parseStatement(); + labels.pop(); + return finishNode(node, "ForInStatement"); + } + + function parseVar(node, noIn) { + node.declarations = []; + node.kind = "var"; + for (;;) { + var decl = startNode(); + decl.id = parseIdent(); + if (strict && isStrictBadIdWord(decl.id.name)) + raise(decl.id.start, "Binding " + decl.id.name + " in strict mode"); + decl.init = eat(_eq) ? parseExpression(true, noIn) : null; + node.declarations.push(finishNode(decl, "VariableDeclarator")); + if (!eat(_comma)) break; + } + return node; + } + + function parseExpression(noComma, noIn) { + var expr = parseMaybeAssign(noIn); + if (!noComma && tokType === _comma) { + var node = startNodeFrom(expr); + node.expressions = [expr]; + while (eat(_comma)) node.expressions.push(parseMaybeAssign(noIn)); + return finishNode(node, "SequenceExpression"); + } + return expr; + } + + function parseMaybeAssign(noIn) { + var left = parseMaybeConditional(noIn); + if (tokType.isAssign) { + var node = startNodeFrom(left); + node.operator = tokVal; + node.left = left; + next(); + node.right = parseMaybeAssign(noIn); + checkLVal(left); + return finishNode(node, "AssignmentExpression"); + } + return left; + } + + function parseMaybeConditional(noIn) { + var expr = parseExprOps(noIn); + if (eat(_question)) { + var node = startNodeFrom(expr); + node.test = expr; + node.consequent = parseExpression(true); + expect(_colon); + node.alternate = parseExpression(true, noIn); + return finishNode(node, "ConditionalExpression"); + } + return expr; + } + + function parseExprOps(noIn) { + return parseExprOp(parseMaybeUnary(), -1, noIn); + } + + function parseExprOp(left, minPrec, noIn) { + var prec = tokType.binop; + if (prec != null && (!noIn || tokType !== _in)) { + if (prec > minPrec) { + var node = startNodeFrom(left); + node.left = left; + node.operator = tokVal; + var op = tokType; + next(); + node.right = parseExprOp(parseMaybeUnary(), prec, noIn); + var exprNode = finishNode(node, (op === _logicalOR || op === _logicalAND) ? "LogicalExpression" : "BinaryExpression"); + return parseExprOp(exprNode, minPrec, noIn); + } + } + return left; + } + + function parseMaybeUnary() { + if (tokType.prefix) { + var node = startNode(), update = tokType.isUpdate; + node.operator = tokVal; + node.prefix = true; + tokRegexpAllowed = true; + next(); + node.argument = parseMaybeUnary(); + if (update) checkLVal(node.argument); + else if (strict && node.operator === "delete" && + node.argument.type === "Identifier") + raise(node.start, "Deleting local variable in strict mode"); + return finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } + var expr = parseExprSubscripts(); + while (tokType.postfix && !canInsertSemicolon()) { + var node = startNodeFrom(expr); + node.operator = tokVal; + node.prefix = false; + node.argument = expr; + checkLVal(expr); + next(); + expr = finishNode(node, "UpdateExpression"); + } + return expr; + } + + function parseExprSubscripts() { + return parseSubscripts(parseExprAtom()); + } + + function parseSubscripts(base, noCalls) { + if (eat(_dot)) { + var node = startNodeFrom(base); + node.object = base; + node.property = parseIdent(true); + node.computed = false; + return parseSubscripts(finishNode(node, "MemberExpression"), noCalls); + } else if (eat(_bracketL)) { + var node = startNodeFrom(base); + node.object = base; + node.property = parseExpression(); + node.computed = true; + expect(_bracketR); + return parseSubscripts(finishNode(node, "MemberExpression"), noCalls); + } else if (!noCalls && eat(_parenL)) { + var node = startNodeFrom(base); + node.callee = base; + node.arguments = parseExprList(_parenR, false); + return parseSubscripts(finishNode(node, "CallExpression"), noCalls); + } else return base; + } + + function parseExprAtom() { + switch (tokType) { + case _this: + var node = startNode(); + next(); + return finishNode(node, "ThisExpression"); + case _name: + return parseIdent(); + case _num: case _string: case _regexp: + var node = startNode(); + node.value = tokVal; + node.raw = input.slice(tokStart, tokEnd); + next(); + return finishNode(node, "Literal"); + + case _null: case _true: case _false: + var node = startNode(); + node.value = tokType.atomValue; + node.raw = tokType.keyword; + next(); + return finishNode(node, "Literal"); + + case _parenL: + var tokStartLoc1 = tokStartLoc, tokStart1 = tokStart; + next(); + var val = parseExpression(); + val.start = tokStart1; + val.end = tokEnd; + if (options.locations) { + val.loc.start = tokStartLoc1; + val.loc.end = tokEndLoc; + } + if (options.ranges) + val.range = [tokStart1, tokEnd]; + expect(_parenR); + return val; + + case _bracketL: + var node = startNode(); + next(); + node.elements = parseExprList(_bracketR, true, true); + return finishNode(node, "ArrayExpression"); + + case _braceL: + return parseObj(); + + case _function: + var node = startNode(); + next(); + return parseFunction(node, false); + + case _new: + return parseNew(); + + default: + unexpected(); + } + } + + function parseNew() { + var node = startNode(); + next(); + node.callee = parseSubscripts(parseExprAtom(), true); + if (eat(_parenL)) node.arguments = parseExprList(_parenR, false); + else node.arguments = empty; + return finishNode(node, "NewExpression"); + } + + function parseObj() { + var node = startNode(), first = true, sawGetSet = false; + node.properties = []; + next(); + while (!eat(_braceR)) { + if (!first) { + expect(_comma); + if (options.allowTrailingCommas && eat(_braceR)) break; + } else first = false; + + var prop = {key: parsePropertyName()}, isGetSet = false, kind; + if (eat(_colon)) { + prop.value = parseExpression(true); + kind = prop.kind = "init"; + } else if (options.ecmaVersion >= 5 && prop.key.type === "Identifier" && + (prop.key.name === "get" || prop.key.name === "set")) { + isGetSet = sawGetSet = true; + kind = prop.kind = prop.key.name; + prop.key = parsePropertyName(); + if (tokType !== _parenL) unexpected(); + prop.value = parseFunction(startNode(), false); + } else unexpected(); + + if (prop.key.type === "Identifier" && (strict || sawGetSet)) { + for (var i = 0; i < node.properties.length; ++i) { + var other = node.properties[i]; + if (other.key.name === prop.key.name) { + var conflict = kind == other.kind || isGetSet && other.kind === "init" || + kind === "init" && (other.kind === "get" || other.kind === "set"); + if (conflict && !strict && kind === "init" && other.kind === "init") conflict = false; + if (conflict) raise(prop.key.start, "Redefinition of property"); + } + } + } + node.properties.push(prop); + } + return finishNode(node, "ObjectExpression"); + } + + function parsePropertyName() { + if (tokType === _num || tokType === _string) return parseExprAtom(); + return parseIdent(true); + } + + function parseFunction(node, isStatement) { + if (tokType === _name) node.id = parseIdent(); + else if (isStatement) unexpected(); + else node.id = null; + node.params = []; + var first = true; + expect(_parenL); + while (!eat(_parenR)) { + if (!first) expect(_comma); else first = false; + node.params.push(parseIdent()); + } + + var oldInFunc = inFunction, oldLabels = labels; + inFunction = true; labels = []; + node.body = parseBlock(true); + inFunction = oldInFunc; labels = oldLabels; + + if (strict || node.body.body.length && isUseStrict(node.body.body[0])) { + for (var i = node.id ? -1 : 0; i < node.params.length; ++i) { + var id = i < 0 ? node.id : node.params[i]; + if (isStrictReservedWord(id.name) || isStrictBadIdWord(id.name)) + raise(id.start, "Defining '" + id.name + "' in strict mode"); + if (i >= 0) for (var j = 0; j < i; ++j) if (id.name === node.params[j].name) + raise(id.start, "Argument name clash in strict mode"); + } + } + + return finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression"); + } + + function parseExprList(close, allowTrailingComma, allowEmpty) { + var elts = [], first = true; + while (!eat(close)) { + if (!first) { + expect(_comma); + if (allowTrailingComma && options.allowTrailingCommas && eat(close)) break; + } else first = false; + + if (allowEmpty && tokType === _comma) elts.push(null); + else elts.push(parseExpression(true)); + } + return elts; + } + + function parseIdent(liberal) { + var node = startNode(); + if (liberal && options.forbidReserved == "everywhere") liberal = false; + if (tokType === _name) { + if (!liberal && + (options.forbidReserved && + (options.ecmaVersion === 3 ? isReservedWord3 : isReservedWord5)(tokVal) || + strict && isStrictReservedWord(tokVal)) && + input.slice(tokStart, tokEnd).indexOf("\\") == -1) + raise(tokStart, "The keyword '" + tokVal + "' is reserved"); + node.name = tokVal; + } else if (liberal && tokType.keyword) { + node.name = tokType.keyword; + } else { + unexpected(); + } + tokRegexpAllowed = false; + next(); + return finishNode(node, "Identifier"); + } + +}); + + if (!acorn.version) + acorn = null; + } + + function parse(code, options) { + return (global.acorn || acorn).parse(code, options); + } + + var binaryOperators = { + '+': '__add', + '-': '__subtract', + '*': '__multiply', + '/': '__divide', + '%': '__modulo', + '==': '__equals', + '!=': '__equals' + }; + + var unaryOperators = { + '-': '__negate', + '+': '__self' + }; + + var fields = Base.each( + ['add', 'subtract', 'multiply', 'divide', 'modulo', 'equals', 'negate'], + function(name) { + this['__' + name] = '#' + name; + }, + { + __self: function() { + return this; + } + } + ); + Point.inject(fields); + Size.inject(fields); + Color.inject(fields); + + function __$__(left, operator, right) { + var handler = binaryOperators[operator]; + if (left && left[handler]) { + var res = left[handler](right); + return operator === '!=' ? !res : res; + } + switch (operator) { + case '+': return left + right; + case '-': return left - right; + case '*': return left * right; + case '/': return left / right; + case '%': return left % right; + case '==': return left == right; + case '!=': return left != right; + } + } + + function $__(operator, value) { + var handler = unaryOperators[operator]; + if (value && value[handler]) + return value[handler](); + switch (operator) { + case '+': return +value; + case '-': return -value; + } + } + + function compile(code, options) { + if (!code) + return ''; + options = options || {}; + + var insertions = []; + + function getOffset(offset) { + for (var i = 0, l = insertions.length; i < l; i++) { + var insertion = insertions[i]; + if (insertion[0] >= offset) + break; + offset += insertion[1]; + } + return offset; + } + + function getCode(node) { + return code.substring(getOffset(node.range[0]), + getOffset(node.range[1])); + } + + function getBetween(left, right) { + return code.substring(getOffset(left.range[1]), + getOffset(right.range[0])); + } + + function replaceCode(node, str) { + var start = getOffset(node.range[0]), + end = getOffset(node.range[1]), + insert = 0; + for (var i = insertions.length - 1; i >= 0; i--) { + if (start > insertions[i][0]) { + insert = i + 1; + break; + } + } + insertions.splice(insert, 0, [start, str.length - end + start]); + code = code.substring(0, start) + str + code.substring(end); + } + + function walkAST(node, parent) { + if (!node) + return; + for (var key in node) { + if (key === 'range' || key === 'loc') + continue; + var value = node[key]; + if (Array.isArray(value)) { + for (var i = 0, l = value.length; i < l; i++) + walkAST(value[i], node); + } else if (value && typeof value === 'object') { + walkAST(value, node); + } + } + switch (node.type) { + case 'UnaryExpression': + if (node.operator in unaryOperators + && node.argument.type !== 'Literal') { + var arg = getCode(node.argument); + replaceCode(node, '$__("' + node.operator + '", ' + + arg + ')'); + } + break; + case 'BinaryExpression': + if (node.operator in binaryOperators + && node.left.type !== 'Literal') { + var left = getCode(node.left), + right = getCode(node.right), + between = getBetween(node.left, node.right), + operator = node.operator; + replaceCode(node, '__$__(' + left + ',' + + between.replace(new RegExp('\\' + operator), + '"' + operator + '"') + + ', ' + right + ')'); + } + break; + case 'UpdateExpression': + case 'AssignmentExpression': + var parentType = parent && parent.type; + if (!( + parentType === 'ForStatement' + || parentType === 'BinaryExpression' + && /^[=!<>]/.test(parent.operator) + || parentType === 'MemberExpression' && parent.computed + )) { + if (node.type === 'UpdateExpression') { + var arg = getCode(node.argument), + exp = '__$__(' + arg + ', "' + node.operator[0] + + '", 1)', + str = arg + ' = ' + exp; + if (!node.prefix + && (parentType === 'AssignmentExpression' + || parentType === 'VariableDeclarator')) { + if (getCode(parent.left || parent.id) === arg) + str = exp; + str = arg + '; ' + str; + } + replaceCode(node, str); + } else { + if (/^.=$/.test(node.operator) + && node.left.type !== 'Literal') { + var left = getCode(node.left), + right = getCode(node.right), + exp = left + ' = __$__(' + left + ', "' + + node.operator[0] + '", ' + right + ')'; + replaceCode(node, /^\(.*\)$/.test(getCode(node)) + ? '(' + exp + ')' : exp); + } + } + } + break; + } + } + + function encodeVLQ(value) { + var res = '', + base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + value = (Math.abs(value) << 1) + (value < 0 ? 1 : 0); + while (value || !res) { + var next = value & (32 - 1); + value >>= 5; + if (value) + next |= 32; + res += base64[next]; + } + return res; + } + + var url = options.url || '', + agent = paper.agent, + version = agent.versionNumber, + offsetCode = false, + sourceMaps = options.sourceMaps, + source = options.source || code, + lineBreaks = /\r\n|\n|\r/mg, + offset = options.offset || 0, + map; + if (sourceMaps && (agent.chrome && version >= 30 + || agent.webkit && version >= 537.76 + || agent.firefox && version >= 23 + || agent.node)) { + if (agent.node) { + offset -= 2; + } else if (window && url && !window.location.href.indexOf(url)) { + var html = document.getElementsByTagName('html')[0].innerHTML; + offset = html.substr(0, html.indexOf(code) + 1).match( + lineBreaks).length + 1; + } + offsetCode = offset > 0 && !( + agent.chrome && version >= 36 || + agent.safari && version >= 600 || + agent.firefox && version >= 40 || + agent.node); + var mappings = ['AA' + encodeVLQ(offsetCode ? 0 : offset) + 'A']; + mappings.length = (code.match(lineBreaks) || []).length + 1 + + (offsetCode ? offset : 0); + map = { + version: 3, + file: url, + names:[], + mappings: mappings.join(';AACA'), + sourceRoot: '', + sources: [url], + sourcesContent: [source] + }; + } + walkAST(parse(code, { ranges: true, preserveParens: true })); + if (map) { + if (offsetCode) { + code = new Array(offset + 1).join('\n') + code; + } + if (/^(inline|both)$/.test(sourceMaps)) { + code += "\n//# sourceMappingURL=data:application/json;base64," + + self.btoa(unescape(encodeURIComponent( + JSON.stringify(map)))); + } + code += "\n//# sourceURL=" + (url || 'paperscript'); + } + return { + url: url, + source: source, + code: code, + map: map + }; + } + + function execute(code, scope, options) { + paper = scope; + var view = scope.getView(), + tool = /\btool\.\w+|\s+on(?:Key|Mouse)(?:Up|Down|Move|Drag)\b/ + .test(code) && !/\bnew\s+Tool\b/.test(code) + ? new Tool() : null, + toolHandlers = tool ? tool._events : [], + handlers = ['onFrame', 'onResize'].concat(toolHandlers), + params = [], + args = [], + func, + compiled = typeof code === 'object' ? code : compile(code, options); + code = compiled.code; + function expose(scope, hidden) { + for (var key in scope) { + if ((hidden || !/^_/.test(key)) && new RegExp('([\\b\\s\\W]|^)' + + key.replace(/\$/g, '\\$') + '\\b').test(code)) { + params.push(key); + args.push(scope[key]); + } + } + } + expose({ __$__: __$__, $__: $__, paper: scope, view: view, tool: tool }, + true); + expose(scope); + handlers = Base.each(handlers, function(key) { + if (new RegExp('\\s+' + key + '\\b').test(code)) { + params.push(key); + this.push(key + ': ' + key); + } + }, []).join(', '); + if (handlers) + code += '\nreturn { ' + handlers + ' };'; + var agent = paper.agent; + if (document && (agent.chrome + || agent.firefox && agent.versionNumber < 40)) { + var script = document.createElement('script'), + head = document.head || document.getElementsByTagName('head')[0]; + if (agent.firefox) + code = '\n' + code; + script.appendChild(document.createTextNode( + 'paper._execute = function(' + params + ') {' + code + '\n}' + )); + head.appendChild(script); + func = paper._execute; + delete paper._execute; + head.removeChild(script); + } else { + func = Function(params, code); + } + var res = func.apply(scope, args) || {}; + Base.each(toolHandlers, function(key) { + var value = res[key]; + if (value) + tool[key] = value; + }); + if (view) { + if (res.onResize) + view.setOnResize(res.onResize); + view.emit('resize', { + size: view.size, + delta: new Point() + }); + if (res.onFrame) + view.setOnFrame(res.onFrame); + view.requestUpdate(); + } + return compiled; + } + + function loadScript(script) { + if (/^text\/(?:x-|)paperscript$/.test(script.type) + && PaperScope.getAttribute(script, 'ignore') !== 'true') { + var canvasId = PaperScope.getAttribute(script, 'canvas'), + canvas = document.getElementById(canvasId), + src = script.src || script.getAttribute('data-src'), + async = PaperScope.hasAttribute(script, 'async'), + scopeAttribute = 'data-paper-scope'; + if (!canvas) + throw new Error('Unable to find canvas with id "' + + canvasId + '"'); + var scope = PaperScope.get(canvas.getAttribute(scopeAttribute)) + || new PaperScope().setup(canvas); + canvas.setAttribute(scopeAttribute, scope._id); + if (src) { + Http.request({ + url: src, + async: async, + mimeType: 'text/plain', + onLoad: function(code) { + execute(code, scope, src); + } + }); + } else { + execute(script.innerHTML, scope, script.baseURI); + } + script.setAttribute('data-paper-ignore', 'true'); + return scope; + } + } + + function loadAll() { + Base.each(document && document.getElementsByTagName('script'), + loadScript); + } + + function load(script) { + return script ? loadScript(script) : loadAll(); + } + + if (window) { + if (document.readyState === 'complete') { + setTimeout(loadAll); + } else { + DomEvent.add(window, { load: loadAll }); + } + } + + return { + compile: compile, + execute: execute, + load: load, + parse: parse + }; + +}.call(this); + +paper = new (PaperScope.inject(Base.exports, { + Base: Base, + Numerical: Numerical, + Key: Key, + DomEvent: DomEvent, + DomElement: DomElement, + document: document, + window: window, + Symbol: SymbolDefinition, + PlacedSymbol: SymbolItem +}))(); + +if (paper.agent.node) { + require('./node/extend.js')(paper); +} + +if (typeof define === 'function' && define.amd) { + define('paper', paper); +} else if (typeof module === 'object' && module) { + module.exports = paper; +} + +return paper; +}.call(this, typeof self === 'object' ? self : null); diff --git a/user/themes/r2c/js/site.js b/user/themes/r2c/js/script.js similarity index 81% rename from user/themes/r2c/js/site.js rename to user/themes/r2c/js/script.js index 36d6a8f..06856bb 100644 --- a/user/themes/r2c/js/site.js +++ b/user/themes/r2c/js/script.js @@ -190,9 +190,50 @@ function drag() { }); }; +function map() { + var mymap = L.map('mapid').setView([51.505, -0.09], 13); + + L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + maxZoom: 18, + attribution: 'Map data © OpenStreetMap contributors, ' + + 'CC-BY-SA, ' + + 'Imagery © Mapbox', + id: 'mapbox.streets' + }).addTo(mymap); + + L.marker([51.5, -0.09]).addTo(mymap) + .bindPopup("Hello world!
I am a popup.").openPopup(); + + L.circle([51.508, -0.11], 500, { + color: 'red', + fillColor: '#f03', + fillOpacity: 0.5 + }).addTo(mymap).bindPopup("I am a circle."); + + L.polygon([ + [51.509, -0.08], + [51.503, -0.06], + [51.51, -0.047] + ]).addTo(mymap).bindPopup("I am a polygon."); + + + var popup = L.popup(); + + function onMapClick(e) { + popup + .setLatLng(e.latlng) + .setContent("You clicked the map at " + e.latlng.toString()) + .openOn(mymap); + } + + mymap.on('click', onMapClick); + +} + $(document).ready(function() { wrap(); - scrollbar(); + map(); + // scrollbar(); clickhand(); drag(); }); diff --git a/user/themes/r2c/js/script_d3js.js b/user/themes/r2c/js/script_d3js.js new file mode 100644 index 0000000..6f3edfc --- /dev/null +++ b/user/themes/r2c/js/script_d3js.js @@ -0,0 +1,69 @@ + var svg = d3.select("#reseaux-sociaux svg"), + width = +svg.attr("width"), + height = +svg.attr("height"); + + var color = d3.scaleOrdinal(d3.schemeCategory20); + + var simulation = d3.forceSimulation() + .force("link", d3.forceLink().id(function(d) { return d.id; })) + .force("charge", d3.forceManyBody()) + .force("center", d3.forceCenter(width / 2, height / 2)); + + d3.json("user/themes/r2c/json/miserables.json", function(error, graph) { + if (error) throw error; + + var link = svg.append("g") + .attr("class", "links") + .selectAll("line") + .data(graph.links) + .enter().append("line") + .attr("stroke-width", function(d) { return Math.sqrt(d.value); }); + + var node = svg.append("g") + .attr("class", "nodes") + .selectAll("text") + .data(graph.nodes) + .enter().append("text") + .text(function(d) { return d.id; }) + .attr("fill", function(d) { return color(d.group); }) + .call(d3.drag() + .on("start", dragstarted) + .on("drag", dragged) + .on("end", dragended)); + + simulation + .nodes(graph.nodes) + .on("tick", ticked); + + simulation.force("link") + .links(graph.links); + + function ticked() { + link + .attr("x1", function(d) { return d.source.x; }) + .attr("y1", function(d) { return d.source.y; }) + .attr("x2", function(d) { return d.target.x; }) + .attr("y2", function(d) { return d.target.y; }); + + node + .attr("x", function(d) { return d.x; }) + .attr("y", function(d) { return d.y; }); + } + }); + + function dragstarted(d) { + if (!d3.event.active) simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + } + + function dragged(d) { + d.fx = d3.event.x; + d.fy = d3.event.y; + } + + function dragended(d) { + if (!d3.event.active) simulation.alphaTarget(0); + d.fx = null; + d.fy = null; + } diff --git a/user/themes/r2c/js/script_paperjs.js b/user/themes/r2c/js/script_paperjs.js new file mode 100644 index 0000000..2071a3c --- /dev/null +++ b/user/themes/r2c/js/script_paperjs.js @@ -0,0 +1,58 @@ + +// The amount of segment points we want to create: +var amount = 3; + +// The maximum height of the wave: +var height = 300; + +// Create a new path and style it: +var path = new Path({ + // 80% black: + strokeColor: [0.8], + strokeWidth: 30, + strokeCap: 'square' +}); + +var raster = new Raster({ + source: 'user/themes/r2c/images/trame.svg', + position: view.center +}); + +path.clipMask = true; +// path.selected = true; +path.closed = true; +// path.fullySelected = true; + +// Add 5 segment points to the path spread out +// over the width of the view: +for (var i = 0; i <= amount; i++) { + var maxPoint = new Point(300, 300); + + var point = maxPoint * Point.random(view.size) + 70; + path.add(point); + + // path.add(new Point(500 / 700) * view.size); +} + +// Select the path, so we can see how it is constructed: + +function onFrame(event) { + // Loop through the segments of the path: + for (var i = 0; i <= amount; i++) { + var segment = path.segments[i]; + // A cylic value between -1 and 1 + + var sinus = Math.sin(event.time * 0.05+ i); + + // Change the y position of the segment point: + segment.point.y = sinus * height + 100; + } + // Uncomment the following line and run the script again + // to smooth the path: + path.smooth(); +} + +// var copy = path.clone(); +// copy.fullySelected = true; +// copy.position.x += 500; +// copy.smooth(); diff --git a/user/themes/r2c/json/miserables.json b/user/themes/r2c/json/miserables.json new file mode 100644 index 0000000..ef1ce0b --- /dev/null +++ b/user/themes/r2c/json/miserables.json @@ -0,0 +1,124 @@ +{ + "nodes": [ + {"id": "Oceane", "group": 1}, + {"id": "Wiebke", "group": 1}, + {"id": "Manon", "group": 1}, + {"id": "Andreea", "group": 1}, + {"id": "Laurent", "group": 1}, + {"id": "Nadia", "group": 1}, + {"id": "Pascale", "group": 1}, + {"id": "Mireille", "group": 1}, + {"id": "Martine", "group": 1}, + {"id": "Line", "group": 1}, + {"id": "Bachir", "group": 2}, + {"id": "Julien", "group": 2}, + {"id": "Marie.W", "group": 3}, + {"id": "Solen", "group": 2}, + {"id": "Olivier", "group": 2}, + {"id": "Elodie", "group": 2}, + {"id": "Loyce", "group": 3}, + {"id": "Marie.P", "group": 3}, + {"id": "Victoria", "group": 3}, + {"id": "Attieke", "group": 3}, + {"id": "Kabane", "group": 3}, + {"id": "Paris 8", "group": 3}, + {"id": "La fabrique des sociologies", "group": 3}, + {"id": "Synesthesie", "group": 3}, + {"id": "Maison jaune", "group": 4}, + {"id": "Cooperence", "group": 4}, + {"id": "Jardin Haguette", "group": 5}, + {"id": "Tricot partage", "group": 4}, + {"id": "Amap Court-circuit", "group": 0}, + {"id": "Clinamen", "group": 2}, + {"id": "Briche", "group": 3}, + {"id": "Academie Fratellini", "group": 2}, + {"id": "Point carre", "group": 2}, + {"id": "Franciade", "group": 2}, + {"id": "Dechets d'art", "group": 2}, + {"id": "Collectif Mund Gawi", "group": 2}, + {"id": "Le 6B", "group": 2}, + {"id": "Adada", "group": 2}, + {"id": "Artefact 93", "group": 2}, + {"id": "Landykadi", "group": 4}, + {"id": "Rien ne se perd", "group": 4}, + {"id": "Shakti 21", "group": 4}, + {"id": "Cop'Billon", "group": 4}, + {"id": "Street mamies", "group": 4}, + {"id": "L'oasis", "group": 4}, + {"id": "Rajganawak", "group": 4} + ], + + "links": [ + {"source": "Oceane", "target": "Dechets d'art", "value": 1}, + {"source": "Oceane", "target": "Le 6B", "value": 1}, + {"source": "Oceane", "target": "Laurent", "value": 1}, + {"source": "Oceane", "target": "Collectif Mund Gawi", "value": 1}, + {"source": "L'oasis", "target": "Collectif Mund Gawi", "value": 1}, + {"source": "Oceane", "target": "L'oasis", "value": 1}, + {"source": "Laurent", "target": "L'oasis", "value": 1}, + {"source": "Oceane", "target": "Cop'Billon", "value": 1}, + {"source": "Oceane", "target": "Street mamies", "value": 1}, + {"source": "Street mamies", "target": "Cop'Billon", "value": 1}, + {"source": "Landykadi", "target": "Dechets d'art", "value": 1}, + {"source": "Landykadi", "target": "Collectif Mund Gawi", "value": 1}, + {"source": "Laurent", "target": "Le 6B", "value": 1}, + {"source": "Laurent", "target": "Collectif Mund Gawi", "value": 1}, + {"source": "Shakti 21", "target": "Collectif Mund Gawi", "value": 1}, + {"source": "Rien ne se perd", "target": "Collectif Mund Gawi", "value": 1}, + {"source": "Artefact 93", "target": "Dechets d'art", "value":1}, + {"source": "Artefact 93", "target": "Franciade", "value": 1}, + {"source": "Artefact 93", "target": "Adada", "value": 1}, + {"source": "Artefact 93", "target": "Point carre", "value": 1}, + {"source": "Point carre", "target": "Franciade", "value": 1}, + {"source": "Franciade", "target": "Adada", "value":1}, + {"source": "Adada", "target": "Dechets d'art", "value": 1}, + {"source": "Adada", "target": "Point carre", "value": 1}, + {"source": "Franciade", "target": "Andreea", "value": 1}, + {"source": "Point carre", "target": "Wiebke", "value": 1}, + {"source": "Wiebke", "target": "Clinamen", "value": 1}, + {"source": "Wiebke", "target": "Rajganawak", "value": 1}, + {"source": "Wiebke", "target": "Briche", "value": 1}, + {"source": "Briche", "target": "Academie Fratellini", "value":1}, + {"source": "Academie Fratellini", "target": "Manon", "value": 1}, + {"source": "Manon", "target": "Solen", "value": 1}, + {"source": "Solen", "target": "Cooperence", "value": 1}, + {"source": "Cooperence", "target": "Tricot partage", "value": 1}, + {"source": "Cooperence", "target": "Nadia", "value": 1}, + {"source": "Nadia", "target": "Pascale", "value": 1}, + {"source": "Tricot partage", "target": "Pascale", "value": 1}, + {"source": "Pascale", "target": "Maison jaune", "value": 1}, + {"source": "Pascale", "target": "Mireille", "value": 1}, + {"source": "Jardin Haguette", "target": "Martine", "value": 1}, + {"source": "Martine", "target": "Paris 8", "value": 1}, + {"source": "Paris 8", "target": "Marie.W", "value": 1}, + {"source": "Paris 8", "target": "Loyce", "value": 1}, + {"source": "Paris 8", "target": "Marie.P", "value": 1}, + {"source": "Paris 8", "target": "Victoria", "value":1}, + {"source": "Victoria", "target": "Kabane", "value": 1}, + {"source": "Kabane", "target": "Paris 8", "value": 1}, + {"source": "Victoria", "target": "Attieke", "value": 1}, + {"source": "Victoria", "target": "Marie.W", "value": 1}, + {"source": "Marie.W", "target": "Amap Court-circuit", "value":1}, + {"source": "Amap Court-circuit", "target": "Olivier", "value": 1}, + {"source": "Amap Court-circuit", "target": "Elodie", "value": 1}, + {"source": "Amap Court-circuit", "target": "Solen", "value": 1}, + {"source": "Solen", "target": "Olivier", "value": 1}, + {"source": "Manon", "target": "Wiebke", "value": 1}, + {"source": "Olivier", "target": "Cooperence", "value": 1}, + {"source": "Olivier", "target": "Elodie", "value": 1}, + {"source": "Elodie", "target": "Synesthesie", "value": 1}, + {"source": "Synesthesie", "target": "Loyce", "value": 1}, + {"source": "Synesthesie", "target": "Line", "value": 1}, + {"source": "Synesthesie", "target": "Julien", "value": 1}, + {"source": "Synesthesie", "target": "Marie.P", "value": 1}, + {"source": "Synesthesie", "target": "Maison jaune", "value": 1}, + {"source": "Synesthesie", "target": "Bachir", "value": 1}, + {"source": "Elodie", "target": "Julien", "value": 1}, + {"source": "Elodie", "target": "Loyce", "value": 1}, + {"source": "Elodie", "target": "Line", "value": 1}, + {"source": "Line", "target": "Julien", "value": 1}, + {"source": "Line", "target": "Loyce", "value": 1}, + {"source": "Julien", "target": "Loyce", "value": 1}, + {"source": "Victoria", "target": "Marie.P", "value": 1} + ] +} diff --git a/user/themes/r2c/scss/template/_section.scss b/user/themes/r2c/scss/template/_section.scss index 20d1176..e317022 100644 --- a/user/themes/r2c/scss/template/_section.scss +++ b/user/themes/r2c/scss/template/_section.scss @@ -89,3 +89,5 @@ body{ } } } + +#mapid { height: 180px; } diff --git a/user/themes/r2c/templates/modular/links.html.twig b/user/themes/r2c/templates/modular/links.html.twig index 401b80d..2a5d05c 100644 --- a/user/themes/r2c/templates/modular/links.html.twig +++ b/user/themes/r2c/templates/modular/links.html.twig @@ -6,7 +6,7 @@ {% for module in page.collection %}
{{ module.content }} +
{% endfor %} {% endblock %} - diff --git a/user/themes/r2c/templates/modular/reseausociaux.html.twig b/user/themes/r2c/templates/modular/reseausociaux.html.twig index 401b80d..6c10bcf 100644 --- a/user/themes/r2c/templates/modular/reseausociaux.html.twig +++ b/user/themes/r2c/templates/modular/reseausociaux.html.twig @@ -6,7 +6,7 @@ {% for module in page.collection %}
{{ module.content }} +
{% endfor %} {% endblock %} - diff --git a/user/themes/r2c/templates/modular/streetmap.html.twig b/user/themes/r2c/templates/modular/streetmap.html.twig index 401b80d..7892533 100644 --- a/user/themes/r2c/templates/modular/streetmap.html.twig +++ b/user/themes/r2c/templates/modular/streetmap.html.twig @@ -6,7 +6,7 @@ {% for module in page.collection %}
{{ module.content }} +
{% endfor %} {% endblock %} - diff --git a/user/themes/r2c/templates/partials/base.html.twig b/user/themes/r2c/templates/partials/base.html.twig index c206c58..54d98e2 100644 --- a/user/themes/r2c/templates/partials/base.html.twig +++ b/user/themes/r2c/templates/partials/base.html.twig @@ -18,7 +18,11 @@ {% block stylesheets %} {% do assets.addCss('theme://css/jquery-ui.css') %} {% do assets.addCss('theme://css-compiled/template.css') %} - {% do assets.addCss('theme://css/jquery.mCustomScrollbar.min.css') %} + {% do assets.addCss('theme://css/styles_3djs.css') %} + {% do assets.addCss('theme://css/styles_paperjs.css') %} + {# % do assets.addCss('theme://css/leaflet.css.css') % #} + {% endblock %} {{ assets.css() }} @@ -26,8 +30,17 @@ {% block javascripts %} {% do assets.addJs('jquery', 101) %} {% do assets.addJs('theme://js/jquery-ui.js', {group:'bottom'}) %} - {% do assets.addJs('theme://js/site.js', {group:'bottom'}) %} - {% do assets.addJs('theme://js/jquery.mCustomScrollbar.concat.min.js', {group:'bottom'}) %} + {% do assets.addJs('theme://js/script.js', {group:'bottom'}) %} + {% do assets.addJs('theme://js/d3.js', {group:'bottom'}) %} + {% do assets.addJs('theme://js/script_d3js.js', {group:'bottom'}) %} + {% do assets.addJs('theme://js/paper_full.js', {group:'bottom'}) %} + {# % do assets.addJs('theme://js/leaflet.js', {group:'bottom'}) % #} + {# do assets.addJs('theme://js/script_paperjs.js', {type:'text/paperscript', canvas:'canvas', group:'bottom'}) #} + + + {% endblock %} {{ assets.js() }} @@ -42,7 +55,7 @@

{{site.title}}

- +