Mercurial > hgrepos > hgweb.cgi > skipweb
changeset 3241:b56bf1659fd5
Move some unused directories
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/2013halfmarathon/bingo.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,69 @@ +body{ + +} +div.main{ + width: 800px; + height: 1000px; + background-image: url("bingo2.png"); + background-repeat: no-repeat; + margin-left: auto; + margin-right: auto; + border: thin solid red; + } +div.head{ + background:; + width: 100%; + height: 150px; +} + +/* ------------------------- +div.center-l{ + background:#67bdff; + width: 100px; + height: 100%; + border: thin solid; + float:left; +} +============================ */ + +div.center-c{ + background: white; + width: 710px; + height: 690px; + padding-top: 2%; + margin-top: 20px; + margin-left: auto; + margin-right: auto; +} + +/* ------------------------ +div.center-c li{ + width: 150px; + height: 150px; + float: left; + margin: auto; + border: thin solid; + list-style-type: none; +} +=========================== */ + +/* ------------------------- +div.center-r{ + background:#67bdff; + width: 100px; + height: 100%; + border: thin solid; + float: right; +} +============================ */ + +td div{ + position: relative; +} + + +div.foot{ + background:; + width: 100%; + height: 150px; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/2013halfmarathon/bingo.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,73 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> +<title>Minato Oasis Festival</title> +<style type="text/css"> +<!-- +td{ + width: 200px; + height: 200px; + margin: auto; + border: thin solid; +} +div.count{ + position: absolute; + top: 170px; + left: 170px; +} + +--> +</style> +<link rel="stylesheet" type="text/css" href="bingo.css"> +</head> + +<body> +<div class="main"> +<div class="head"> + +</div> +<div class="center-c"> +<table style="border: 2px solid; border-collapse: separate; margin-left: + auto; margin-right: auto; margin-top: auto; margin-bottom: auto;"> + <tr> + <td> </td> + <td> </td> + <td> </td> + </tr> + <tr> + <td> + + </td> + <td> + <div> + <img src="stamp-pig.png" alt="232x228(22742bytes)"width="195"height="195" style="align: center;"> + <div class="count"> + 1 + </div> + </div> + </td> + <td> + + </td> + </tr> + <tr> + <td> + + </td> + <td> + + </td> + <td> + + </td> + </tr> +</table> +</div> +<div class="foot"> + +</div> +<img src="skipman.png" alt="128x128(10800bytes)" width="128" height="128"> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/2013halfmarathon/city.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,26 @@ + +<html lang="ja"> +<head> +<title>ĥƥϡեޥ饽</title> +<link rel="stylesheet" type="text/css" href="skip.css"> +</head> + +<body> +<div class="img"> +<div class="monologue"> + +<h1>ջ</h1> +<p>˥ޥ֥ۡåȤΥץΥɤɬפ褪</p> +<p>פΤĮ5ΤŹ</p> +<p>פ3Ľ顢Ƥ͡</p> +</div> +</div> + +<siv class="map"> +<p><a href="."><img src="skip_map.png" alt="Photo" width="600" height="600"></a></p> +</div> +<p><a href="marathon2013.html">ץλˡϤdzǧǤ +</a> + +</body> +</html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/2013halfmarathon/marathon2013.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,73 @@ +<html lang="ja"> +<head> +<title>ĥƥϡեޥ饽</title> +<link rel="stylesheet" type="text/css" href="skip.css"> +</head> + +<body> + + +<div class="fix"> +<div class="menu"> +<table style="border-collapse: collapse; margin-left: + auto; margin-right: auto;"> + <tr><td><a href=".">top</a></td><td><a href="syuzai.html"><img src="" + alt=""></a></td><td><a href="program.html">ץ</a></td><td><a href="enq.html"></a></td><td><a href="girl.html"><img src="" alt="Ӥ"></a></td></tr> +</table> +</div> +</div> + +<div class="main_title"> +<img src="skip-kamo-small.png" alt="kamon"> +</div> + +<div class="mara"> +<h1>ĥƥϡեޥ饽 </h1> + +<div class="map_nakamachi"> +<img src="nakamachi.png" alt="Įܺ٥ޥå"> +</div> +<p><a href="https://ja-jp.facebook.com/SWAN.PROJECT">SWAN +Project</a></p> + +<p>ˤʤ뤪ŹοФå</p> +<div class="map"> +<img src="nakamachi_map.png" usemap="#map1"> +<map name="map1"> + <area shape="rect" coords="191,173,309,223" href="syuzai/moare.html" alt="ե顼ȡ⥢"> + <area shape="rect" coords="571,446,643,496" href="syuzai/butsudan_sato.html" alt="ʩŤκƣ"> + <area shape="rect" coords="649,451,716,500" href="syuzai/kikuchi.html" alt="۾"> + <area shape="rect" coords="676,514,750,565" href="syuzai/ichifuji.html" alt="Ʋٻ"> + <area shape="rect" coords="462,451,529,498" href="syuzai/nishimura_naka.html" alt="˥ĮŹ"> + <area shape="rect" coords="357,510,486,561" href="syuzai/.html" alt="եåե롼İƣ"> + <area shape="rect" coords="503,133,620,183" href="syuzai/vege_nishimura.html" alt="Ρ䤵ˤ"> + <area shape="rect" coords="424,130,499,178" href="syuzai/.html" alt="業ѥ"> + <area shape="rect" coords="319,63,447,116" href="syuzai/oizumi.html" alt="ͷեȤ"> + <area shape="rect" coords="319,129,396,177" href="syuzai/.html" alt="Įޥ륷"> + <area shape="rect" coords="152,122,229,159" href="syuzai/.html" alt="굮²"> + <area shape="rect" coords="5,47,183,116" href="syuzai/.html" alt="եå¿"> + <area shape="rect" coords="234,440,309,484" href="syuzai/.html" alt="̼"> +</map> +</div> + +<h2>ץǤʥݥޥۤǥå!</h2> + +<h3>ץäλ</h3> +<ol> +<li>ޥۤΡGoogle playפ⤷ϡApp Storeפ֥եåġפ̵ +ץޤ</li> +<li>FLET'S WiFiץפ̵ɤޤ</li> +<div class="img"><img src="downrad1.png" width="300" height="300"></div> +<li>ץươ桼Ͽޤ</li> +</ol> +<h3>ĥƥϡեޥ饽andɤפ</h3> +<p>ץŹޤ˹ԤäơޥۤǥפƤޤ</p> +<div class="img_float"> +<div class="img"><img src="omise3.png" width="300" height="300"></div> +<div class="img"><img src="kamonkun05.png" width="300" height="300"></div> +</div> + + <h2>פ3ĽơʸǤʥݥåȤޤ礦!</h2> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/2013halfmarathon/marathon2013.html.orig Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,73 @@ +<html lang="ja"> +<head> +<title>ĥƥϡեޥ饽</title> +<link rel="stylesheet" type="text/css" href="skip.css"> +</head> + +<body> + + +<div class="fix"> +<div class="menu"> +<table style="border-collapse: collapse; margin-left: + auto; margin-right: auto;"> + <tr><td><a href=".">top</a></td><td><a href="syuzai.html"><img src="" + alt=""></a></td><td><a href="program.html">ץ</a></td><td><a href="enq.html"></a></td><td><a href="girl.html"><img src="" alt="Ӥ"></a></td></tr> +</table> +</div> +</div> + +<div class="main_title"> +<img src="skip-kamo-small.png" alt="kamon"> +</div> + +<div class="mara"> +<h1>ĥƥϡեޥ饽 </h1> + +<div class="map_nakamachi"> +<img src="nakamachi.png" alt="Įܺ٥ޥå"> +</div> +<p><a href="https://ja-jp.facebook.com/SWAN.PROJECT">SWAN +Project</a></p> + +<p>ˤʤ뤪ŹοФå</p> +<div class="map"> +<img src="nakamachi_map.png" usemap="#map1"> +<map name="map1"> + <area shape="rect" coords="191,173,309,223" href="syuzai/moare.html" alt="ե顼ȡ⥢"> + <area shape="rect" coords="571,446,643,496" href="syuzai/butsudan_sato.html" alt="ʩŤκƣ"> + <area shape="rect" coords="649,451,716,500" href="syuzai/kikuchi.html" alt="۾"> + <area shape="rect" coords="676,514,750,565" href="syuzai/ichifuji.html" alt="Ʋٻ"> + <area shape="rect" coords="462,451,529,498" href="syuzai/nishimura_naka.html" alt="˥ĮŹ"> + <area shape="rect" coords="357,510,486,561" href="syuzai/.html" alt="եåե롼İƣ"> + <area shape="rect" coords="503,133,620,183" href="syuzai/vege_nishimura.html" alt="Ρ䤵ˤ"> + <area shape="rect" coords="424,130,499,178" href="syuzai/.html" alt="業ѥ"> + <area shape="rect" coords="319,63,447,116" href="syuzai/oizumi.html" alt="ͷեȤ"> + <area shape="rect" coords="319,129,396,177" href="syuzai/.html" alt="Įޥ륷"> + <area shape="rect" coords="152,122,229,159" href="syuzai/.html" alt="굮²"> + <area shape="rect" coords="5,47,183,116" href="syuzai/.html" alt="եå¿"> + <area shape="rect" coords="234,440,309,484" href="syuzai/.html" alt="̼"> +</map> +</div> + +<h2>ץǤʥݥޥۤǥå!</h2> + +<h3>ץäλ</h3> +<ol> +<li>ޥۤΡGoogle playפ⤷ϡApp Storeפ֥եåġפ̵ +ץޤ</li> +<li>FLET'S WiFiץפ̵ɤޤ</li> +<div class="img"><img src="downrad1.png" width="300" height="300"></div> +<li>ץươ桼Ͽޤ</li> +</ol> +<h3>ĥƥϡեޥ饽andɤפ</h3> +<p>ץŹޤ˹ԤäơޥۤǥפƤޤ</p> +<div class="img_float"> +<div class="img"><img src="omise3.png" width="300" height="300"></div> +<div class="img"><img src="kamonkun05.png" width="300" height="300"></div> +</div> + + <h2>פ3ĽơʸǤʥݥåȤޤ礦!</h2> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/2013halfmarathon/minato.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,17 @@ +body{ + background: #2d48e2; +} + +div{ + background: rgba(255,255,255,1.0); + height: 500px; + width: 1100px; + margin-left: auto; + margin-right: auto; +} + +h1{ + text-align: center; +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/2013halfmarathon/minato_festival.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,30 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> +<title>Stamp rally in Minato festival</title> +<style type="text/css"> +<!-- + +--> +</style> +<link rel="stylesheet" type="text/css" href="minato.css"> +</head> + +<body> +<h1>Minato Festival</h1> +<div> +<div> +<h2>פȤ...</h2> +<p> + +</p> +</div> +<div> +<h2>ץȤ...</h2> +</div> +<p></p> +</div> + +</body> +</html>
--- a/event/bingo.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -body{ - -} -div.main{ - width: 800px; - height: 1000px; - background-image: url("bingo2.png"); - background-repeat: no-repeat; - margin-left: auto; - margin-right: auto; - border: thin solid red; - } -div.head{ - background:; - width: 100%; - height: 150px; -} - -/* ------------------------- -div.center-l{ - background:#67bdff; - width: 100px; - height: 100%; - border: thin solid; - float:left; -} -============================ */ - -div.center-c{ - background: white; - width: 710px; - height: 690px; - padding-top: 2%; - margin-top: 20px; - margin-left: auto; - margin-right: auto; -} - -/* ------------------------ -div.center-c li{ - width: 150px; - height: 150px; - float: left; - margin: auto; - border: thin solid; - list-style-type: none; -} -=========================== */ - -/* ------------------------- -div.center-r{ - background:#67bdff; - width: 100px; - height: 100%; - border: thin solid; - float: right; -} -============================ */ - -td div{ - position: relative; -} - - -div.foot{ - background:; - width: 100%; - height: 150px; -}
--- a/event/bingo.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> -<title>Minato Oasis Festival</title> -<style type="text/css"> -<!-- -td{ - width: 200px; - height: 200px; - margin: auto; - border: thin solid; -} -div.count{ - position: absolute; - top: 170px; - left: 170px; -} - ---> -</style> -<link rel="stylesheet" type="text/css" href="bingo.css"> -</head> - -<body> -<div class="main"> -<div class="head"> - -</div> -<div class="center-c"> -<table style="border: 2px solid; border-collapse: separate; margin-left: - auto; margin-right: auto; margin-top: auto; margin-bottom: auto;"> - <tr> - <td> </td> - <td> </td> - <td> </td> - </tr> - <tr> - <td> - - </td> - <td> - <div> - <img src="stamp-pig.png" alt="232x228(22742bytes)"width="195"height="195" style="align: center;"> - <div class="count"> - 1 - </div> - </div> - </td> - <td> - - </td> - </tr> - <tr> - <td> - - </td> - <td> - - </td> - <td> - - </td> - </tr> -</table> -</div> -<div class="foot"> - -</div> -<img src="skipman.png" alt="128x128(10800bytes)" width="128" height="128"> -</div> -</body> -</html>
--- a/event/city.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ - -<html lang="ja"> -<head> -<title>ĥƥϡեޥ饽</title> -<link rel="stylesheet" type="text/css" href="skip.css"> -</head> - -<body> -<div class="img"> -<div class="monologue"> - -<h1>ջ</h1> -<p>˥ޥ֥ۡåȤΥץΥɤɬפ褪</p> -<p>פΤĮ5ΤŹ</p> -<p>פ3Ľ顢Ƥ͡</p> -</div> -</div> - -<siv class="map"> -<p><a href="."><img src="skip_map.png" alt="Photo" width="600" height="600"></a></p> -</div> -<p><a href="marathon2013.html">ץλˡϤdzǧǤ -</a> - -</body> -</html> \ No newline at end of file
--- a/event/marathon2013.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -<html lang="ja"> -<head> -<title>ĥƥϡեޥ饽</title> -<link rel="stylesheet" type="text/css" href="skip.css"> -</head> - -<body> - - -<div class="fix"> -<div class="menu"> -<table style="border-collapse: collapse; margin-left: - auto; margin-right: auto;"> - <tr><td><a href=".">top</a></td><td><a href="syuzai.html"><img src="" - alt=""></a></td><td><a href="program.html">ץ</a></td><td><a href="enq.html"></a></td><td><a href="girl.html"><img src="" alt="Ӥ"></a></td></tr> -</table> -</div> -</div> - -<div class="main_title"> -<img src="skip-kamo-small.png" alt="kamon"> -</div> - -<div class="mara"> -<h1>ĥƥϡեޥ饽 </h1> - -<div class="map_nakamachi"> -<img src="nakamachi.png" alt="Įܺ٥ޥå"> -</div> -<p><a href="https://ja-jp.facebook.com/SWAN.PROJECT">SWAN -Project</a></p> - -<p>ˤʤ뤪ŹοФå</p> -<div class="map"> -<img src="nakamachi_map.png" usemap="#map1"> -<map name="map1"> - <area shape="rect" coords="191,173,309,223" href="syuzai/moare.html" alt="ե顼ȡ⥢"> - <area shape="rect" coords="571,446,643,496" href="syuzai/butsudan_sato.html" alt="ʩŤκƣ"> - <area shape="rect" coords="649,451,716,500" href="syuzai/kikuchi.html" alt="۾"> - <area shape="rect" coords="676,514,750,565" href="syuzai/ichifuji.html" alt="Ʋٻ"> - <area shape="rect" coords="462,451,529,498" href="syuzai/nishimura_naka.html" alt="˥ĮŹ"> - <area shape="rect" coords="357,510,486,561" href="syuzai/.html" alt="եåե롼İƣ"> - <area shape="rect" coords="503,133,620,183" href="syuzai/vege_nishimura.html" alt="Ρ䤵ˤ"> - <area shape="rect" coords="424,130,499,178" href="syuzai/.html" alt="業ѥ"> - <area shape="rect" coords="319,63,447,116" href="syuzai/oizumi.html" alt="ͷեȤ"> - <area shape="rect" coords="319,129,396,177" href="syuzai/.html" alt="Įޥ륷"> - <area shape="rect" coords="152,122,229,159" href="syuzai/.html" alt="굮²"> - <area shape="rect" coords="5,47,183,116" href="syuzai/.html" alt="եå¿"> - <area shape="rect" coords="234,440,309,484" href="syuzai/.html" alt="̼"> -</map> -</div> - -<h2>ץǤʥݥޥۤǥå!</h2> - -<h3>ץäλ</h3> -<ol> -<li>ޥۤΡGoogle playפ⤷ϡApp Storeפ֥եåġפ̵ -ץޤ</li> -<li>FLET'S WiFiץפ̵ɤޤ</li> -<div class="img"><img src="downrad1.png" width="300" height="300"></div> -<li>ץươ桼Ͽޤ</li> -</ol> -<h3>ĥƥϡեޥ饽andɤפ</h3> -<p>ץŹޤ˹ԤäơޥۤǥפƤޤ</p> -<div class="img_float"> -<div class="img"><img src="omise3.png" width="300" height="300"></div> -<div class="img"><img src="kamonkun05.png" width="300" height="300"></div> -</div> - - <h2>פ3ĽơʸǤʥݥåȤޤ礦!</h2> -</div> -</body> -</html>
--- a/event/marathon2013.html.orig Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -<html lang="ja"> -<head> -<title>ĥƥϡեޥ饽</title> -<link rel="stylesheet" type="text/css" href="skip.css"> -</head> - -<body> - - -<div class="fix"> -<div class="menu"> -<table style="border-collapse: collapse; margin-left: - auto; margin-right: auto;"> - <tr><td><a href=".">top</a></td><td><a href="syuzai.html"><img src="" - alt=""></a></td><td><a href="program.html">ץ</a></td><td><a href="enq.html"></a></td><td><a href="girl.html"><img src="" alt="Ӥ"></a></td></tr> -</table> -</div> -</div> - -<div class="main_title"> -<img src="skip-kamo-small.png" alt="kamon"> -</div> - -<div class="mara"> -<h1>ĥƥϡեޥ饽 </h1> - -<div class="map_nakamachi"> -<img src="nakamachi.png" alt="Įܺ٥ޥå"> -</div> -<p><a href="https://ja-jp.facebook.com/SWAN.PROJECT">SWAN -Project</a></p> - -<p>ˤʤ뤪ŹοФå</p> -<div class="map"> -<img src="nakamachi_map.png" usemap="#map1"> -<map name="map1"> - <area shape="rect" coords="191,173,309,223" href="syuzai/moare.html" alt="ե顼ȡ⥢"> - <area shape="rect" coords="571,446,643,496" href="syuzai/butsudan_sato.html" alt="ʩŤκƣ"> - <area shape="rect" coords="649,451,716,500" href="syuzai/kikuchi.html" alt="۾"> - <area shape="rect" coords="676,514,750,565" href="syuzai/ichifuji.html" alt="Ʋٻ"> - <area shape="rect" coords="462,451,529,498" href="syuzai/nishimura_naka.html" alt="˥ĮŹ"> - <area shape="rect" coords="357,510,486,561" href="syuzai/.html" alt="եåե롼İƣ"> - <area shape="rect" coords="503,133,620,183" href="syuzai/vege_nishimura.html" alt="Ρ䤵ˤ"> - <area shape="rect" coords="424,130,499,178" href="syuzai/.html" alt="業ѥ"> - <area shape="rect" coords="319,63,447,116" href="syuzai/oizumi.html" alt="ͷեȤ"> - <area shape="rect" coords="319,129,396,177" href="syuzai/.html" alt="Įޥ륷"> - <area shape="rect" coords="152,122,229,159" href="syuzai/.html" alt="굮²"> - <area shape="rect" coords="5,47,183,116" href="syuzai/.html" alt="եå¿"> - <area shape="rect" coords="234,440,309,484" href="syuzai/.html" alt="̼"> -</map> -</div> - -<h2>ץǤʥݥޥۤǥå!</h2> - -<h3>ץäλ</h3> -<ol> -<li>ޥۤΡGoogle playפ⤷ϡApp Storeפ֥եåġפ̵ -ץޤ</li> -<li>FLET'S WiFiץפ̵ɤޤ</li> -<div class="img"><img src="downrad1.png" width="300" height="300"></div> -<li>ץươ桼Ͽޤ</li> -</ol> -<h3>ĥƥϡեޥ饽andɤפ</h3> -<p>ץŹޤ˹ԤäơޥۤǥפƤޤ</p> -<div class="img_float"> -<div class="img"><img src="omise3.png" width="300" height="300"></div> -<div class="img"><img src="kamonkun05.png" width="300" height="300"></div> -</div> - - <h2>פ3ĽơʸǤʥݥåȤޤ礦!</h2> -</div> -</body> -</html>
--- a/event/minato.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -body{ - background: #2d48e2; -} - -div{ - background: rgba(255,255,255,1.0); - height: 500px; - width: 1100px; - margin-left: auto; - margin-right: auto; -} - -h1{ - text-align: center; -} - -
--- a/event/minato_festival.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> -<title>Stamp rally in Minato festival</title> -<style type="text/css"> -<!-- - ---> -</style> -<link rel="stylesheet" type="text/css" href="minato.css"> -</head> - -<body> -<h1>Minato Festival</h1> -<div> -<div> -<h2>פȤ...</h2> -<p> - -</p> -</div> -<div> -<h2>ץȤ...</h2> -</div> -<p></p> -</div> - -</body> -</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/#gets.rb# Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,168 @@ +#!/usr/bin/env ruby22 +# -*- coding:utf-8 -*- + +require 'sqlite3' +require 'cgi' + +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("sql/main.sq3") + +id = c.cookies["id"][0] +person = id.to_i + +data = "select * from test where id = ?" +cook = db.execute(data, person) +upd = "update test set pt = ? where id = ?" +goods = "update goods set g1 = ?, g2 = ?, g3 = ?, g4 = ?, g5 = ?, g6 = ? where id = ?" + + +name = cook[0][1] +pt = cook[0][7] +lv = cook[0][8] + +ticket = "select * from goods where id = ?" +have = db.execute(ticket, person) +g1 = have[0][1] +g2 = have[0][2] +g3 = have[0][3] +g4 = have[0][4] +g5 = have[0][5] +g6 = have[0][6] + +gets = c["sho"] +c1 = 10 #商品それぞれに対して消費するポイント +c2 = 6 +c3 = 8 +c4 = 2 +c5 = 5 +c6 = 100 +n1 = "オランダせんべい" #商品それぞれの名前 +n2 = "温ビール" +n3 = "ハンドクリーム" +n4 = "" + +h1 = "チケットを発行したよ!<br>海洋センター3階でスタッフの人と商品をこうかんしてね!" +if lv < 3 + h1 = "チケット発行できません!" + kekka = "レベル が たりないよ!" +elsif gets == "s1" && pt >= c1 + g1 += 1 + pt -= c1 + kekka = "#{n1}交換券をゲット!" +elsif gets == "s2" && pt >= c2 + g2 += 1 + pt -= c2 + kekka = "#{n2}交換券をゲット!" +elsif gets == "s3" && pt >= c3 + g3 += 1 + pt -= c3 + kekka = "#{n3}交換券をゲット!" +elsif gets == "s4" && pt >= c4 + g4 += 1 + pt -= c4 + kekka = "あめ交換券をゲット!" +elsif gets == "s5" && pt >= c5 + g5 += 1 + pt -= c5 + kekka = "10円金券をゲット!" +elsif gets == "s6" && pt >= c6 + g6 += 1 + pt -= c6 + kekka = "まぐろ交換券をゲット!" +else + h1 = "チケット発行できません!!" + kekka = "ポイントとかたりません!" +end + +trade = c["trade"] +if trade == n1 && g1 > 0 + g1 -= 1 + kekka = "#{n1} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" + h1 = "#{n1}と交換します!<br>こぼさないで たべてね!" +elsif trade == n2 && g2 > 0 + g2 -= 1 + kekka = "#{n2} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、年齢を確認してから交換してください!" + h1 = "#{n2} と交換します!<br>ひやしてから おうち で のんでね!" +elsif trade == n3 && g3 > 0 +g3 -= 1 +kekka = "#{n3} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" + h1 = "#{n3}と交換します!" +elsif trade == n4 && g4 > 0 +g4 -= 1 +kekka = "あめ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" +h1 = "あめと交換します!" +elsif trade == "10えん金券" && g5 > 0 +g5 -= 1 +kekka = " 10えん と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" +h1 = "10えんと交換します!" +elsif trade == "まぐろ" && g6 > 0 +g6 -= 1 +kekka = "まぐろ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" +h1 = "まぐろと交換します!" +end + + + + + +db.execute(goods, g1, g2, g3, g4, g5, g6, person) +db.execute(upd, pt, person) + + +pre = "%" +printf(<<_EOS_, h1, name, pt, kekka, g1, g2, g4) + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" +content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" +type="text/css" rel="stylesheet" /> + +<link rel="shortcut icon" href="./img/tsuya.png"/> +<title>こうかん!</title> +<style type="text/css"> +<!-- +--> +</style> + +</head> + +<body> +<header></header> +<h1>さかたっち</h1> +<h2>%s</h2> +<p> +%sさん<br> +さかたポイント:%dp<br> +%s +</p> +<table> +<title>もっているチケット</title> +<tr><td> +オランダせんべい</td><td>:%d</td></tr><tr><td> +温ビール</td><td>:%d</td></tr><tr><td> +secret[3~/td><td>:%d</td></tr><tr><td> +</td><td></td></tr><tr><td> +</td><td></td></tr> +</table> +<br><br> +<div class="f1"><a href="prof.rb"><div class="lets"><span>もどる!</span></div></a></div> +<br><br> +<form method="POST" action="gets.rb"> +<input type="text" name="trade" placeholder="ここは スタッフ の 人 が つかうよ!"> +<input type="submit" value="スタッフ ぼたん"><br>スタッフじゃない人はおさないでね! +</form> + +<footer></footer> +</body> +</html> + + +_EOS_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/.htaccess Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,4 @@ +AddHandler cgi-script .rb +AddType "text/html; charset=UTF-8" .rb +AddType "text/html; charset=UTF-8" .html +Options +ExecCGI
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/accountcheck.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,126 @@ +#!/usr/bin/env ruby22 +# -*- coding: utf-8 -*- + +require 'sqlite3' +require 'kconv' +require 'cgi' + +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("sql/main.sq3") + + +sql = "insert into test values(?, ?, ?, ?, ?, ?, ?, ?, ?)" + +toi = "insert into toi values (?, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)" +item = "insert into goods values (?, 0, 0, 0, 0, 0, 0)" + +name = c["name"] + +cle1 = "CREATE TABLE IF NOT EXISTS test(id, name, cal, age, sex, aria, exp, pt, lv)" +cle2 = "CREATE TABLE IF NOT EXISTS toi(id, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10)" +cle3 = "CREATE TABLE IF NOT EXISTS goods(id, g1, g2, g3, g4, g5, g6)" +cle4 = "CREATE TABLE IF NOT EXISTS time(cd, now, id)" +cle5 = "CREATE TABLE IF NOT EXISTS num(cd, id)" +cle6 = "CREATE TABLE IF NOT EXISTS pass(id, pass, name)" + +ins4 = 'insert into time values(?, 61, "n")' +ins5 = 'insert into num values("aa",0)' +ins6 = 'insert into pass values(?, ?, ?)' +num = "select id from num where cd = ?" +numup = "update num set id = ? where cd = ?" + +db.execute(cle1) +db.execute(cle2) +db.execute(cle3) +db.execute(cle4) +db.execute(cle5) +db.execute(cle6) +if name == "createman789789789" +db.execute(ins4, "a") +db.execute(ins4, "b") +db.execute(ins4, "c") +db.execute(ins4, "d") +db.execute(ins4, "e") +db.execute(ins4, "f") +db.execute(ins4, "g") +db.execute(ins4, "h") +db.execute(ins4, "i") +db.execute(ins4, "j") +db.execute(ins5) +end + +name = c["name"] +namae = "#{name}" +cal = c["cal"] +age = c["age"] +sex = c["sex"] +aria = c["aria"] + +id = c.cookies["id"][0] +pass = c.cookies["pass"][0] + +if id == nil +# srand +# id = rand(1000) + number = db.execute(num, "aa") + id = number[0][0].to_i + 1 + exp = 0 + pt = 0 + lv = 1 + cd = "aa" + if pass == nil + pass = id + end + db.execute(ins6, id, pass, name) + db.execute(sql, id, name, cal, age, sex, aria, exp, pt, lv) + db.execute(toi, id) + db.execute(item, id) + db.execute(numup, id, cd) +end +# srand(id.to_i) +# id2 = rand(1000000) +id2 = pass + + + +expires = "SAT, 2 Apr 2016 00:00:00 GMT" + +printf("Content-type: text/html; charset=UTF-8 +Set-Cookie:id=%s ;expires=%s +Set-Cookie:pass=%s ;expires=%s\n\n", id, expires, id2, expires) + + +printf(<<_EOS_, name, id.to_i) +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" type="text/css" rel="stylesheet" /> + + + + +<link rel="shortcut icon" href="./img/cabage.png"/> +<title>Registering Account</title> + +</head> +<body> +<h1>さかたっち</h1> +<h2>登録が完了しました!</h2> +<p>ようこそ_ %s _さん!</p> +<p>あなたのIDは%04dです!</p> +<div class="f1"><a href="prof.rb"><div class="lets"><span>始めよう!</span></div></a></div> +<form method="POST" type="text"> +</form> +</body></html> +_EOS_ + + +if name == "createman987987987" + `rm sql/main.sq3` +# `touch sql/main.sq3` +# `chmod a+w sql/main.sq3` +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin/#check.rb# Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,151 @@ +#!/usr/bin/env ruby22 +# -*- coding: utf-8 -*- +require 'cgi' +require 'sqlite3' +require 'kconv' +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("../sql/main.sq3") + +getAC1 = ARGV[0] +pass = "hogehogeboy" + +hsh = c["SQ1"] +hsh += c["SQ2"] + +pts = "<table><tr><th>id</th><td>name</td><td>cal</td><td>age</td><td>sex</td><td>aria</td><td>exp</td><td>pt</td><td>lv</td></tr>" + + +if c["SQ2"] == "toi" +pts = "<table><tr><th>id</th><td>q1</td><td>q2</td><td>q3</td><td>q4</td><td>q5</td><td>q6</td><td>q7</td><td>q8</td><td>q9</td><td>secret</td></tr>" +elsif c["SQ2"] == "time" +pts = "<table><tr><th>cd</th><td>now</td><td>id</td></tr>" +elsif c["SQ2"] == "goods" +pts = "<table><tr><th>id</th><td>おちゃ</td><td>しょうひん2</td><td>しょうひん3</td><td>しょうひん4</td><td>しょうひん5</td><td>しょうひん6</td></tr>" +elsif c["SQ2"] == "pass" +pts = "<table><tr><th>id</th><td>pass</td><td>name</td></tr>" + +end + + +###################################### +################SQ3################### +if c["SQ3"] == "" +else +upd = c["SQ3"] +db.execute(upd) +end + +################SQ3################### +###################################### + + + + +################################ +################################ +if hsh == "" +# pts = "hoge" + hsh = "select * from test" +else +end + +hsh2 = db.execute(hsh) +i = 0 +while i < hsh2.length + data = hsh2[i] + if c["SQ2"] == "toi" + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td><td>#{data[10]}</td></tr>" + elsif c["SQ2"] == "time" + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td></tr>" + elsif c["SQ2"] == "goods" + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td></tr>" + else + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td></tr>" + end + i += 1 +end +#end +pts += "</table>" + + +print"Content-type: text/html; charset=UTF-8\n\n" + + +###################################### +################if ~html############## + +#if getAC1 == pass + +printf(<<_EOS_, pts, hsh2.lenght) +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="../smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="../profeel.css" +type="text/css" rel="stylesheet" /> + +<link rel="shortcut icon" href="../img/tamago.png"/> + +<title>control</title> +<style type="text/css"> +<!-- +--> +</style> +</head> + +<body> +<header><p>test,toi,goods,time,num,pass<p></header> + + + +<h1>control</h1> +<form method="POST" action="check.rb?#{pass}"> +<input type="text" name="SQ1" value="select * from "> +<input type="text" name="SQ2" placeholder='test JOIN pass ON test.id==pass.id;' value="test"> +<input type="submit"> +</form> + +<form method="POST" action="check.rb?#{pass}"> +<input type="text" name="SQ3" size="42" placeholder='insert into test values(501, "foo", "inu", 40, "G", "sakata", 0,0,1)' value="update test set pt = 0 where id = 0"> +<input type="submit"> +</form> +<p>%s<br></p> + + +<address>skip@xxxx.co.jp</address> +<footer></footer> +</body> +</html> + +_EOS_ +############################################# +############################################# +#else +if getAC1 == "hoge" ###いらない行。accをつける前は"else"のみだった。 +printf(<<_EOS_) +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html><head> +<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="../smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="../profeel.css" +type="text/css" rel="stylesheet" /> +<link rel="shortcut icon" href="./img/tamago.png"/> +<title>さかたっち(go top!)</title> +<style type="text/css"> +</style></head> +<body><header></header> +<h1>さかたっち</h1> +<a href="../index.html">トップへ!</a> +<address>skip@xxxx.co.jp</address> +<footer></footer></body> +</html> +_EOS_ +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin/.htaccess Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,10 @@ +AddHandler cgi-script .rb +AddType "text/html; charset=utf-8" .rb +AddType "text/html; charset=utf-8" .html +Options +ExecCGI +AuthUserFile /home/www/skip/oasis2015/admin/.htpasswd +#AuthUserFile /home/irhome/c113/c113007/public_html/web/oasis2015/admin/.htpasswd#royでページを動かしたいとき用 +AuthGroupFile /dev/null +AuthName "splatoon! piyopiyogirl" +AuthType Basic +require valid-user
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin/.htpasswd Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,1 @@ +c113007:QRf28ARYqd/FY
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin/check.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,151 @@ +#!/usr/bin/env ruby22 +# -*- coding: utf-8 -*- +require 'cgi' +require 'sqlite3' +require 'kconv' +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("../sql/main.sq3") + +getAC1 = ARGV[0] +pass = "hogehogeboy" + +hsh = c["SQ1"] +hsh += c["SQ2"] + +pts = "<table><tr><th>id</th><td>name</td><td>cal</td><td>age</td><td>sex</td><td>aria</td><td>exp</td><td>pt</td><td>lv</td></tr>" + + +if c["SQ2"] == "toi" +pts = "<table><tr><th>id</th><td>q1</td><td>q2</td><td>q3</td><td>q4</td><td>q5</td><td>q6</td><td>q7</td><td>q8</td><td>q9</td><td>secret</td></tr>" +elsif c["SQ2"] == "time" +pts = "<table><tr><th>cd</th><td>now</td><td>id</td></tr>" +elsif c["SQ2"] == "goods" +pts = "<table><tr><th>id</th><td>おちゃ</td><td>しょうひん2</td><td>しょうひん3</td><td>しょうひん4</td><td>しょうひん5</td><td>しょうひん6</td></tr>" +elsif c["SQ2"] == "pass" +pts = "<table><tr><th>id</th><td>pass</td><td>name</td></tr>" + +end + + +###################################### +################SQ3################### +if c["SQ3"] == "" +else +upd = c["SQ3"] +db.execute(upd) +end + +################SQ3################### +###################################### + + + + +################################ +################################ +if hsh == "" +# pts = "hoge" + hsh = "select * from test" +else +end + +hsh2 = db.execute(hsh) +i = 0 +while i < hsh2.length + data = hsh2[i] + if c["SQ2"] == "toi" + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td><td>#{data[10]}</td></tr>" + elsif c["SQ2"] == "time" + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td></tr>" + elsif c["SQ2"] == "goods" + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td></tr>" + else + pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td></tr>" + end + i += 1 +end +#end +pts += "</table>" + + +print"Content-type: text/html; charset=UTF-8\n\n" + +sum=hsh2.length +###################################### +################if ~html############## + +#if getAC1 == pass + +printf(<<_EOS_, sum , pts) +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="../smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="../profeel.css" +type="text/css" rel="stylesheet" /> + +<link rel="shortcut icon" href="../img/tamago.png"/> + +<title>control</title> +<style type="text/css"> +<!-- +--> +</style> +</head> + +<body> +<header><p>test,toi,goods,time,num,pass,%s<p></header> + + + +<h1>control</h1> +<form method="POST" action="check.rb?#{pass}"> +<input type="text" name="SQ1" value="select * from "> +<input type="text" name="SQ2" placeholder='test JOIN pass ON test.id==pass.id;' value="test"> +<input type="submit"> +</form> + +<form method="POST" action="check.rb?#{pass}"> +<input type="text" name="SQ3" size="42" placeholder='insert into test values(501, "foo", "inu", 40, "G", "sakata", 0,0,1)' value="update test set pt = 0 where id = 0"> +<input type="submit"> +</form> +<p>%s<br></p> + + +<address>skip@xxxx.co.jp</address> +<footer></footer> +</body> +</html> + +_EOS_ +############################################# +############################################# +#else +if getAC1 == "hoge" ###いらない行。accをつける前は"else"のみだった。 +printf(<<_EOS_) +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html><head> +<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="../smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="../profeel.css" +type="text/css" rel="stylesheet" /> +<link rel="shortcut icon" href="./img/tamago.png"/> +<title>さかたっち(go top!)</title> +<style type="text/css"> +</style></head> +<body><header></header> +<h1>さかたっち</h1> +<a href="../index.html">トップへ!</a> +<address>skip@xxxx.co.jp</address> +<footer></footer></body> +</html> +_EOS_ +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin2/.htaccess Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,9 @@ +AddHandler cgi-script .rb +AddType "text/html; charset=utf-8" .rb +AddType "text/html; charset=utf-8" .html +Options +ExecCGI +AuthUserFile /home/www/skip/2014OC/admin/.htpasswd +AuthGroupFile /dev/null +AuthName "ǧڥ" +AuthType Basic +require valid-user
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin2/.htpasswd Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,2 @@ +Murakami:7Y005Wtya7Ogw +test:tebUY14UFwMKg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin2/drawLots.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,24 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> +<title>Database delete</title> +</style> +<link rel="stylesheet" type="text/css" href="design.css"> +</head> + +<body> +<h1>抽選用ページ</h1> +<p>実行するとデータベースが書き変えられます。</p> +<p>実行する際は注意してください。</p> +<form method="POST" action="./drawLots.rb"> +<p>抽選を行いますか?<br> +はい<input type="radio" name="check" value="OK"> +いいえ<input type="radio" name="check" value="NO"> +</p> +<input type="submit" value="抽選"> +<input type="reset" value="リセット"> +</form> +<p><a href="monitor.rb">データ閲覧ページに戻る</a></p> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin2/drawLots.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,87 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +require 'sqlite3' +require 'cgi' +require 'date' + +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("../sql/stamp.sq3") + +add = ENV["REMOTE_ADDR"] + +if /^(172\.19\.5\.|172\.17\.54\.|172\.21\.90\.)|118.21.142.107|202.214.125.107|192.168.43.255/ =~ add +check = c['check'] + +printf("Content-type: text/html; charset=UTF-8\n\n") + +sum = 'SELECT SUM(rank) FROM main WHERE NOT id=1;' +rank_sum = db.execute(sum).flatten(2)[0].to_i + +t = Time.now +expires = Time.local(2014, 8, 17, 8, 50) +expires2 = Time.local(2014, 10, 25, 0, 00) +if t > expires && t < expires2 && rank_sum == 0 +else + check = "" + puts check +end + +if check == "OK" + begin + result = db.execute("select id,exp,rank from main;") + rescue + exit + end + all = Array.new + for id,lv,rank in result + if id == 1 || lv == 0 || rank.to_i != 0 + next + end + lv.to_i.times do + all << id + end + end + + tousen = Array.new(0) + atari1 = rand(all.length) + tousen << all[atari1] + all.delete_if {|x| x == tousen[0]} + + sql = "update main set rank = 1 where id = ?;" + db.execute(sql,tousen[0]) + + sql = "update main set rank = 2 where id = ?;" + while tousen.length < 4 + srand + atari2 = rand(all.length) + hoge = all[atari2] + tousen << all[atari2] + all.delete_if {|x| x == hoge} + db.execute(sql,hoge) + end + + i=0 + + printf("<p>1等はIDが%04dの方!おめでとー!</p>\n",tousen[i].to_i-1) + printf("<p>2等はIDが%04dと%04dと%04dの方!おめでとー!</p>\n",tousen[i+=1].to_i-1,tousen[i+=1].to_i-1,tousen[i+=1].to_i-1) +else + print"<p>抽選はまだ行いませんよ</p>\n" +end +print'<p><a href="drawLots.html">抽選ページに戻る</a></p> +<p><a href="monitor.rb">データ閲覧ページに戻る</a></p> +' +else + printf("Content-type: text/html; charset=UTF-8\n\n") + + printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h +tml4/strict.dtd"> +<html> +<head> +<title>Delete table</title> +<link rel="stylesheet" type="text/css" href="design.css"> +</head> +</body> +<p>管理者用ページのため閲覧できません。</p>' +end +print'</body></html>'
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin2/monitor.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,91 @@ +#!/usr/bin/env ruby +#coding:utf-8 + +require'cgi' +require'sqlite3' + +db = SQLite3::Database.new("../sql/stamp.sq3") + +c = CGI.new(:accept_charaset => "UTF-8") + +add = ENV["REMOTE_ADDR"] + +if /^(172\.19\.5\.|172\.17\.54\.|172\.21\.90\.)|118.21.142.107|202.214.125.107/ =~ add +rank = c["rank"] +flag = 0 +text = "<p>登録者一覧を表示します</p>\n" +begin + if rank == "y" + rank_reset = 'UPDATE main SET rank=0 WHERE NOT id=1;' + db.execute(rank_reset) + end + result = db.execute("select * from main;") + log = 'select * from logs;' + logs = db.execute(log) +rescue + flag = 1 + text = "<p>データがありません</p>\n" +end + +#rank = "n" + +printf("Content-type: text/html; charset=UTF-8\n\n") + +printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h +tml4/strict.dtd"> +<html> +<head> +<meta http-equiv="refresh" content="180;http://skip.koeki-prj.org/2014OC/admin/monitor.rb"> +<title>Delete table</title> +</head> +</body> +<h1>データ閲覧ページ</h1>' +puts text +if flag == 1 +else + print"<table border = 1>\n" + result.each do |line| + printf("<tr><td>%04d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",line[0].to_i-1,line[1],line[2],line[3],line[4],line[8],line[9]) + end + print'</table>' + print'<p><form method="POST" action="./monitor.rb"> +rankをリセットしますか?<br> +NO <input name="rank" type="radio" value="n" checked="checked"> / +YES <input name="rank" type="radio" value="y"><br> +<input type="submit" value="submit"> +</form></p> +' +end + +print'<h1>ログの閲覧</h1>' +if flag == 1 +else + print'<marquee direction=up hspace=50 scrolldelay=1 loop=1 scrollamount=1000 behavior="slide" width=500 height=200><table style="margin=0;">' + logs.each do |line| + hour = line[3].to_i/3600 + min = line[3].to_i%3600/60 + sec = line[3].to_i%3600%60 + printf("<tr><td width=50px>%s</td><td width=50px>%04d</td><td width=100px>%s</td><td width=100px>%d:%d:%d</td></tr>\n",line[0],line[1].to_i-1,line[2],hour,min,sec) + end + print"</table></marquee>" + print'<h1>その他の操作</h1> +<table border="1"> +<tr><th>データ削除</th><td><a href="operation.html">DELETE</a></td></tr> +<tr><th>抽選</th><td><a href="drawLots.html">DRAW</a></td></tr> +</table> +' +end +else + printf("Content-type: text/html; charset=UTF-8\n\n") + + printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h +tml4/strict.dtd"> +<html> +<head> +<title>Delete table</title> +</head> +</body> +<p>管理者用ページのため閲覧できません。</p>' +end + +print'</body></html>'
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin2/operation.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,27 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> +<title>Database delete</title> +</style> +<link rel="stylesheet" type="text/css" href="design.css"> +</head> + +<body> +<h1>データベース消去用</h1> +<p>実行するとデータベースが削除されます。</p> +<p>実行する際は注意してください。</p> +<form method="POST" action="./operation.rb"> +<p>本当に消しますか?<br> +はい<input type="radio" name="check" value="OK"> +いいえ<input type="radio" name="check" value="NO"> +</p> +<input type="submit" value="削除"> +<input type="reset" value="リセット"> +</form> +<p><a href="monitor.rb">データ閲覧ページに戻る</a></p> + +<address>c111126@g.koeki-u.ac.jp</address> + +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/admin2/operation.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,52 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +require 'sqlite3' +require 'cgi' + +db = SQLite3::Database.new("../sql/stamp.sq3") +c = CGI.new(:accept_charaset => "UTF-8") + +add = ENV["REMOTE_ADDR"] + +printf("Content-type: text/html; charset=UTF-8\n\n") + +if /^(172\.19\.5\.|172\.17\.54\.|172\.21\.90\.)|118.21.142.107|202.214.125.107/ =~ add +check = c['check'] +if check == "OK" + begin + db.execute("drop table main;") + db.execute("drop table logs;") + text = "<p>データを削除しました。</p>" + rescue + text = "<p>データがありません。</p>" + end +else + text = "データは削除されません" +end + +printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"> +<html> +<head> +<title>Delete table</title> +<link rel=\"stylesheet\" type=\"text/css\" href=\"design.css\"> +</head> +</body> +%s +<p><a href=\"monitor.rb\">データ閲覧ページへ</a></p> +<p></p> +</body></html> +", text) +print"<p><a href=\"monitor.rb\">データ閲覧ページに戻る</a></p>" +print"<p><a href=\"opration.html\">削除ページに戻る</a></p>" +else + printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h +tml4/strict.dtd"> +<html> +<head> +<title>Delete table</title> +<link rel="stylesheet" type="text/css" href="design.css"> +</head> +</body> +<p>管理者用ページのため閲覧できません。</p>' +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/cookie.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,35 @@ +#!/usr/bin/env ruby22 +# -*- coding: utf-8 -*- + +require 'sqlite3' +require 'kconv' +require 'cgi' + +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("sql/main.sq3") + +id = c.cookies["id"][0] +id = nil +expires = Time.now + 1 +if id == nil +end + + +printf("Content-type: text/html; charset=UTF-8 +Set-Cookie:id=%s ;expires=%s\n\n", id, expires) + +printf(<<_EOS_) +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head> +<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" type="text/css" rel="stylesheet" /> +<link rel="shortcut icon" href="./img/cabage.png"/> +<title>Registering Account</title> +</head> +<body> +<h1>さかたっち</h1> +<h2>cookieを削除しました!</h2> +<a href="index.html">とうろくがめんへ!</a> +</body></html> +_EOS_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/deletetest.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,4 @@ +#!/usr/koeki/bin/ruby +# -*- coding: utf-8 -*- + +`cp sql/tsback.sq3 sql/arere.sq3`
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/gets.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,169 @@ +#!/usr/bin/env ruby22 +# -*- coding:utf-8 -*- + +require 'sqlite3' +require 'cgi' + +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("sql/main.sq3") + +id = c.cookies["id"][0] +person = id.to_i + +data = "select * from test where id = ?" +cook = db.execute(data, person) +upd = "update test set pt = ? where id = ?" +goods = "update goods set g1 = ?, g2 = ?, g3 = ?, g4 = ?, g5 = ?, g6 = ? where id = ?" + + +name = cook[0][1] +pt = cook[0][7] +lv = cook[0][8] + +ticket = "select * from goods where id = ?" +have = db.execute(ticket, person) +g1 = have[0][1] +g2 = have[0][2] +g3 = have[0][3] +g4 = have[0][4] +g5 = have[0][5] +g6 = have[0][6] + +gets = c["sho"] +c1 = 8 #商品それぞれに対して消費するポイント +c2 = 4 +c3 = 6 +c4 = 2 +c5 = 5 +c6 = 100 +n1 = "オランダせんべい" #商品それぞれの名前 +n2 = "ビール" +n3 = "ハンドソープ" +n4 = "" + + +h1 = "チケットを発行したよ!<br>海洋センター3階でスタッフの人と商品をこうかんしてね!" +if lv < 3 + h1 = "チケット発行できません!" + kekka = "レベル が たりないよ!" +elsif gets == "s1" && pt >= c1 + g1 += 1 + pt -= c1 + kekka = "#{n1}交換券をゲット!" +elsif gets == "s2" && pt >= c2 + g2 += 1 + pt -= c2 + kekka = "#{n2}交換券をゲット!" +elsif gets == "s3" && pt >= c3 + g3 += 1 + pt -= c3 + kekka = "#{n3}交換券をゲット!" +elsif gets == "s4" && pt >= c4 + g4 += 1 + pt -= c4 + kekka = "あめ交換券をゲット!" +elsif gets == "s5" && pt >= c5 + g5 += 1 + pt -= c5 + kekka = "10円金券をゲット!" +elsif gets == "s6" && pt >= c6 + g6 += 1 + pt -= c6 + kekka = "まぐろ交換券をゲット!" +else + h1 = "チケット発行できません!!" + kekka = "ポイントとかたりません!" +end + +trade = c["trade"] +if trade == n1 && g1 > 0 + g1 -= 1 + kekka = "#{n1} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" + h1 = "#{n1}と交換します!<br>こぼさないで たべてね!" +elsif trade == n2 && g2 > 0 + g2 -= 1 + kekka = "#{n2} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、年齢を確認してから交換してください!" + h1 = "#{n2} と交換します!<br>ひやしてから おうち で のんでね!" +elsif trade == n3 && g3 > 0 +g3 -= 1 +kekka = "#{n3} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" + h1 = "#{n3}と交換します!" +elsif trade == n4 && g4 > 0 +g4 -= 1 +kekka = "あめ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" +h1 = "あめと交換します!" +elsif trade == "10えん金券" && g5 > 0 +g5 -= 1 +kekka = " 10えん と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" +h1 = "10えんと交換します!" +elsif trade == "まぐろ" && g6 > 0 +g6 -= 1 +kekka = "まぐろ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" +h1 = "まぐろと交換します!" +end + + + + + +db.execute(goods, g1, g2, g3, g4, g5, g6, person) +db.execute(upd, pt, person) + + +pre = "%" +printf(<<_EOS_, h1, name, pt, kekka, g1, g2, g3) + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" +content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" +type="text/css" rel="stylesheet" /> + +<link rel="shortcut icon" href="./img/tsuya.png"/> +<title>こうかん!</title> +<style type="text/css"> +<!-- +--> +</style> + +</head> + +<body> +<header></header> +<h1>さかたっち</h1> +<h2>%s</h2> +<p> +%sさん<br> +さかたポイント:%dp<br> +%s +</p> +<table> +<title>もっているチケット</title> +<tr><td> +オランダせんべい</td><td>:%d</td></tr><tr><td> +ビール</td><td>:%d</td></tr><tr><td> +secret</td><td>:%d</td></tr><tr><td> +</td><td></td></tr><tr><td> +</td><td></td></tr> +</table> +<br><br> +<div class="f1"><a href="prof.rb"><div class="lets"><span>もどる!</span></div></a></div> +<br><br> +<form method="POST" action="gets.rb"> +<input type="text" name="trade" placeholder="ここは スタッフ の 人 が つかうよ!"> +<input type="submit" value="スタッフ ぼたん"><br>スタッフじゃない人はおさないでね! +</form> + +<footer></footer> +</body> +</html> + + +_EOS_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/gohan.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,223 @@ +#!/usr/bin/env ruby22 +# -*- coding: utf-8 -*- +require 'cgi' +require 'sqlite3' +require 'kconv' +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("sql/main.sq3") + +id = c.cookies["id"][0] +person = id.to_i + +data = "select * from test where id = ?" + #idが?(後で代入)のデータをtest票から探す。という命令をdataにしくむ。全てがほしい場合は「*」。「*」を「name」に変えると該当データのnameだけとりだす。 + +cook = db.execute(data, person) + #dataに仕組んでいた命令を、personを代入しつつ実行。 + +upd = "update test set exp = ?, pt = ? where id = ?" + #「idが?3のとき、expを?1にする。ptを?2にする。」という命令文。 +lvupd = "update test set lv = ? where id = ?" + +que = "select q10 from toi where id = ?" +queupd = "update toi set q10 = 1 where id = ?" +q10 = db.execute(que, person) + + name = cook[0][1] + cal = cook[0][2] + exp = cook[0][6] + pt = cook[0][7] + lv = cook[0][8] + per = "%" +##################################### +##########秘密のこたえを設定############## +if cal == "inu" +m3 = "あゆ" +elsif cal == "sisip" +m3 = "ゆめ" +elsif cal == "kamon" +m3 = "ねぎ" +elsif cal == "boy" +m3 = "ふね" +elsif cal == "girl" +m3 = "かんざし" +else +m3 = "skipskip" +end +##################################### +##################################### + + +gohan = c["gohan"] +#himitu = "" +if gohan == "g1" && pt >= 1 + exp += 1 + pt -= 1 + db.execute(upd, exp, pt, person) + kekka = "#{cal}が成長した!" +elsif gohan == "g2" && pt >= 3 + exp += 4 + pt -= 3 + db.execute(upd, exp, pt, person) + kekka = "#{cal}がすごく成長した!" +elsif gohan == m3 + if q10[0][0] == 0 + exp += 10 + db.execute(upd, exp, pt, person) + kekka = "" + db.execute(queupd, person) + else + kekka ="しつもん に こたえられるのは いっかい だけだよ!" + end +else + kekka = "ポイント が たりない!" +end + +if gohan == m3 +elsif gohan == "g1" +elsif gohan == "g2" +else +kekka = "こたえ が ちがうよ!" +end + + +if exp >= lv*10 && lv < 5 + lv += 1 + db.execute(lvupd, lv, person) + kekka += "<br>レベルが上がった!<br>レベルが#{lv}になった!" +end + + +if cal == "inu" + image = "./img/inu#{lv}.png" + alt = "inu#{lv}" +elsif cal == "sisip" + image = "./img/sisip#{lv}.png" + alt = "sisip#{lv}" +elsif cal == "kamon" + image = "./img/kamon#{lv}.png" + alt = "kamon#{lv}" +elsif cal == "boy" + image = "./img/boy#{lv}.png" + alt = "boy#{lv}" +elsif cal == "girl" + image = "./img/girl#{lv}.png" + alt = "girl#{lv}" +else + image = "./img/snail.png" +end + +if lv == 1 + color = "black" +elsif lv == 2 + color = "navy" +elsif lv == 3 + color = "green" +elsif lv == 4 + color = "red" +elsif lv == 5 + color = "yellow" +else + color = "pink" + image = "./img/snail.png" + alt = "snails_bug" +end + +gage = 0 +exp2 = exp +if lv < 5 + while exp2 >= 10 + exp2 -= 10 + end + gage = 100-exp2*10 +end + + + +modoru = '<br><div class="f1"><a href="prof.rb"><div class="lets"><span>ホーム' +back = modoru +if lv < 5 && gohan == "g1" || lv < 5 && gohan == "g2" +mo = '<input type="button" value="おかわり!" onclick="location.reload();" />' +#dmo = "" + back = mo + modoru +elsif lv >= 5 + back += "<br>(レベルマックスだよ!)" +end +back += '</span></div></a></div>' + +cook = db.execute(data, person) +exp = cook[0][6] +pt = cook[0][7] +lv = cook[0][8] + + +printf(<<_EOS_, per, gage, per, per, per, color, image, alt, name, person, cal, lv, pt, kekka, back) + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" +content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" +type="text/css" rel="stylesheet" /> + +<link rel="shortcut icon" href="./img/exp.png"/> +<title>ごはぁん!</title> +<style type="text/css"> +<!-- +p.gage{ +background:#adf; +margin-left:0%s; +margin-right:%d%s; +text-align:left; +border-radius: 10ex; +} +div.gage{ +background:#ddf; +margin-left:20%s; +margin-right:20%s; +border-radius: 10ex; +} + +div.cal div{float:left; border:solid %s;} + +--> +</style> +</head> + +<body> +<header></header> +<h1>さかたっち</h1> + +<div class="cal"> +<div> +<img src=%s alt=%s width="172" height="172"> +</div> +<table class="state"><tr><td>name</td><td>:%s</td></tr> +<tr><td>id</td><td>:%04d</td></tr> +<tr><td>cara</td><td>:%s</td></tr> +<tr><td>lv.</td><td>%d</td></tr> +</table> +</div> + +<div class="gage"> +<p class="gage">exp</p> +</div> + +<p> + +さかたポイント:%dp<br> +%s +</p> + +%s +<footer></footer> +</body> +</html> + +_EOS_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/index.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,56 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" +content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" +type="text/css" rel="stylesheet" /> + + +<link rel="shortcut icon" href="./img/cabage.png"/> +<title>さかたっち</title> + +</head> + +<body> +<h1>さかたっち</h1><h2>~酒田の自然に囲まれて~</h2> +<p>キャラクターを登録しよう!</p> + +<form method="POST" action="./accountcheck.rb"> +<table> +<tr><td>名前</td><td><input name="name" type="text" size="15" placeholder="名前"></td></tr> +<tr><td>性別</td><td><select name="sex"> + <option value="B">男 + <option value="G">女 + </select></td></tr> +<tr><td>年代</td><td><select name="age"> + <option>10代以下 + <option>10代 + <option>20代 + <option>30代 + <option>40代 + <option>50代 + <option>60代以上 + </select></td></tr> +<tr><td>出身地</td><td><select name="aria"> + <option>酒田市内 + <option>山形県内 + <option>県外 + </select></td></tr> +<tr><td>キャラ</td><td><select name="cal"> + <option value="inu">いぬ + <option value="sisip">シシップ + <option value="kamon">カモン + <option value="boy">男の子 + <option value="girl">女の子 + </select></td></tr> +<tr><td></td><td><input type="submit" value="登録する!"></td></tr> +</table> +</form> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/magic.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +def magic() + srand(123456789) + hoge = Array.new + while hoge.length < 100 + hoge << rand(1000000) + hoge.uniq! + end + return hoge +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/main.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,8 @@ +body{ +text-align:center; +border-style:dashed; +border-color:#000; +color:#000; +} + +a{margin:-2px;}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/main2.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,15 @@ +##headのstyleのなかに既述しないと、%sなどの情報が受け取れない。prof.rb用。 + + +h2 { +text-align:left;xs +color: #f00; +font-size: 15px; +padding: 5px 20px 5px 5px; +font-family: Consolas, 'Courier New', 'Bitstream Vera Sans Mono', Courier, monospace; +margin: 2%s %d%s 2%s 20%s; +border-left: 2px solid #fcc; +border-bottom: 2px solid #fcc; +text-shadow: #66f 2px 5px 5px; +background:url("./img/lvb.png"); + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/prof.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,484 @@ +#!/usr/bin/env ruby22 +# -*- coding: utf-8 -*- +require 'cgi' +require 'sqlite3' +require 'kconv' +c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") +db = SQLite3::Database.new("./sql/main.sq3") + +id = c.cookies["id"][0] +person = id.to_i + +data = "select * from test where id = ?" +data2 = "select * from test where id = ?" +#idが?(後で代入)のデータをtest票から探す。という命令をdataにしくむ。全てがほしい場合は「*」。「*」を「name」に変えると該当データのnameだけとりだす。 +cook = db.execute(data, person) #dataに仕組んでいた命令を、personを代入しつつ実行。 +cook2 = db.execute(data2, person) +jikan1 = "select * from time where cd = ?" +timeupd = "update time set now = ?, id = ? where cd = ?" + +que = "select * from toi where id = ?" +queupd = "update toi set q1 = ?, q2 = ?, q3 = ?, q4 = ?, q5 = ? where id = ?" +toi = db.execute(que, person) + +bomd = "update test set pt = ? where id = ?" +ins4 = 'insert into time values(?, 61, "n")' +printf("Content-type: text/html; charset=UTF-8\n\n") + +begin +name = cook[0][1] +cal = cook[0][2] +age = cook[0][3] +sex = cook[0][4] +aria = cook[0][5] +exp = cook[0][6] +pt = cook[0][7] +lv = cook[0][8] +rescue +printf(<<_EOS_) +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html><head> +<meta name="viewport" +content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" +type="text/css" rel="stylesheet" /> +<link rel="shortcut icon" href="./img/cabage.png"/> +<title>さかたっち</title> +<style type="text/css"> +<!-- +--> +</style> +</head> + +<body> +<header></header> +<h1>データがみつかりません!</h1><h2>クッキーを消してやりなおしてください!</h2> +<div class="f1"><a href="index.html"><div class="lets"><span>とうろく画面へ!</span></div></a></div> +<div class="f1"><a href="cookie.rb"><div class="lets"><span>くっきーをけす!</span></div></a></div> +<address>skip@xxxx.co.jp</address> +<footer></footer> +</body> +</html> + +_EOS_ +exit(0) ##プログラム終了! これがないと以降のプログラムが動いてしまう。 +end + + + +q1 = toi[0][1] +q2 = toi[0][2] +q3 = toi[0][3] +q4 = toi[0][4] +q5 = toi[0][5] + +per ="%" + +##################--ptを獲得するための乱数生成--############# +##################----############################# + +def qrc() + srand(11223344) + x = rand(10000000) + srand(x) + qrnumber = Hash.new("n") + qrarr = ["a", "b", "c", "d", "e"] + qrarr.length.times do |n| + qrnumber[rand(100000000)] = qrarr[n] + end + return qrnumber +end + +##################ptを獲得した際の反応。#################### +#########前の人が書き込んだ時間と比べて60秒以内なら追加ポイント#### +kpt = 0 +bom = c["bom"] ####<form ~~ name="bom">より + +begin + jikan2 = db.execute(jikan1, "j") + now1 = jikan2[0][1] +rescue + db.execute(ins4, "a") + db.execute(ins4, "b") + db.execute(ins4, "c") + db.execute(ins4, "d") + db.execute(ins4, "e") + db.execute(ins4, "f") + db.execute(ins4, "g") + db.execute(ins4, "h") + db.execute(ins4, "i") + db.execute(ins4, "j") +end + +if bom == "please skip here" + jikan2 = db.execute(jikan1, "j") + now1 = jikan2[0][1] + nowper = jikan2[0][2] + now2 = Time.now.to_i + db.execute(timeupd, now2, person, "j") + if person == nowper + elsif now1 == nil + elsif now2-now1 < 2 ####2秒以内なら~ + pt += 50 + kpt += 50 + end + pt += 1 + kpt += 1 + # db.execute(bomd, pt, person) +end + +qrAC = qrc ###生成したハッシュには、"乱数"=>"記号"が入っている +getAC = ARGV[0].to_i ###URL?以降の文字(特定の乱数)を取得してgetACに代入 +qr = qrAC[getAC] ###特定の"乱数"が一致すると、"乱数"=>"記号"がqrに正しく入力される。 +qr = ARGV[0] + +if qr =="a" && q1 == 0 + q1 += 1 + jikan2 = db.execute(jikan1, "a") + now1 = jikan2[0][1] + nowper = jikan2[0][2] + now2 = Time.now.to_i + db.execute(timeupd, now2, person, "a") + if person == nowper + elsif now1 == nil + elsif now2-now1 < 60 + pt += 2 + kpt += 2 + end + pt += 10 + kpt += 10 +elsif qr == "b" && q2 == 0 + q2 += 1 + jikan2 = db.execute(jikan1, "b") + now1 = jikan2[0][1] + nowper = jikan2[0][2] + now2 = Time.now.to_i + db.execute(timeupd, now2, person, "b") + if person == nowper + elsif now1 == nil + elsif now2-now1 < 60 + pt += 2 + kpt += 2 + end + pt += 10 + kpt += 10 +elsif qr == "c" && q3 == 0 + q3 += 1 + jikan2 = db.execute(jikan1, "c") + now1 = jikan2[0][1] + nowper = jikan2[0][2] + now2 = Time.now.to_i + db.execute(timeupd, now2, person, "c") + if person == nowper + elsif now1 == nil + elsif now2-now1 < 60 + pt += 2 + kpt += 2 + end + pt += 10 + kpt += 10 +elsif qr == "d" && q4 == 0 + q4 += 1 + jikan2 = db.execute(jikan1, "d") + now1 = jikan2[0][1] + nowper = jikan2[0][2] + now2 = Time.now.to_i + db.execute(timeupd, now2, person, "d") + if person == nowper + elsif now1 == nil + elsif now2-now1 < 60 + pt += 2 + kpt += 2 + end + pt += 10 + kpt += 10 +elsif qr == "e" && q5 == 0 + q5 += 1 + jikan2 = db.execute(jikan1, "e") + now1 = jikan2[0][1] + nowper = jikan2[0][2] + now2 = Time.now.to_i + db.execute(timeupd, now2, person, "e") + if person == nowper + elsif now1 == nil + elsif now2-now1 < 60 + pt += 2 + kpt += 2 + end + pt += 10 + kpt += 10 +end + + +db.execute(bomd, pt, person) +db.execute(queupd, q1, q2, q3, q4, q5, person) + +kkget = "" +if kpt > 0 + kkget = "#{kpt}ポイントゲット!!" +end + + + +########################~ここまでpt処理~################### +####################################################### + +if cal == "inu" + image = "./img/inu#{lv}.png" + alt = "inu#{lv}" + m1 = "ドッグフード" + mimg1 = "./img/food.png" + m2 = "にく" + mimg2 = "./img/niku.png" +elsif cal == "sisip" + image = "./img/sisip#{lv}.png" + alt = "sisip#{lv}" + m1 = "ぱん" + mimg1 = "./img/pan.png" + m2 = "きゃべつ" + mimg2 = "./img/kyabetsu.png" +elsif cal == "kamon" + image = "./img/kamon#{lv}.png" + alt = "kamon#{lv}" + m1 = "かい" + mimg1 = "./img/kai.png" + m2 = "とびうお" + mimg2 = "./img/fish.png" +elsif cal == "boy" + image = "./img/boy#{lv}.png" + alt = "boy#{lv}" + m1 = "いか" + mimg1 = "./img/ship.png" + m2 = "つやひめ" + mimg2 = "./img/tsuya.png" +elsif cal == "girl" + image = "./img/girl#{lv}.png" + alt = "girl#{lv}" + m1 = "さくらんぼ" + mimg1 = "./img/room.png" + m2 = "つやひめ" + mimg2 = "./img/tsuya.png" +elsif cal == "snake" + image = "./img/snake#{lv}.png" + alt = "snake#{lv}" + m1 = "かえる" + mimg1 = "./img/exp.png" + m2 = "ねずみ" + mimg2 = "./img/exp.png" +else + image = "./img/snail.png" + m1 = "たまごのから" + mimg1 = "./img/tamago.png" + m2 = "きゃべつ" + mimg2 = "./img/cabage.png" +end + + + +if lv == 1 + color = "black" +elsif lv == 2 + color = "navy" +elsif lv == 3 + color = "green" +elsif lv == 4 + color = "red" +elsif lv == 5 + color = "yellow" +else + color = "pink" + image = "./img/snail.png" + alt = "snails_bug" +end +#expが10あがる毎にlvが1あがる。 +#expの1の位*10で、次のレベルアップに必要な経験値の割合が出る。 +#(exp=12の場合、2*10=『20%』、次のレベルアップまであと80%が必要、と分かる。) +#(exp=35の場合、5*10=『50%』、次のレベルアップまであと50%が必要、と分かる。) +gage = 0 +exp2 = exp +esa = "<br><br><br>" +if lv < 5 + while exp2 >= 10 + exp2 -= 10 + end + gage = 100-exp2*10 + esa ='<input type="reset" value="とりけし"> +<input type="submit" value="こうかんする!"><br> +<input type="text" name="gohan" placeholder="ひみつ の こたえ を いれてね!">:0pt' +end + + + + +######################## +###lv==5のとき画像を変える### +comm = "" +if ARGV[0] == "commandbomd" +comm += '<form method="POST" action="prof.rb?commandbomd"> +<input type="text" name="bom" size="8"> +<input type="submit"> +</form>' +elsif lv == 5 +comm += '<form method="POST" action="prof.rb"> +<input type="text" name="bom" size="8"> +<input type="submit"> +</form>' +end + +if bom == "inu1" +image = "./img/inu1.png" +elsif bom == "inu2" +image = "./img/inu2.png" +elsif bom == "inu3" +image = "./img/inu3.png" +elsif bom == "inu4" +image = "./img/inu4.png" +elsif bom == "inu5" +image = "./img/inu5.png" + +elsif bom == "sisip1" +image = "./img/sisip1.png" +elsif bom == "sisip2" +image = "./img/sisip2.png" +elsif bom == "sisip3" +image = "./img/sisip3.png" +elsif bom == "sisip4" +image = "./img/sisip4.png" +elsif bom == "sisip5" +image = "./img/sisip5.png" + +elsif bom == "kamon1" +image = "./img/kamon1.png" +elsif bom == "kamon2" +image = "./img/kamon2.png" +elsif bom == "kamon3" +image = "./img/kamon3.png" +elsif bom == "kamon4" +image = "./img/kamon4.png" +elsif bom == "kamon5" +image = "./img/kamon5.png" + +elsif bom == "boy1" +image = "./img/boy1.png" +elsif bom == "boy2" +image = "./img/boy2.png" +elsif bom == "boy3" +image = "./img/boy3.png" +elsif bom == "boy4" +image = "./img/boy4.png" +elsif bom == "boy5" +image = "./img/boy5.png" + +elsif bom == "girl1" +image = "./img/girl1.png" +elsif bom == "girl2" +image = "./img/girl2.png" +elsif bom == "girl3" +image = "./img/girl3.png" +elsif bom == "girl4" +image = "./img/girl4.png" +elsif bom == "girl5" +image = "./img/girl5.png" +end +######################### +######################### +###################################--HTML--################## +###################################--------################## + +#以下のprintfについて +#pre*4はstyleの部分、<h2>{margin(本来OS_,per,gage,per,per,per,name...) +printf(<<_EOS_, per, gage, per, per, per, color, kkget, image, alt, name, person, cal, lv, comm, pt, m1, mimg1, m2, mimg2, esa) + + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + +<meta name="viewport" +content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> +<meta name="format-detection" content="telephone=no"> +<link media="only screen and (max-device-width:480px)" +href="smart.css" type="text/css" rel="stylesheet" /> +<link media="screen and (min-device-width:481px)" href="profeel.css" +type="text/css" rel="stylesheet" /> + + + + +<link rel="shortcut icon" href="./img/cabage.png"/> +<title>さかたっち</title> +<style type="text/css"> +<!-- +p.gage{ +background:#adf; +margin-left:0%s; +margin-right:%d%s; +text-align:left; +border-radius: 10ex; +} +div.gage{ +background:#ddf; +margin-left:20%s; +margin-right:20%s; +border-radius: 10ex; +} +div.cal div{float:left; border:solid %s;} + +--> +</style> +</head> + +<body> +<header></header> +<h1>さかたっち</h1> +<h2>%s</h2> + +<div class="cal"> +<div> +<img src=%s alt=%s width="172" height="172"> +</div> +<table class="state"><tr><td>name</td><td>:%s</td></tr> +<tr><td>id</td><td>:%04d</td></tr> +<tr><td>cara</td><td>:%s</td></tr> +<tr><td>lv.</td><td>%d</td></tr> +</table> +</div> + +<div class="gage"> +<p class="gage">exp</p> +</div> + +%s + +<p>さかたポイント:%dp</p> +<table><tr><td> +<form method="POST" action="gohan.rb"> +<input type="checkbox" name="hdn">ごはん!<div><br> +<label><input type="radio" name="gohan" value="g1">%s:1pt<img src=%s width="16" height="16"></label><br> +<label><input type="radio" name="gohan" value="g2">%s:3pt<img src=%s width="16" height="16"></label><br> +%s +</div></form> +</td><td> +<form method="POST" action="gets.rb"> +<label><input type="checkbox" name="hdn">しょうひん!<div><br> +<label><input type="radio" name="sho" value="s1">オランダせんべい:8pt</label><br> +<label><input type="radio" name="sho" value="s2">ビール:4pt</label><br> +<input type="reset" value="とりけし"> +<input type="submit" value="こうかんする!"></div></label><br> + +</form> +</td></tr></table> + + + +<address>skip@xxxx.co.jp</address> +<footer></footer> +</body> +</html> + +_EOS_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/profeel.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,71 @@ +body{text-align:center; +background:#ffb; +} +header{ +#padding:100px; + position: relative; + top: 0px; + left: 0px; + width: 80%; + height: 200px; +background-image:url(./img/head.png); +text-align:center; +margin-left:auto;margin-right:auto; +} +footer{ +#padding:100px; + position: relative; + top: 0px; + left: 0px; + width: 80%; + height: 200px; +background-image:url(./img/foot.png); +text-align:center; +margin-left:auto;margin-right:auto; +} + + + +header p {color:red;} + +h1{ +color:#e90; +border:solid 5px #fa0; +border-style:double; +background:url("./img/lvb.png"); +background-color:red; +} + + + + +input[type="checkbox"][name="hdn"] + span {display: none;} +input[type="checkbox"][name="hdn"]:checked + span {display: inline;} + +input[type="checkbox"][name="hdn"] + div{opacity: 0;} +input[type="checkbox"][name="hdn"]:checked + div { + opacity: 1.0; transition: 3s ease-in-out; + transition: 1s linear;} + +table{margin-left:auto; margin-right: auto;} +table.state{text-align:left;} +table.state tr+tr+tr+tr{font-size:xx-large;} + + +div.f1{padding:0% 0%; +margin:1em 17em;} +div.lets{ +border:solid 2px #fa0; +background:#faf; +padding:1% 0%; +#margin:1em 17em; +} +div.lets span{color:navy; text-decoration: underline #faf;} + +div.cal {margin-left:auto; margin-right:auto; +width: 320px; height: 180px; +background: white} + + + +#form{margin-left:auto; margin-right:auto;}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/smart.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,74 @@ +body{text-align:center; +background:#ffb; +margin-left:auto;margin-right:auto; +width:340px; +} +header{ +#padding:100px; + position: relative; + top: 0px; + left: 0px; + width: 100%; + height: 140px; +background-image:url(./img/head2.png); +background-repeat:no-repeat; +text-align:center; +margin-left:auto;margin-right:auto; +} +footer{ +#padding:100px; + position: relative; + top: 0px; + left: 0px; + width: 100%; + height: 140px; +background-image:url(./img/foot2.png); +background-repeat:no-repeat; +text-align:center; +margin-left:auto;margin-right:auto; +} + + + +header p {color:red;} + +h1{ +color:#e90; +border:solid 5px #fa0; +border-style:double; +background:url("./img/lvb.png"); +background-color:red; +} + +input[type="checkbox"][name="hdn"] + span {display: none;} +input[type="checkbox"][name="hdn"]:checked + span {display: inline;} + +input[type="checkbox"][name="hdn"] + div{opacity: 0;} +input[type="checkbox"][name="hdn"]:checked + div { + opacity: 1.0; transition: 3s ease-in-out; + transition: 1s linear;} + +table{margin-left:auto; margin-right: auto;} +table.state{text-align:left;} +table.state tr+tr+tr+tr{font-size:xx-large;} + + +div.f1{padding:0% 0%;} +div.lets{ +border:solid 2px #fa0; +background:#faf; +padding:1% 0%; +#margin:1em 17em; +} +div.lets span{color:navy; text-decoration: underline #faf;} + + + + +div.cal {margin-left:auto; margin-right:auto; +width: 320px; height: 180px; +background: white} + + + +#form{margin-left:auto; margin-right:auto;}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/event/oasis2015/test.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,71 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +require 'cgi' +require 'sqlite3' +require './magic.rb' + +c = CGI.new(:accept_charset => "UTF-8") +db = SQLite3::Database.new("./sql/stamp.sq3") + +begin + result = db.execute("select * from main;") + max = "select max(id) from main;" +rescue + db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,sex,age,aria,cal,stamp_status,stamp_img,exp INTEGER,rank INTEGER,magic)"); + db.execute("insert into main(name,sex,age,aria,cal,stamp_status,stamp_img,exp,rank,magic) values('名前','性別','年代','住所','職業','スタンプ状況','スタンプ画像','レベル','当選順位','本人確認用')"); + result = db.execute("select * from main;") + max = "select max(id) from main;" +end + +id = c.cookies["id"][0] +c_magic = c.cookies["magic"][0] +name = c["name"] +cal = c["cal"] +age = c["age"] +sex = c["sex"] +aria = c["aria"] + +begin +sel = 'select * from main where id=? AND magic=?' +h = db.execute(sel, id.to_i, c_magic.to_i) +rescue +h == [] +end + +if id != nil && h != [] +update = 'update main set name=?, cal=?, age=?, sex=?, aria=? where id=? and magic=?' +mg = c_magic +db.execute(update, name, cal, age, sex, aria, id.to_i, mg.to_i) +else +code = magic() +id = db.execute(max).flatten(2)[0].to_i + 1 +mg = code[id] +sql = "insert into main(name,sex,age,aria,cal,stamp_status,stamp_img,exp,rank,magic) values (?,?,?,?,?,?,?,?,?,?);" +db.execute(sql,name,sex,age,aria,cal,'000010000','n,n,n,n,kamo1,n,n,n,n',0,0,mg); #初期値 +end + +expires = "SAT, 26 Oct 2015 00:00:00 GMT" + + +printf(<<_EOS_,id, expires, mg.to_s, expires) +Content-type: text/html; charset=UTF-8 +Set-Cookie:id=%s ;expires=%s +Set-Cookie:magic=%s;expires=%s + +<html> +<head> +<title>#{id}</title> +<link rel="stylesheet" type="text/css" href="../cssrubyII.css"> +</head> +<body> +<p> +・#{name}<br>・#{cal}<br>・#{age}<br>・#{sex}<br>・#{aria}<br>・#{id} +</p> + +<p> +tukaretanaaaa、#{name} +</p> +</body> +</html> +_EOS_
--- a/fujix/.htaccess Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -AddHandler cgi-script .rb -AddType "text/html; charset=UTF-8" .rb -AddType "text/html; charset=UTF-8" .html -Options +ExecCGI
--- a/fujix/add.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -<html> -<head> -<title>add page</title> -<link rel="stylesheet" type="text/css" href="ほげ.css"> -</head> - -<body> -<h1>登録ぺーじ</h1> - -<p><a href="manual.html">はじめに</a></p> -<p>名前を入れて登録しよう</p> -<form method="POST" action="./add.rb"> -<p>お名前: <input name="name" type="text" maxlength="40"><br> -<input type="submit" value="OK"> -<input type="reset" value="reset"><br></p> -</form> - -<address>c111126@g.koeki-u.ac.jp</address> - -</body> -</html>
--- a/fujix/add.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -#!/usr/bin/env ruby -#coding:utf-8 - -require'cgi' -require'sqlite3' - -c = CGI.new(:accept_charset => "UTF-8") -adname = c["name"] - -db = SQLite3::Database.new("sql/test.sq3") - -cookieuke = Hash.new # cookie値保存用のHash -if (c=ENV['HTTP_COOKIE']) # 環境変数 HTTP_COOKIE にcookieリストがある - c.split(/[;,]\s+/).each do |exp| # (セミコロンかカンマ)+空白 で分解 - if /(.*)=(.*)/ =~ exp # =の前後で分解 「変数=値;」 - key = CGI::unescape($1) # 変数も値もエスケープされているので - value = CGI::unescape($2) # 元に戻す - cookieuke[key] = CGI::unescape(value) - end - end -end - -name = cookieuke["name"] -id = cookieuke["id"].to_i - -if name == nil && id == 0 - begin - db.execute("insert into main(name,lon,lat,sta) values('#{adname}',0,0,1)"); - rescue - db.execute("create table main(id integer PRIMARY KEY AUTOINCREMENT,adname,lon,lat,sta)"); - db.execute("insert into main(name,lon,lat,sta) values('#{adname}',0,0,1)"); - db.execute("select * from main"); - end - - count = db.execute("select max(id) from main"); - - expires = (Time.now.gmtime+3600*24).strftime("%a, %d %b %Y %H:%M:%S GMT") - - printf("Set-Cookie:id=%d; expires=%s\n",count[0][0],expires) - printf("Set-Cookie:name=%s; expires=%s\n",adname,expires) -end - -print"Content-type: text/html charset=UTF-8\n\n" - -printf"<!DOCTYPE html> -<html> -<head> -<title>add page's</title> -<script language=\"javascript\"> -time = 1; -url = \"http://skip.koeki-prj.org/fujix/redirect.html\"; -function jumpPage() { - location.href = url; -} -setTimeout(\"jumpPage()\",time*500) -</script> - -</head> -<body> -<p>勝手にページが飛びます。</p> -<p>移動しない場合は<a href=\"redirect.html\">こちら</a>から移動してください</p> -</body> -</html> -"
--- a/fujix/admin/delete.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -<html> -<head> -<title>たいとる</title> -</style> -<link rel="stylesheet" type="text/css" href="ほげ.css"> -</head> - -<body> -<h1>データベース消去用</h1> -<p>OKで実行すると個人情報等が削除されます。</p> -<p>実行の際は注意してください。</p> -<form method="POST" action="./delete.rb"> -<p>本当に消しますか?<br> -はい<input type="radio" name="check" value="OK"> -いいえ<input type="radio" name="check" value="NO"> -</p> - -<input type="submit" value="削除"> -<input type="reset" value="リセット"> -</form> - -<address>c111126@g.koeki-u.ac.jp</address> - -</body> -</html>
--- a/fujix/admin/delete.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -#!/usr/bin/env ruby -#coding: utf-8 - -require 'cgi' -c = CGI.new(:accept_charaset => "UTF-8") -print("Content-type: text/html; charset=utf-8\n\n") -check = c['check'] -require 'sqlite3' -db = SQLite3::Database.new("../sql/test.sq3") - -if check == "OK" - db.execute("delete from main"); - begin - db.execute("drop table main"); - rescue - print"<p>テーブルの再構築に失敗しました。</p>" - else - db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat,sta)"); - db.execute("insert into main(name,lon,lat,sta) values('NAME','LON','LAT','STA')"); - print"<p>データベースの中身を消去しました。</p>" - end -else - print"<p>データベースは保持されたままです。</p>" -end -print"<p><a href=\"etsuran.rb\">もどる</a></p>"
--- a/fujix/admin/etsuran.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -#!/usr/bin/env ruby -#coding:utf-8 - -require 'sqlite3' -db = SQLite3::Database.new("../sql/test.sq3") - -begin - result = db.execute("select * from main"); -rescue - db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat,sta)"); - db.execute("insert into main(name,lon,lat,sta) values('NAME','LON','LAT','STA')"); - result = db.execute("select * from main"); -end - -print"Content-type: text/html; charset=utf-8 - -<html> -<head><title>情報閲覧用ページ</title> -<link rel=\"stylesheet\" type=\"text/css\" href=\"../coupon2.css\"> -</head> -<body>" -print"<div> -<h1>位置情報一覧</h1>" -if result.length == 0 - print"<p>まだ登録している人は居ません</p>" -else - print"<table border = 1> - <tr><th>名前</th><th>緯度</th><th>経度</th><th>地図</th></tr>\n" - result.each do |line| - if line[2] == "LON" - next - else - printf("<tr><td>%s</td><td>%f</td><td>%f</td><td><a href=\"../check.rb?%s\">表示</a></td></tr>\n",line[1],line[2],line[3],line[2].to_s+"+"+line[3].to_s) - end - end - print"</table>" -end -print"</body> -</html>"
--- a/fujix/check.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -#!/usr/bin/env ruby -#coding:utf-8 - -print"Content-type: text/html charset=UTF-8\n\n" - -require'sqlite3' -require'cgi' -c = CGI.new(:accept_charaset => "UTF-8") -db = SQLite3::Database.new("sql/test.sq3") -db.results_as_hash = true - -data = Hash.new - -begin - db.execute("select * from main"); -rescue - db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat)"); - db.execute("insert into main(name,lon,lat) values('#{name}','#{lon}','#{lat}')"); -end - -db.execute("select * from main") do |load| - data[load['id']] = [load['name'],load['lon'],load['lat'],load['sta']] -end - -lon = 38.89420 -lat = 139.8187 -redirect = "check.rb" -image = ["","face","angry","sad"] - -if ARGV[1] != nil - lon = ARGV[0].to_f - lat = ARGV[1].to_f - redirect += "?" + lon.to_s + "+" + lat.to_s -end - -printf(<<_EOS_,redirect,lon.to_f,lat.to_f) -<!DOCTYPE html> -<html> -<head> -<link rel="stylesheet" type="text/css" href="leaflet/leaflet.css"/> -<script src="leaflet/leaflet.js"></script> -<style> - html,body,#map{ - height: 100% - } - body{ - padding: 0; - margin: 0; - } -</style> -<title>閲覧用ページ</title> -<!-- <meta http-equiv="refresh" content="20;%s"> --> -</head> -<body> -<div id="map"></div> -<script type="text/javascript"> - var hmap = L.map('map',{ - center: [%f,%f], - zoom: 16 //1~18 - }); - L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ - attribution: '© OpenStreetMap contributors' - }).addTo(hmap); -_EOS_ - - for id in data.keys - if data[id][1] == "LON" - next - else - num = data[id][3] - printf(<<_EOS_,data[id][1].to_f,data[id][2].to_f,image[num],data[id][0]) - L.marker([%f,%f],{ - clickable:true, - draggable:true, - icon:L.icon({ - iconUrl: 'leaflet/images/%s.png', - iconAnchor: [0,0], - popupAnchor: [10,5] - }) - }) - .bindPopup('%s') - .addTo(hmap); -_EOS_ - end - end - - print" -</script> -</body> -</html>\n" -
--- a/fujix/glocation.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> -<title>Ȥ</title> -<link rel="stylesheet" type="text/css" href="ۤ.css"> -</head> - -<script type="text/javascript"> - if (navigator.geolocation) { - - // ߤΰ־ - navigator.geolocation.getCurrentPosition( - - // 1˰־μ - function (pos) { - var location ="<li>"+"١" + pos.coords.latitude + "</li>"; - location += "<li>"+"١" + pos.coords.longitude + "</li>"; - document.getElementById("location").innerHTML = location; - }, - // 2˰־μ˼Ԥ - function (error) { - var message = ""; - - switch (error.code) { - - // ־Ǥʤ - case error.POSITION_UNAVAILABLE: - message = "־μǤޤǤ"; - break; - - // GeolocationλѤĤʤ - case error.PERMISSION_DENIED: - message = "־λѵĤޤǤ"; - break; - - // ॢȤ - case error.PERMISSION_DENIED_TIMEOUT: - message = "־˥ॢȤޤ"; - break; - } - window.alert(message); - } - ); - } else { - window.alert("ܥ֥饦ǤGeolocationȤޤ"); - } -</script> - -<ul id="location"> - <li>:</li> -</ul> - -</body> -</html>
--- a/fujix/icon.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -<html> -<head> -<title>OpenLayers Simplest Example</title> -</head> -<body> -<div id="Map" style="height:600px;"></div> -<script src="http://openlayers.org/api/OpenLayers.js"></script> -<script> - var lon = 139.83643; - var lat = 38.915394; - var zoom = 16; - - var fromProjection = new OpenLayers.Projection("EPSG:4326"); - var toProjection = new OpenLayers.Projection("EPSG:900913"); - var position = new OpenLayers.LonLat(lon, lat).transform( fromProjection, toProjection); - map = new OpenLayers.Map("Map"); - var mapnik = new OpenLayers.Layer.OSM(); - map.addLayer(mapnik); - map.setCenter(position, zoom); - - var popup; - var marker_layer = new OpenLayers.Layer.Markers( "Markers" ); - var size = new OpenLayers.Size(42,50); - var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); - var contentStrings = new Array(); - - var icon_marker = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',size,offset); - marker = new OpenLayers.Marker(new OpenLayers.LonLat(lon,lat).transform(fromProjection,toProjection), icon_marker); - marker.events.register('click', marker, function(evt) { - popup = new OpenLayers.Popup.FramedCloud("Popup", - new OpenLayers.LonLat(lon,lat).transform( fromProjection, toProjection), - null,"ほげほげ",null,true); - map.addPopup(popup); - }); - marker.events.register('mouseout', marker, function(evt) {popup.hide();}); - marker_layer.addMarker(marker); - - var icon_marker2 = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',size,offset); - marker2 = new OpenLayers.Marker(new OpenLayers.LonLat(139.83664,38.915955).transform(fromProjection,toProjection), icon_marker2); - marker2.events.register('click', marker2, function(evt) { - popup2 = new OpenLayers.Popup.FramedCloud("Popup2", - new OpenLayers.LonLat(139.83664, 38.915955).transform( fromProjection, toProjection), - null,"fujix",null,true); - map.addPopup(popup2); - }); - //here add mouseout event - marker2.events.register('mouseout', marker2, function(evt) {popup2.hide();}); - - marker_layer.addMarker(marker2); - - map.addLayer(marker_layer); - -</script> -</body> - -</html>
--- a/fujix/leaf.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<link rel="stylesheet" type="text/css" href="leaflet/leaflet.css"/> - -<script src="leaflet/leaflet.js"></script> -<style> - html,body,#map{ - height: 100% - } - body{ - padding: 0; - margin: 0; - } - </style> - -<title>Getting Started with Leaflet</title> -</head> - -<body> -<div id="map"></div> -<script type="text/javascript"> - var hmap = L.map('map',{ - center: [38.91026,139.84532], - zoom: 14 //1~18 - }); - L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ - attribution: '© OpenStreetMap contributors' - }).addTo(hmap); - L.marker([38.91026,139.84532],{ - clickable:true - }) - .bindPopup('ほげ') - .addTo(hmap); -</script> -</body> -</html>
--- a/fujix/leaf.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -#!/usr/bin/env ruby -#coding:utf-8 - -print"Content-type: text/html charset=UTF-8\n\n" - -require'sqlite3' -require'cgi' -cgi = CGI.new(:accept_charaset => "UTF-8") -db = SQLite3::Database.new("sql/test.sq3") -db.results_as_hash = true #DBの値をハッシュとして受け取る - -cookieuke = Hash.new # cookie値保存用のHash -if (c=ENV['HTTP_COOKIE']) # 環境変数 HTTP_COOKIE にcookieリストがある - c.split(/[;,]\s+/).each do |exp| # (セミコロンかカンマ)+空白 で分解 - if /(.*)=(.*)/ =~ exp # =の前後で分解 「変数=値;」 - key = CGI::unescape($1) # 変数も値もエスケープされているので - value = CGI::unescape($2) # 元に戻す - cookieuke[key] = CGI::unescape(value) - end - end -end - -name = cookieuke["name"] -id = cookieuke["id"].to_i -image = ["","face","angry","sad"] - -if ARGV[0] == "error" || ARGV[1] == nil || (name == "" && id == 0) - message = "" - redirect = "redirect" - if name == "" && id == 0 - redirect = "add" - message = "登録されていないため登録ページへ飛びます" - elsif ARGV[0] == "error" - message = "位置情報が正しく取れなかったため、もう一度取り直します" - elsif ARGV[1] == nil - message = "想定されないアクセスがされたため登録ページに戻ります" - redirect = "add" - end - - printf(<<_EOS_,redirect,message,redirect) -<!DOCTYPE html> -<html> -<head> -<title>MISS</title> -<meta http-equiv="refresh" content="3;%s.html"> -</head> -<body> -<p>%s</p> -<p>移動しない場合は<a href="%s.html">こちら</a>から移動してください</p> -</body> -</html> -_EOS_ - -else - lon = ARGV[0].to_f - lat = ARGV[1].to_f - data = Hash.new - - begin - db.execute("select * from main"); - rescue - db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat,sta)"); - db.execute("insert into main(name,lon,lat,sta) values('#{name}','#{lon}','#{lat}','#{sta}')"); - end - - sta = cgi["v_radio"].to_i - if sta != 0 - bun = "good" - sql = "update main set name=?,lon=?,lat=?,sta=? where id=?" - begin - db.execute(sql,name,lon,lat,sta,id) - rescue - #db.execute("insert into main(name,lon,lat,sta) values('#{name}','#{lon}','#{lat}','#{sta}')"); - end - else - bun = "boo" - sql = "update main set name=?,lon=?,lat=? where id=?" - begin - db.execute(sql,name,lon,lat,id) - rescue - #db.execute("insert into main(name,lon,lat,sta) values('#{name}','#{lon}','#{lat}','#{sta}')"); - end - end - - db.execute("select * from main") do |load| - data[load['id']] = [load['name'],load['lon'],load['lat'],load['sta']] - end - - printf(<<_EOS_,lon.to_f,lat.to_f,lon.to_f,lat.to_f) -<!DOCTYPE html> -<html> -<head> -<link rel="stylesheet" type="text/css" href="leaflet/leaflet.css"/> -<script src="leaflet/leaflet.js"></script> -<style> - html,body{ - height: 100% - } - #map{ - height: 95% - } - body{ - padding: 0; - margin: 0; - } - form{ - font-size:5mm; - } -</style> -<title>Getting Started with Leaflet</title> -<meta http-equiv="refresh" content="20;redirect.html"> -</head> -<body> -<form method="POST" action="./leaf.rb?%f+%f"> -<input name="v_radio" type="radio" value="1">順調 -<input name="v_radio" type="radio" value="2">トラブル -<input name="v_radio" type="radio" value="3">ヘルプ -<input type="submit" value="OK"> -</form> -<div id="map"></div> -<script type="text/javascript"> - var hmap = L.map('map',{ - center: [%f,%f], - zoom: 17 //1~18 - }); - L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ - attribution: '© OpenStreetMap contributors' - }).addTo(hmap); -_EOS_ - for id in data.keys - if data[id][1] == "LON" - next - else - gazo = data[id][3] - printf(<<_EOS_,data[id][1].to_f,data[id][2].to_f,image[gazo],data[id][0]) - L.marker([%f,%f],{ - clickable:true, - draggable:true, - icon:L.icon({ - iconUrl: 'leaflet/images/%s.png', - iconAnchor: [0,0], - popupAnchor: [10,5] - }) - }) - .bindPopup('%s') - .addTo(hmap); -_EOS_ - end - end - - print" -</script> -</body> -</html>\n" -end
--- a/fujix/leaflet/leaflet-src.js Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8909 +0,0 @@ -/* - Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com - (c) 2010-2013, Vladimir Agafonkin - (c) 2010-2011, CloudMade -*/ -(function (window, document, undefined) { -var oldL = window.L, - L = {}; - -L.version = '0.6.4'; - -// define Leaflet for Node module pattern loaders, including Browserify -if (typeof module === 'object' && typeof module.exports === 'object') { - module.exports = L; - -// define Leaflet as an AMD module -} else if (typeof define === 'function' && define.amd) { - define(L); -} - -// define Leaflet as a global L variable, saving the original L to restore later if needed - -L.noConflict = function () { - window.L = oldL; - return this; -}; - -window.L = L; - - -/* - * L.Util contains various utility functions used throughout Leaflet code. - */ - -L.Util = { - extend: function (dest) { // (Object[, Object, ...]) -> - var sources = Array.prototype.slice.call(arguments, 1), - i, j, len, src; - - for (j = 0, len = sources.length; j < len; j++) { - src = sources[j] || {}; - for (i in src) { - if (src.hasOwnProperty(i)) { - dest[i] = src[i]; - } - } - } - return dest; - }, - - bind: function (fn, obj) { // (Function, Object) -> Function - var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; - return function () { - return fn.apply(obj, args || arguments); - }; - }, - - stamp: (function () { - var lastId = 0, - key = '_leaflet_id'; - return function (obj) { - obj[key] = obj[key] || ++lastId; - return obj[key]; - }; - }()), - - invokeEach: function (obj, method, context) { - var i, args; - - if (typeof obj === 'object') { - args = Array.prototype.slice.call(arguments, 3); - - for (i in obj) { - method.apply(context, [i, obj[i]].concat(args)); - } - return true; - } - - return false; - }, - - limitExecByInterval: function (fn, time, context) { - var lock, execOnUnlock; - - return function wrapperFn() { - var args = arguments; - - if (lock) { - execOnUnlock = true; - return; - } - - lock = true; - - setTimeout(function () { - lock = false; - - if (execOnUnlock) { - wrapperFn.apply(context, args); - execOnUnlock = false; - } - }, time); - - fn.apply(context, args); - }; - }, - - falseFn: function () { - return false; - }, - - formatNum: function (num, digits) { - var pow = Math.pow(10, digits || 5); - return Math.round(num * pow) / pow; - }, - - trim: function (str) { - return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); - }, - - splitWords: function (str) { - return L.Util.trim(str).split(/\s+/); - }, - - setOptions: function (obj, options) { - obj.options = L.extend({}, obj.options, options); - return obj.options; - }, - - getParamString: function (obj, existingUrl, uppercase) { - var params = []; - for (var i in obj) { - params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); - } - return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); - }, - - template: function (str, data) { - return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { - var value = data[key]; - if (value === undefined) { - throw new Error('No value provided for variable ' + str); - } else if (typeof value === 'function') { - value = value(data); - } - return value; - }); - }, - - isArray: function (obj) { - return (Object.prototype.toString.call(obj) === '[object Array]'); - }, - - emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' -}; - -(function () { - - // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - - function getPrefixed(name) { - var i, fn, - prefixes = ['webkit', 'moz', 'o', 'ms']; - - for (i = 0; i < prefixes.length && !fn; i++) { - fn = window[prefixes[i] + name]; - } - - return fn; - } - - var lastTime = 0; - - function timeoutDefer(fn) { - var time = +new Date(), - timeToCall = Math.max(0, 16 - (time - lastTime)); - - lastTime = time + timeToCall; - return window.setTimeout(fn, timeToCall); - } - - var requestFn = window.requestAnimationFrame || - getPrefixed('RequestAnimationFrame') || timeoutDefer; - - var cancelFn = window.cancelAnimationFrame || - getPrefixed('CancelAnimationFrame') || - getPrefixed('CancelRequestAnimationFrame') || - function (id) { window.clearTimeout(id); }; - - - L.Util.requestAnimFrame = function (fn, context, immediate, element) { - fn = L.bind(fn, context); - - if (immediate && requestFn === timeoutDefer) { - fn(); - } else { - return requestFn.call(window, fn, element); - } - }; - - L.Util.cancelAnimFrame = function (id) { - if (id) { - cancelFn.call(window, id); - } - }; - -}()); - -// shortcuts for most used utility functions -L.extend = L.Util.extend; -L.bind = L.Util.bind; -L.stamp = L.Util.stamp; -L.setOptions = L.Util.setOptions; - - -/* - * L.Class powers the OOP facilities of the library. - * Thanks to John Resig and Dean Edwards for inspiration! - */ - -L.Class = function () {}; - -L.Class.extend = function (props) { - - // extended class with the new prototype - var NewClass = function () { - - // call the constructor - if (this.initialize) { - this.initialize.apply(this, arguments); - } - - // call all constructor hooks - if (this._initHooks) { - this.callInitHooks(); - } - }; - - // instantiate class without calling constructor - var F = function () {}; - F.prototype = this.prototype; - - var proto = new F(); - proto.constructor = NewClass; - - NewClass.prototype = proto; - - //inherit parent's statics - for (var i in this) { - if (this.hasOwnProperty(i) && i !== 'prototype') { - NewClass[i] = this[i]; - } - } - - // mix static properties into the class - if (props.statics) { - L.extend(NewClass, props.statics); - delete props.statics; - } - - // mix includes into the prototype - if (props.includes) { - L.Util.extend.apply(null, [proto].concat(props.includes)); - delete props.includes; - } - - // merge options - if (props.options && proto.options) { - props.options = L.extend({}, proto.options, props.options); - } - - // mix given properties into the prototype - L.extend(proto, props); - - proto._initHooks = []; - - var parent = this; - // jshint camelcase: false - NewClass.__super__ = parent.prototype; - - // add method for calling all hooks - proto.callInitHooks = function () { - - if (this._initHooksCalled) { return; } - - if (parent.prototype.callInitHooks) { - parent.prototype.callInitHooks.call(this); - } - - this._initHooksCalled = true; - - for (var i = 0, len = proto._initHooks.length; i < len; i++) { - proto._initHooks[i].call(this); - } - }; - - return NewClass; -}; - - -// method for adding properties to prototype -L.Class.include = function (props) { - L.extend(this.prototype, props); -}; - -// merge new default options to the Class -L.Class.mergeOptions = function (options) { - L.extend(this.prototype.options, options); -}; - -// add a constructor hook -L.Class.addInitHook = function (fn) { // (Function) || (String, args...) - var args = Array.prototype.slice.call(arguments, 1); - - var init = typeof fn === 'function' ? fn : function () { - this[fn].apply(this, args); - }; - - this.prototype._initHooks = this.prototype._initHooks || []; - this.prototype._initHooks.push(init); -}; - - -/* - * L.Mixin.Events is used to add custom events functionality to Leaflet classes. - */ - -var eventsKey = '_leaflet_events'; - -L.Mixin = {}; - -L.Mixin.Events = { - - addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) - - // types can be a map of types/handlers - if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey] = this[eventsKey] || {}, - contextId = context && L.stamp(context), - i, len, event, type, indexKey, indexLenKey, typeIndex; - - // types can be a string of space-separated words - types = L.Util.splitWords(types); - - for (i = 0, len = types.length; i < len; i++) { - event = { - action: fn, - context: context || this - }; - type = types[i]; - - if (context) { - // store listeners of a particular context in a separate hash (if it has an id) - // gives a major performance boost when removing thousands of map layers - - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; - - typeIndex = events[indexKey] = events[indexKey] || {}; - - if (!typeIndex[contextId]) { - typeIndex[contextId] = []; - - // keep track of the number of keys in the index to quickly check if it's empty - events[indexLenKey] = (events[indexLenKey] || 0) + 1; - } - - typeIndex[contextId].push(event); - - - } else { - events[type] = events[type] || []; - events[type].push(event); - } - } - - return this; - }, - - hasEventListeners: function (type) { // (String) -> Boolean - var events = this[eventsKey]; - return !!events && ((type in events && events[type].length > 0) || - (type + '_idx' in events && events[type + '_idx_len'] > 0)); - }, - - removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object]) - - if (!this[eventsKey]) { - return this; - } - - if (!types) { - return this.clearAllEventListeners(); - } - - if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey], - contextId = context && L.stamp(context), - i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed; - - types = L.Util.splitWords(types); - - for (i = 0, len = types.length; i < len; i++) { - type = types[i]; - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; - - typeIndex = events[indexKey]; - - if (!fn) { - // clear all listeners for a type if function isn't specified - delete events[type]; - delete events[indexKey]; - - } else { - listeners = context && typeIndex ? typeIndex[contextId] : events[type]; - - if (listeners) { - for (j = listeners.length - 1; j >= 0; j--) { - if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) { - removed = listeners.splice(j, 1); - // set the old action to a no-op, because it is possible - // that the listener is being iterated over as part of a dispatch - removed[0].action = L.Util.falseFn; - } - } - - if (context && typeIndex && (listeners.length === 0)) { - delete typeIndex[contextId]; - events[indexLenKey]--; - } - } - } - } - - return this; - }, - - clearAllEventListeners: function () { - delete this[eventsKey]; - return this; - }, - - fireEvent: function (type, data) { // (String[, Object]) - if (!this.hasEventListeners(type)) { - return this; - } - - var event = L.Util.extend({}, data, { type: type, target: this }); - - var events = this[eventsKey], - listeners, i, len, typeIndex, contextId; - - if (events[type]) { - // make sure adding/removing listeners inside other listeners won't cause infinite loop - listeners = events[type].slice(); - - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context || this, event); - } - } - - // fire event for the context-indexed listeners as well - typeIndex = events[type + '_idx']; - - for (contextId in typeIndex) { - listeners = typeIndex[contextId].slice(); - - if (listeners) { - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context || this, event); - } - } - } - - return this; - }, - - addOneTimeEventListener: function (types, fn, context) { - - if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; } - - var handler = L.bind(function () { - this - .removeEventListener(types, fn, context) - .removeEventListener(types, handler, context); - }, this); - - return this - .addEventListener(types, fn, context) - .addEventListener(types, handler, context); - } -}; - -L.Mixin.Events.on = L.Mixin.Events.addEventListener; -L.Mixin.Events.off = L.Mixin.Events.removeEventListener; -L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener; -L.Mixin.Events.fire = L.Mixin.Events.fireEvent; - - -/* - * L.Browser handles different browser and feature detections for internal Leaflet use. - */ - -(function () { - - var ie = !!window.ActiveXObject, - ie6 = ie && !window.XMLHttpRequest, - ie7 = ie && !document.querySelector, - ielt9 = ie && !document.addEventListener, - - // terrible browser detection to work around Safari / iOS / Android browser bugs - ua = navigator.userAgent.toLowerCase(), - webkit = ua.indexOf('webkit') !== -1, - chrome = ua.indexOf('chrome') !== -1, - phantomjs = ua.indexOf('phantom') !== -1, - android = ua.indexOf('android') !== -1, - android23 = ua.search('android [23]') !== -1, - - mobile = typeof orientation !== undefined + '', - msTouch = window.navigator && window.navigator.msPointerEnabled && - window.navigator.msMaxTouchPoints, - retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || - ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && - window.matchMedia('(min-resolution:144dpi)').matches), - - doc = document.documentElement, - ie3d = ie && ('transition' in doc.style), - webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()), - gecko3d = 'MozPerspective' in doc.style, - opera3d = 'OTransition' in doc.style, - any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; - - - // PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch. - // https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151 - - var touch = !window.L_NO_TOUCH && !phantomjs && (function () { - - var startName = 'ontouchstart'; - - // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.MsTouch) or WebKit, etc. - if (msTouch || (startName in doc)) { - return true; - } - - // Firefox/Gecko - var div = document.createElement('div'), - supported = false; - - if (!div.setAttribute) { - return false; - } - div.setAttribute(startName, 'return;'); - - if (typeof div[startName] === 'function') { - supported = true; - } - - div.removeAttribute(startName); - div = null; - - return supported; - }()); - - - L.Browser = { - ie: ie, - ie6: ie6, - ie7: ie7, - ielt9: ielt9, - webkit: webkit, - - android: android, - android23: android23, - - chrome: chrome, - - ie3d: ie3d, - webkit3d: webkit3d, - gecko3d: gecko3d, - opera3d: opera3d, - any3d: any3d, - - mobile: mobile, - mobileWebkit: mobile && webkit, - mobileWebkit3d: mobile && webkit3d, - mobileOpera: mobile && window.opera, - - touch: touch, - msTouch: msTouch, - - retina: retina - }; - -}()); - - -/* - * L.Point represents a point with x and y coordinates. - */ - -L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) { - this.x = (round ? Math.round(x) : x); - this.y = (round ? Math.round(y) : y); -}; - -L.Point.prototype = { - - clone: function () { - return new L.Point(this.x, this.y); - }, - - // non-destructive, returns a new point - add: function (point) { - return this.clone()._add(L.point(point)); - }, - - // destructive, used directly for performance in situations where it's safe to modify existing point - _add: function (point) { - this.x += point.x; - this.y += point.y; - return this; - }, - - subtract: function (point) { - return this.clone()._subtract(L.point(point)); - }, - - _subtract: function (point) { - this.x -= point.x; - this.y -= point.y; - return this; - }, - - divideBy: function (num) { - return this.clone()._divideBy(num); - }, - - _divideBy: function (num) { - this.x /= num; - this.y /= num; - return this; - }, - - multiplyBy: function (num) { - return this.clone()._multiplyBy(num); - }, - - _multiplyBy: function (num) { - this.x *= num; - this.y *= num; - return this; - }, - - round: function () { - return this.clone()._round(); - }, - - _round: function () { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - }, - - floor: function () { - return this.clone()._floor(); - }, - - _floor: function () { - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); - return this; - }, - - distanceTo: function (point) { - point = L.point(point); - - var x = point.x - this.x, - y = point.y - this.y; - - return Math.sqrt(x * x + y * y); - }, - - equals: function (point) { - point = L.point(point); - - return point.x === this.x && - point.y === this.y; - }, - - contains: function (point) { - point = L.point(point); - - return Math.abs(point.x) <= Math.abs(this.x) && - Math.abs(point.y) <= Math.abs(this.y); - }, - - toString: function () { - return 'Point(' + - L.Util.formatNum(this.x) + ', ' + - L.Util.formatNum(this.y) + ')'; - } -}; - -L.point = function (x, y, round) { - if (x instanceof L.Point) { - return x; - } - if (L.Util.isArray(x)) { - return new L.Point(x[0], x[1]); - } - if (x === undefined || x === null) { - return x; - } - return new L.Point(x, y, round); -}; - - -/* - * L.Bounds represents a rectangular area on the screen in pixel coordinates. - */ - -L.Bounds = function (a, b) { //(Point, Point) or Point[] - if (!a) { return; } - - var points = b ? [a, b] : a; - - for (var i = 0, len = points.length; i < len; i++) { - this.extend(points[i]); - } -}; - -L.Bounds.prototype = { - // extend the bounds to contain the given point - extend: function (point) { // (Point) - point = L.point(point); - - if (!this.min && !this.max) { - this.min = point.clone(); - this.max = point.clone(); - } else { - this.min.x = Math.min(point.x, this.min.x); - this.max.x = Math.max(point.x, this.max.x); - this.min.y = Math.min(point.y, this.min.y); - this.max.y = Math.max(point.y, this.max.y); - } - return this; - }, - - getCenter: function (round) { // (Boolean) -> Point - return new L.Point( - (this.min.x + this.max.x) / 2, - (this.min.y + this.max.y) / 2, round); - }, - - getBottomLeft: function () { // -> Point - return new L.Point(this.min.x, this.max.y); - }, - - getTopRight: function () { // -> Point - return new L.Point(this.max.x, this.min.y); - }, - - getSize: function () { - return this.max.subtract(this.min); - }, - - contains: function (obj) { // (Bounds) or (Point) -> Boolean - var min, max; - - if (typeof obj[0] === 'number' || obj instanceof L.Point) { - obj = L.point(obj); - } else { - obj = L.bounds(obj); - } - - if (obj instanceof L.Bounds) { - min = obj.min; - max = obj.max; - } else { - min = max = obj; - } - - return (min.x >= this.min.x) && - (max.x <= this.max.x) && - (min.y >= this.min.y) && - (max.y <= this.max.y); - }, - - intersects: function (bounds) { // (Bounds) -> Boolean - bounds = L.bounds(bounds); - - var min = this.min, - max = this.max, - min2 = bounds.min, - max2 = bounds.max, - xIntersects = (max2.x >= min.x) && (min2.x <= max.x), - yIntersects = (max2.y >= min.y) && (min2.y <= max.y); - - return xIntersects && yIntersects; - }, - - isValid: function () { - return !!(this.min && this.max); - } -}; - -L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[]) - if (!a || a instanceof L.Bounds) { - return a; - } - return new L.Bounds(a, b); -}; - - -/* - * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix. - */ - -L.Transformation = function (a, b, c, d) { - this._a = a; - this._b = b; - this._c = c; - this._d = d; -}; - -L.Transformation.prototype = { - transform: function (point, scale) { // (Point, Number) -> Point - return this._transform(point.clone(), scale); - }, - - // destructive transform (faster) - _transform: function (point, scale) { - scale = scale || 1; - point.x = scale * (this._a * point.x + this._b); - point.y = scale * (this._c * point.y + this._d); - return point; - }, - - untransform: function (point, scale) { - scale = scale || 1; - return new L.Point( - (point.x / scale - this._b) / this._a, - (point.y / scale - this._d) / this._c); - } -}; - - -/* - * L.DomUtil contains various utility functions for working with DOM. - */ - -L.DomUtil = { - get: function (id) { - return (typeof id === 'string' ? document.getElementById(id) : id); - }, - - getStyle: function (el, style) { - - var value = el.style[style]; - - if (!value && el.currentStyle) { - value = el.currentStyle[style]; - } - - if ((!value || value === 'auto') && document.defaultView) { - var css = document.defaultView.getComputedStyle(el, null); - value = css ? css[style] : null; - } - - return value === 'auto' ? null : value; - }, - - getViewportOffset: function (element) { - - var top = 0, - left = 0, - el = element, - docBody = document.body, - docEl = document.documentElement, - pos, - ie7 = L.Browser.ie7; - - do { - top += el.offsetTop || 0; - left += el.offsetLeft || 0; - - //add borders - top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0; - left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0; - - pos = L.DomUtil.getStyle(el, 'position'); - - if (el.offsetParent === docBody && pos === 'absolute') { break; } - - if (pos === 'fixed') { - top += docBody.scrollTop || docEl.scrollTop || 0; - left += docBody.scrollLeft || docEl.scrollLeft || 0; - break; - } - - if (pos === 'relative' && !el.offsetLeft) { - var width = L.DomUtil.getStyle(el, 'width'), - maxWidth = L.DomUtil.getStyle(el, 'max-width'), - r = el.getBoundingClientRect(); - - if (width !== 'none' || maxWidth !== 'none') { - left += r.left + el.clientLeft; - } - - //calculate full y offset since we're breaking out of the loop - top += r.top + (docBody.scrollTop || docEl.scrollTop || 0); - - break; - } - - el = el.offsetParent; - - } while (el); - - el = element; - - do { - if (el === docBody) { break; } - - top -= el.scrollTop || 0; - left -= el.scrollLeft || 0; - - // webkit (and ie <= 7) handles RTL scrollLeft different to everyone else - // https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js - if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) { - left += el.scrollWidth - el.clientWidth; - - // ie7 shows the scrollbar by default and provides clientWidth counting it, so we - // need to add it back in if it is visible; scrollbar is on the left as we are RTL - if (ie7 && L.DomUtil.getStyle(el, 'overflow-y') !== 'hidden' && - L.DomUtil.getStyle(el, 'overflow') !== 'hidden') { - left += 17; - } - } - - el = el.parentNode; - } while (el); - - return new L.Point(left, top); - }, - - documentIsLtr: function () { - if (!L.DomUtil._docIsLtrCached) { - L.DomUtil._docIsLtrCached = true; - L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr'; - } - return L.DomUtil._docIsLtr; - }, - - create: function (tagName, className, container) { - - var el = document.createElement(tagName); - el.className = className; - - if (container) { - container.appendChild(el); - } - - return el; - }, - - hasClass: function (el, name) { - return (el.className.length > 0) && - new RegExp('(^|\\s)' + name + '(\\s|$)').test(el.className); - }, - - addClass: function (el, name) { - if (!L.DomUtil.hasClass(el, name)) { - el.className += (el.className ? ' ' : '') + name; - } - }, - - removeClass: function (el, name) { - el.className = L.Util.trim((' ' + el.className + ' ').replace(' ' + name + ' ', ' ')); - }, - - setOpacity: function (el, value) { - - if ('opacity' in el.style) { - el.style.opacity = value; - - } else if ('filter' in el.style) { - - var filter = false, - filterName = 'DXImageTransform.Microsoft.Alpha'; - - // filters collection throws an error if we try to retrieve a filter that doesn't exist - try { - filter = el.filters.item(filterName); - } catch (e) { - // don't set opacity to 1 if we haven't already set an opacity, - // it isn't needed and breaks transparent pngs. - if (value === 1) { return; } - } - - value = Math.round(value * 100); - - if (filter) { - filter.Enabled = (value !== 100); - filter.Opacity = value; - } else { - el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; - } - } - }, - - testProp: function (props) { - - var style = document.documentElement.style; - - for (var i = 0; i < props.length; i++) { - if (props[i] in style) { - return props[i]; - } - } - return false; - }, - - getTranslateString: function (point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - - var is3d = L.Browser.webkit3d, - open = 'translate' + (is3d ? '3d' : '') + '(', - close = (is3d ? ',0' : '') + ')'; - - return open + point.x + 'px,' + point.y + 'px' + close; - }, - - getScaleString: function (scale, origin) { - - var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))), - scaleStr = ' scale(' + scale + ') '; - - return preTranslateStr + scaleStr; - }, - - setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean]) - - // jshint camelcase: false - el._leaflet_pos = point; - - if (!disable3D && L.Browser.any3d) { - el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point); - - // workaround for Android 2/3 stability (https://github.com/CloudMade/Leaflet/issues/69) - if (L.Browser.mobileWebkit3d) { - el.style.WebkitBackfaceVisibility = 'hidden'; - } - } else { - el.style.left = point.x + 'px'; - el.style.top = point.y + 'px'; - } - }, - - getPosition: function (el) { - // this method is only used for elements previously positioned using setPosition, - // so it's safe to cache the position for performance - - // jshint camelcase: false - return el._leaflet_pos; - } -}; - - -// prefix style property names - -L.DomUtil.TRANSFORM = L.DomUtil.testProp( - ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); - -// webkitTransition comes first because some browser versions that drop vendor prefix don't do -// the same for the transitionend event, in particular the Android 4.1 stock browser - -L.DomUtil.TRANSITION = L.DomUtil.testProp( - ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); - -L.DomUtil.TRANSITION_END = - L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ? - L.DomUtil.TRANSITION + 'End' : 'transitionend'; - -(function () { - var userSelectProperty = L.DomUtil.testProp( - ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); - - L.extend(L.DomUtil, { - disableTextSelection: function () { - L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); - if (userSelectProperty) { - var style = document.documentElement.style; - this._userSelect = style[userSelectProperty]; - style[userSelectProperty] = 'none'; - } - }, - - enableTextSelection: function () { - L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); - if (userSelectProperty) { - document.documentElement.style[userSelectProperty] = this._userSelect; - delete this._userSelect; - } - }, - - disableImageDrag: function () { - L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); - }, - - enableImageDrag: function () { - L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); - } - }); -})(); - - -/* - * L.LatLng represents a geographical point with latitude and longitude coordinates. - */ - -L.LatLng = function (rawLat, rawLng) { // (Number, Number) - var lat = parseFloat(rawLat), - lng = parseFloat(rawLng); - - if (isNaN(lat) || isNaN(lng)) { - throw new Error('Invalid LatLng object: (' + rawLat + ', ' + rawLng + ')'); - } - - this.lat = lat; - this.lng = lng; -}; - -L.extend(L.LatLng, { - DEG_TO_RAD: Math.PI / 180, - RAD_TO_DEG: 180 / Math.PI, - MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check -}); - -L.LatLng.prototype = { - equals: function (obj) { // (LatLng) -> Boolean - if (!obj) { return false; } - - obj = L.latLng(obj); - - var margin = Math.max( - Math.abs(this.lat - obj.lat), - Math.abs(this.lng - obj.lng)); - - return margin <= L.LatLng.MAX_MARGIN; - }, - - toString: function (precision) { // (Number) -> String - return 'LatLng(' + - L.Util.formatNum(this.lat, precision) + ', ' + - L.Util.formatNum(this.lng, precision) + ')'; - }, - - // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula - // TODO move to projection code, LatLng shouldn't know about Earth - distanceTo: function (other) { // (LatLng) -> Number - other = L.latLng(other); - - var R = 6378137, // earth radius in meters - d2r = L.LatLng.DEG_TO_RAD, - dLat = (other.lat - this.lat) * d2r, - dLon = (other.lng - this.lng) * d2r, - lat1 = this.lat * d2r, - lat2 = other.lat * d2r, - sin1 = Math.sin(dLat / 2), - sin2 = Math.sin(dLon / 2); - - var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2); - - return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - }, - - wrap: function (a, b) { // (Number, Number) -> LatLng - var lng = this.lng; - - a = a || -180; - b = b || 180; - - lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a); - - return new L.LatLng(this.lat, lng); - } -}; - -L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number) - if (a instanceof L.LatLng) { - return a; - } - if (L.Util.isArray(a)) { - return new L.LatLng(a[0], a[1]); - } - if (a === undefined || a === null) { - return a; - } - if (typeof a === 'object' && 'lat' in a) { - return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon); - } - return new L.LatLng(a, b); -}; - - - -/* - * L.LatLngBounds represents a rectangular area on the map in geographical coordinates. - */ - -L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[]) - if (!southWest) { return; } - - var latlngs = northEast ? [southWest, northEast] : southWest; - - for (var i = 0, len = latlngs.length; i < len; i++) { - this.extend(latlngs[i]); - } -}; - -L.LatLngBounds.prototype = { - // extend the bounds to contain the given point or bounds - extend: function (obj) { // (LatLng) or (LatLngBounds) - if (!obj) { return this; } - - if (typeof obj[0] === 'number' || typeof obj[0] === 'string' || obj instanceof L.LatLng) { - obj = L.latLng(obj); - } else { - obj = L.latLngBounds(obj); - } - - if (obj instanceof L.LatLng) { - if (!this._southWest && !this._northEast) { - this._southWest = new L.LatLng(obj.lat, obj.lng); - this._northEast = new L.LatLng(obj.lat, obj.lng); - } else { - this._southWest.lat = Math.min(obj.lat, this._southWest.lat); - this._southWest.lng = Math.min(obj.lng, this._southWest.lng); - - this._northEast.lat = Math.max(obj.lat, this._northEast.lat); - this._northEast.lng = Math.max(obj.lng, this._northEast.lng); - } - } else if (obj instanceof L.LatLngBounds) { - this.extend(obj._southWest); - this.extend(obj._northEast); - } - return this; - }, - - // extend the bounds by a percentage - pad: function (bufferRatio) { // (Number) -> LatLngBounds - var sw = this._southWest, - ne = this._northEast, - heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, - widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; - - return new L.LatLngBounds( - new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), - new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); - }, - - getCenter: function () { // -> LatLng - return new L.LatLng( - (this._southWest.lat + this._northEast.lat) / 2, - (this._southWest.lng + this._northEast.lng) / 2); - }, - - getSouthWest: function () { - return this._southWest; - }, - - getNorthEast: function () { - return this._northEast; - }, - - getNorthWest: function () { - return new L.LatLng(this.getNorth(), this.getWest()); - }, - - getSouthEast: function () { - return new L.LatLng(this.getSouth(), this.getEast()); - }, - - getWest: function () { - return this._southWest.lng; - }, - - getSouth: function () { - return this._southWest.lat; - }, - - getEast: function () { - return this._northEast.lng; - }, - - getNorth: function () { - return this._northEast.lat; - }, - - contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean - if (typeof obj[0] === 'number' || obj instanceof L.LatLng) { - obj = L.latLng(obj); - } else { - obj = L.latLngBounds(obj); - } - - var sw = this._southWest, - ne = this._northEast, - sw2, ne2; - - if (obj instanceof L.LatLngBounds) { - sw2 = obj.getSouthWest(); - ne2 = obj.getNorthEast(); - } else { - sw2 = ne2 = obj; - } - - return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && - (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); - }, - - intersects: function (bounds) { // (LatLngBounds) - bounds = L.latLngBounds(bounds); - - var sw = this._southWest, - ne = this._northEast, - sw2 = bounds.getSouthWest(), - ne2 = bounds.getNorthEast(), - - latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), - lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); - - return latIntersects && lngIntersects; - }, - - toBBoxString: function () { - return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); - }, - - equals: function (bounds) { // (LatLngBounds) - if (!bounds) { return false; } - - bounds = L.latLngBounds(bounds); - - return this._southWest.equals(bounds.getSouthWest()) && - this._northEast.equals(bounds.getNorthEast()); - }, - - isValid: function () { - return !!(this._southWest && this._northEast); - } -}; - -//TODO International date line? - -L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) - if (!a || a instanceof L.LatLngBounds) { - return a; - } - return new L.LatLngBounds(a, b); -}; - - -/* - * L.Projection contains various geographical projections used by CRS classes. - */ - -L.Projection = {}; - - -/* - * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default. - */ - -L.Projection.SphericalMercator = { - MAX_LATITUDE: 85.0511287798, - - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - x = latlng.lng * d, - y = lat * d; - - y = Math.log(Math.tan((Math.PI / 4) + (y / 2))); - - return new L.Point(x, y); - }, - - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - lng = point.x * d, - lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d; - - return new L.LatLng(lat, lng); - } -}; - - -/* - * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple. - */ - -L.Projection.LonLat = { - project: function (latlng) { - return new L.Point(latlng.lng, latlng.lat); - }, - - unproject: function (point) { - return new L.LatLng(point.y, point.x); - } -}; - - -/* - * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet. - */ - -L.CRS = { - latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point - var projectedPoint = this.projection.project(latlng), - scale = this.scale(zoom); - - return this.transformation._transform(projectedPoint, scale); - }, - - pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng - var scale = this.scale(zoom), - untransformedPoint = this.transformation.untransform(point, scale); - - return this.projection.unproject(untransformedPoint); - }, - - project: function (latlng) { - return this.projection.project(latlng); - }, - - scale: function (zoom) { - return 256 * Math.pow(2, zoom); - } -}; - - -/* - * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps. - */ - -L.CRS.Simple = L.extend({}, L.CRS, { - projection: L.Projection.LonLat, - transformation: new L.Transformation(1, 0, -1, 0), - - scale: function (zoom) { - return Math.pow(2, zoom); - } -}); - - -/* - * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping - * and is used by Leaflet by default. - */ - -L.CRS.EPSG3857 = L.extend({}, L.CRS, { - code: 'EPSG:3857', - - projection: L.Projection.SphericalMercator, - transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5), - - project: function (latlng) { // (LatLng) -> Point - var projectedPoint = this.projection.project(latlng), - earthRadius = 6378137; - return projectedPoint.multiplyBy(earthRadius); - } -}); - -L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { - code: 'EPSG:900913' -}); - - -/* - * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists. - */ - -L.CRS.EPSG4326 = L.extend({}, L.CRS, { - code: 'EPSG:4326', - - projection: L.Projection.LonLat, - transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5) -}); - - -/* - * L.Map is the central class of the API - it is used to create a map. - */ - -L.Map = L.Class.extend({ - - includes: L.Mixin.Events, - - options: { - crs: L.CRS.EPSG3857, - - /* - center: LatLng, - zoom: Number, - layers: Array, - */ - - fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23, - trackResize: true, - markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d - }, - - initialize: function (id, options) { // (HTMLElement or String, Object) - options = L.setOptions(this, options); - - this._initContainer(id); - this._initLayout(); - this._initEvents(); - - if (options.maxBounds) { - this.setMaxBounds(options.maxBounds); - } - - if (options.center && options.zoom !== undefined) { - this.setView(L.latLng(options.center), options.zoom, {reset: true}); - } - - this._handlers = []; - - this._layers = {}; - this._zoomBoundLayers = {}; - this._tileLayersNum = 0; - - this.callInitHooks(); - - this._addLayers(options.layers); - }, - - - // public methods that modify map state - - // replaced by animation-powered implementation in Map.PanAnimation.js - setView: function (center, zoom) { - this._resetView(L.latLng(center), this._limitZoom(zoom)); - return this; - }, - - setZoom: function (zoom, options) { - return this.setView(this.getCenter(), zoom, {zoom: options}); - }, - - zoomIn: function (delta, options) { - return this.setZoom(this._zoom + (delta || 1), options); - }, - - zoomOut: function (delta, options) { - return this.setZoom(this._zoom - (delta || 1), options); - }, - - setZoomAround: function (latlng, zoom, options) { - var scale = this.getZoomScale(zoom), - viewHalf = this.getSize().divideBy(2), - containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng), - - centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale), - newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); - - return this.setView(newCenter, zoom, {zoom: options}); - }, - - fitBounds: function (bounds, options) { - - options = options || {}; - bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds); - - var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]), - paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]), - - zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)), - paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), - - swPoint = this.project(bounds.getSouthWest(), zoom), - nePoint = this.project(bounds.getNorthEast(), zoom), - center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); - - return this.setView(center, zoom, options); - }, - - fitWorld: function (options) { - return this.fitBounds([[-90, -180], [90, 180]], options); - }, - - panTo: function (center, options) { // (LatLng) - return this.setView(center, this._zoom, {pan: options}); - }, - - panBy: function (offset) { // (Point) - // replaced with animated panBy in Map.Animation.js - this.fire('movestart'); - - this._rawPanBy(L.point(offset)); - - this.fire('move'); - return this.fire('moveend'); - }, - - setMaxBounds: function (bounds, options) { - bounds = L.latLngBounds(bounds); - - this.options.maxBounds = bounds; - - if (!bounds) { - this._boundsMinZoom = null; - this.off('moveend', this._panInsideMaxBounds, this); - return this; - } - - var minZoom = this.getBoundsZoom(bounds, true); - - this._boundsMinZoom = minZoom; - - if (this._loaded) { - if (this._zoom < minZoom) { - this.setView(bounds.getCenter(), minZoom, options); - } else { - this.panInsideBounds(bounds); - } - } - - this.on('moveend', this._panInsideMaxBounds, this); - - return this; - }, - - panInsideBounds: function (bounds) { - bounds = L.latLngBounds(bounds); - - var viewBounds = this.getPixelBounds(), - viewSw = viewBounds.getBottomLeft(), - viewNe = viewBounds.getTopRight(), - sw = this.project(bounds.getSouthWest()), - ne = this.project(bounds.getNorthEast()), - dx = 0, - dy = 0; - - if (viewNe.y < ne.y) { // north - dy = Math.ceil(ne.y - viewNe.y); - } - if (viewNe.x > ne.x) { // east - dx = Math.floor(ne.x - viewNe.x); - } - if (viewSw.y > sw.y) { // south - dy = Math.floor(sw.y - viewSw.y); - } - if (viewSw.x < sw.x) { // west - dx = Math.ceil(sw.x - viewSw.x); - } - - if (dx || dy) { - return this.panBy([dx, dy]); - } - - return this; - }, - - addLayer: function (layer) { - // TODO method is too big, refactor - - var id = L.stamp(layer); - - if (this._layers[id]) { return this; } - - this._layers[id] = layer; - - // TODO getMaxZoom, getMinZoom in ILayer (instead of options) - if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) { - this._zoomBoundLayers[id] = layer; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor!!! - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum++; - this._tileLayersToLoad++; - layer.on('load', this._onTileLayerLoad, this); - } - - if (this._loaded) { - this._layerAdd(layer); - } - - return this; - }, - - removeLayer: function (layer) { - var id = L.stamp(layer); - - if (!this._layers[id]) { return; } - - if (this._loaded) { - layer.onRemove(this); - } - - delete this._layers[id]; - - if (this._loaded) { - this.fire('layerremove', {layer: layer}); - } - - if (this._zoomBoundLayers[id]) { - delete this._zoomBoundLayers[id]; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum--; - this._tileLayersToLoad--; - layer.off('load', this._onTileLayerLoad, this); - } - - return this; - }, - - hasLayer: function (layer) { - if (!layer) { return false; } - - return (L.stamp(layer) in this._layers); - }, - - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, - - invalidateSize: function (options) { - options = L.extend({ - animate: false, - pan: true - }, options === true ? {animate: true} : options); - - var oldSize = this.getSize(); - this._sizeChanged = true; - - if (this.options.maxBounds) { - this.setMaxBounds(this.options.maxBounds); - } - - if (!this._loaded) { return this; } - - var newSize = this.getSize(), - offset = oldSize.subtract(newSize).divideBy(2).round(); - - if (!offset.x && !offset.y) { return this; } - - if (options.animate && options.pan) { - this.panBy(offset); - - } else { - if (options.pan) { - this._rawPanBy(offset); - } - - this.fire('move'); - - // make sure moveend is not fired too often on resize - clearTimeout(this._sizeTimer); - this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); - } - - return this.fire('resize', { - oldSize: oldSize, - newSize: newSize - }); - }, - - // TODO handler.addTo - addHandler: function (name, HandlerClass) { - if (!HandlerClass) { return; } - - var handler = this[name] = new HandlerClass(this); - - this._handlers.push(handler); - - if (this.options[name]) { - handler.enable(); - } - - return this; - }, - - remove: function () { - if (this._loaded) { - this.fire('unload'); - } - - this._initEvents('off'); - - delete this._container._leaflet; - - this._clearPanes(); - if (this._clearControlPos) { - this._clearControlPos(); - } - - this._clearHandlers(); - - return this; - }, - - - // public methods for getting map state - - getCenter: function () { // (Boolean) -> LatLng - this._checkIfLoaded(); - - if (!this._moved()) { - return this._initialCenter; - } - return this.layerPointToLatLng(this._getCenterLayerPoint()); - }, - - getZoom: function () { - return this._zoom; - }, - - getBounds: function () { - var bounds = this.getPixelBounds(), - sw = this.unproject(bounds.getBottomLeft()), - ne = this.unproject(bounds.getTopRight()); - - return new L.LatLngBounds(sw, ne); - }, - - getMinZoom: function () { - var z1 = this._layersMinZoom === undefined ? 0 : this._layersMinZoom, - z2 = this._boundsMinZoom === undefined ? 0 : this._boundsMinZoom; - return this.options.minZoom === undefined ? Math.max(z1, z2) : this.options.minZoom; - }, - - getMaxZoom: function () { - return this.options.maxZoom === undefined ? - (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : - this.options.maxZoom; - }, - - getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number - bounds = L.latLngBounds(bounds); - - var zoom = this.getMinZoom() - (inside ? 1 : 0), - maxZoom = this.getMaxZoom(), - size = this.getSize(), - - nw = bounds.getNorthWest(), - se = bounds.getSouthEast(), - - zoomNotFound = true, - boundsSize; - - padding = L.point(padding || [0, 0]); - - do { - zoom++; - boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); - zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; - - } while (zoomNotFound && zoom <= maxZoom); - - if (zoomNotFound && inside) { - return null; - } - - return inside ? zoom : zoom - 1; - }, - - getSize: function () { - if (!this._size || this._sizeChanged) { - this._size = new L.Point( - this._container.clientWidth, - this._container.clientHeight); - - this._sizeChanged = false; - } - return this._size.clone(); - }, - - getPixelBounds: function () { - var topLeftPoint = this._getTopLeftPoint(); - return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); - }, - - getPixelOrigin: function () { - this._checkIfLoaded(); - return this._initialTopLeftPoint; - }, - - getPanes: function () { - return this._panes; - }, - - getContainer: function () { - return this._container; - }, - - - // TODO replace with universal implementation after refactoring projections - - getZoomScale: function (toZoom) { - var crs = this.options.crs; - return crs.scale(toZoom) / crs.scale(this._zoom); - }, - - getScaleZoom: function (scale) { - return this._zoom + (Math.log(scale) / Math.LN2); - }, - - - // conversion methods - - project: function (latlng, zoom) { // (LatLng[, Number]) -> Point - zoom = zoom === undefined ? this._zoom : zoom; - return this.options.crs.latLngToPoint(L.latLng(latlng), zoom); - }, - - unproject: function (point, zoom) { // (Point[, Number]) -> LatLng - zoom = zoom === undefined ? this._zoom : zoom; - return this.options.crs.pointToLatLng(L.point(point), zoom); - }, - - layerPointToLatLng: function (point) { // (Point) - var projectedPoint = L.point(point).add(this.getPixelOrigin()); - return this.unproject(projectedPoint); - }, - - latLngToLayerPoint: function (latlng) { // (LatLng) - var projectedPoint = this.project(L.latLng(latlng))._round(); - return projectedPoint._subtract(this.getPixelOrigin()); - }, - - containerPointToLayerPoint: function (point) { // (Point) - return L.point(point).subtract(this._getMapPanePos()); - }, - - layerPointToContainerPoint: function (point) { // (Point) - return L.point(point).add(this._getMapPanePos()); - }, - - containerPointToLatLng: function (point) { - var layerPoint = this.containerPointToLayerPoint(L.point(point)); - return this.layerPointToLatLng(layerPoint); - }, - - latLngToContainerPoint: function (latlng) { - return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng))); - }, - - mouseEventToContainerPoint: function (e) { // (MouseEvent) - return L.DomEvent.getMousePosition(e, this._container); - }, - - mouseEventToLayerPoint: function (e) { // (MouseEvent) - return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); - }, - - mouseEventToLatLng: function (e) { // (MouseEvent) - return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); - }, - - - // map initialization methods - - _initContainer: function (id) { - var container = this._container = L.DomUtil.get(id); - - if (!container) { - throw new Error('Map container not found.'); - } else if (container._leaflet) { - throw new Error('Map container is already initialized.'); - } - - container._leaflet = true; - }, - - _initLayout: function () { - var container = this._container; - - L.DomUtil.addClass(container, 'leaflet-container' + - (L.Browser.touch ? ' leaflet-touch' : '') + - (L.Browser.retina ? ' leaflet-retina' : '') + - (this.options.fadeAnimation ? ' leaflet-fade-anim' : '')); - - var position = L.DomUtil.getStyle(container, 'position'); - - if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { - container.style.position = 'relative'; - } - - this._initPanes(); - - if (this._initControlPos) { - this._initControlPos(); - } - }, - - _initPanes: function () { - var panes = this._panes = {}; - - this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container); - - this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane); - panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane); - panes.shadowPane = this._createPane('leaflet-shadow-pane'); - panes.overlayPane = this._createPane('leaflet-overlay-pane'); - panes.markerPane = this._createPane('leaflet-marker-pane'); - panes.popupPane = this._createPane('leaflet-popup-pane'); - - var zoomHide = ' leaflet-zoom-hide'; - - if (!this.options.markerZoomAnimation) { - L.DomUtil.addClass(panes.markerPane, zoomHide); - L.DomUtil.addClass(panes.shadowPane, zoomHide); - L.DomUtil.addClass(panes.popupPane, zoomHide); - } - }, - - _createPane: function (className, container) { - return L.DomUtil.create('div', className, container || this._panes.objectsPane); - }, - - _clearPanes: function () { - this._container.removeChild(this._mapPane); - }, - - _addLayers: function (layers) { - layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; - - for (var i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } - }, - - - // private methods that modify map state - - _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) { - - var zoomChanged = (this._zoom !== zoom); - - if (!afterZoomAnim) { - this.fire('movestart'); - - if (zoomChanged) { - this.fire('zoomstart'); - } - } - - this._zoom = zoom; - this._initialCenter = center; - - this._initialTopLeftPoint = this._getNewTopLeftPoint(center); - - if (!preserveMapOffset) { - L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); - } else { - this._initialTopLeftPoint._add(this._getMapPanePos()); - } - - this._tileLayersToLoad = this._tileLayersNum; - - var loading = !this._loaded; - this._loaded = true; - - if (loading) { - this.fire('load'); - this.eachLayer(this._layerAdd, this); - } - - this.fire('viewreset', {hard: !preserveMapOffset}); - - this.fire('move'); - - if (zoomChanged || afterZoomAnim) { - this.fire('zoomend'); - } - - this.fire('moveend', {hard: !preserveMapOffset}); - }, - - _rawPanBy: function (offset) { - L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); - }, - - _getZoomSpan: function () { - return this.getMaxZoom() - this.getMinZoom(); - }, - - _updateZoomLevels: function () { - var i, - minZoom = Infinity, - maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(); - - for (i in this._zoomBoundLayers) { - var layer = this._zoomBoundLayers[i]; - if (!isNaN(layer.options.minZoom)) { - minZoom = Math.min(minZoom, layer.options.minZoom); - } - if (!isNaN(layer.options.maxZoom)) { - maxZoom = Math.max(maxZoom, layer.options.maxZoom); - } - } - - if (i === undefined) { // we have no tilelayers - this._layersMaxZoom = this._layersMinZoom = undefined; - } else { - this._layersMaxZoom = maxZoom; - this._layersMinZoom = minZoom; - } - - if (oldZoomSpan !== this._getZoomSpan()) { - this.fire('zoomlevelschange'); - } - }, - - _panInsideMaxBounds: function () { - this.panInsideBounds(this.options.maxBounds); - }, - - _checkIfLoaded: function () { - if (!this._loaded) { - throw new Error('Set map center and zoom first.'); - } - }, - - // map events - - _initEvents: function (onOff) { - if (!L.DomEvent) { return; } - - onOff = onOff || 'on'; - - L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this); - - var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter', - 'mouseleave', 'mousemove', 'contextmenu'], - i, len; - - for (i = 0, len = events.length; i < len; i++) { - L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this); - } - - if (this.options.trackResize) { - L.DomEvent[onOff](window, 'resize', this._onResize, this); - } - }, - - _onResize: function () { - L.Util.cancelAnimFrame(this._resizeRequest); - this._resizeRequest = L.Util.requestAnimFrame( - this.invalidateSize, this, false, this._container); - }, - - _onMouseClick: function (e) { - if (!this._loaded || (!e._simulated && this.dragging && this.dragging.moved()) || - L.DomEvent._skipped(e)) { return; } - - this.fire('preclick'); - this._fireMouseEvent(e); - }, - - _fireMouseEvent: function (e) { - if (!this._loaded || L.DomEvent._skipped(e)) { return; } - - var type = e.type; - - type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type)); - - if (!this.hasEventListeners(type)) { return; } - - if (type === 'contextmenu') { - L.DomEvent.preventDefault(e); - } - - var containerPoint = this.mouseEventToContainerPoint(e), - layerPoint = this.containerPointToLayerPoint(containerPoint), - latlng = this.layerPointToLatLng(layerPoint); - - this.fire(type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, - originalEvent: e - }); - }, - - _onTileLayerLoad: function () { - this._tileLayersToLoad--; - if (this._tileLayersNum && !this._tileLayersToLoad) { - this.fire('tilelayersload'); - } - }, - - _clearHandlers: function () { - for (var i = 0, len = this._handlers.length; i < len; i++) { - this._handlers[i].disable(); - } - }, - - whenReady: function (callback, context) { - if (this._loaded) { - callback.call(context || this, this); - } else { - this.on('load', callback, context); - } - return this; - }, - - _layerAdd: function (layer) { - layer.onAdd(this); - this.fire('layeradd', {layer: layer}); - }, - - - // private methods for getting map state - - _getMapPanePos: function () { - return L.DomUtil.getPosition(this._mapPane); - }, - - _moved: function () { - var pos = this._getMapPanePos(); - return pos && !pos.equals([0, 0]); - }, - - _getTopLeftPoint: function () { - return this.getPixelOrigin().subtract(this._getMapPanePos()); - }, - - _getNewTopLeftPoint: function (center, zoom) { - var viewHalf = this.getSize()._divideBy(2); - // TODO round on display, not calculation to increase precision? - return this.project(center, zoom)._subtract(viewHalf)._round(); - }, - - _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) { - var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos()); - return this.project(latlng, newZoom)._subtract(topLeft); - }, - - // layer point of the current center - _getCenterLayerPoint: function () { - return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); - }, - - // offset of the specified place to the current center in pixels - _getCenterOffset: function (latlng) { - return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); - }, - - _limitZoom: function (zoom) { - var min = this.getMinZoom(), - max = this.getMaxZoom(); - - return Math.max(min, Math.min(max, zoom)); - } -}); - -L.map = function (id, options) { - return new L.Map(id, options); -}; - - -/* - * Mercator projection that takes into account that the Earth is not a perfect sphere. - * Less popular than spherical mercator; used by projections like EPSG:3395. - */ - -L.Projection.Mercator = { - MAX_LATITUDE: 85.0840591556, - - R_MINOR: 6356752.314245179, - R_MAJOR: 6378137, - - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - r = this.R_MAJOR, - r2 = this.R_MINOR, - x = latlng.lng * d * r, - y = lat * d, - tmp = r2 / r, - eccent = Math.sqrt(1.0 - tmp * tmp), - con = eccent * Math.sin(y); - - con = Math.pow((1 - con) / (1 + con), eccent * 0.5); - - var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con; - y = -r * Math.log(ts); - - return new L.Point(x, y); - }, - - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - r = this.R_MAJOR, - r2 = this.R_MINOR, - lng = point.x * d / r, - tmp = r2 / r, - eccent = Math.sqrt(1 - (tmp * tmp)), - ts = Math.exp(- point.y / r), - phi = (Math.PI / 2) - 2 * Math.atan(ts), - numIter = 15, - tol = 1e-7, - i = numIter, - dphi = 0.1, - con; - - while ((Math.abs(dphi) > tol) && (--i > 0)) { - con = eccent * Math.sin(phi); - dphi = (Math.PI / 2) - 2 * Math.atan(ts * - Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi; - phi += dphi; - } - - return new L.LatLng(phi * d, lng); - } -}; - - - -L.CRS.EPSG3395 = L.extend({}, L.CRS, { - code: 'EPSG:3395', - - projection: L.Projection.Mercator, - - transformation: (function () { - var m = L.Projection.Mercator, - r = m.R_MAJOR, - r2 = m.R_MINOR; - - return new L.Transformation(0.5 / (Math.PI * r), 0.5, -0.5 / (Math.PI * r2), 0.5); - }()) -}); - - -/* - * L.TileLayer is used for standard xyz-numbered tile layers. - */ - -L.TileLayer = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - minZoom: 0, - maxZoom: 18, - tileSize: 256, - subdomains: 'abc', - errorTileUrl: '', - attribution: '', - zoomOffset: 0, - opacity: 1, - /* (undefined works too) - zIndex: null, - tms: false, - continuousWorld: false, - noWrap: false, - zoomReverse: false, - detectRetina: false, - reuseTiles: false, - bounds: false, - */ - unloadInvisibleTiles: L.Browser.mobile, - updateWhenIdle: L.Browser.mobile - }, - - initialize: function (url, options) { - options = L.setOptions(this, options); - - // detecting retina displays, adjusting tileSize and zoom levels - if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { - - options.tileSize = Math.floor(options.tileSize / 2); - options.zoomOffset++; - - if (options.minZoom > 0) { - options.minZoom--; - } - this.options.maxZoom--; - } - - if (options.bounds) { - options.bounds = L.latLngBounds(options.bounds); - } - - this._url = url; - - var subdomains = this.options.subdomains; - - if (typeof subdomains === 'string') { - this.options.subdomains = subdomains.split(''); - } - }, - - onAdd: function (map) { - this._map = map; - this._animated = map._zoomAnimated; - - // create a container div for tiles - this._initContainer(); - - // create an image to clone for tiles - this._createTileProto(); - - // set up events - map.on({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.on({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); - map.on('move', this._limitedUpdate, this); - } - - this._reset(); - this._update(); - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - this._container.parentNode.removeChild(this._container); - - map.off({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.off({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - map.off('move', this._limitedUpdate, this); - } - - this._container = null; - this._map = null; - }, - - bringToFront: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.appendChild(this._container); - this._setAutoZIndex(pane, Math.max); - } - - return this; - }, - - bringToBack: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.insertBefore(this._container, pane.firstChild); - this._setAutoZIndex(pane, Math.min); - } - - return this; - }, - - getAttribution: function () { - return this.options.attribution; - }, - - getContainer: function () { - return this._container; - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - - if (this._map) { - this._updateOpacity(); - } - - return this; - }, - - setZIndex: function (zIndex) { - this.options.zIndex = zIndex; - this._updateZIndex(); - - return this; - }, - - setUrl: function (url, noRedraw) { - this._url = url; - - if (!noRedraw) { - this.redraw(); - } - - return this; - }, - - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } - return this; - }, - - _updateZIndex: function () { - if (this._container && this.options.zIndex !== undefined) { - this._container.style.zIndex = this.options.zIndex; - } - }, - - _setAutoZIndex: function (pane, compare) { - - var layers = pane.children, - edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min - zIndex, i, len; - - for (i = 0, len = layers.length; i < len; i++) { - - if (layers[i] !== this._container) { - zIndex = parseInt(layers[i].style.zIndex, 10); - - if (!isNaN(zIndex)) { - edgeZIndex = compare(edgeZIndex, zIndex); - } - } - } - - this.options.zIndex = this._container.style.zIndex = - (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); - }, - - _updateOpacity: function () { - var i, - tiles = this._tiles; - - if (L.Browser.ielt9) { - for (i in tiles) { - L.DomUtil.setOpacity(tiles[i], this.options.opacity); - } - } else { - L.DomUtil.setOpacity(this._container, this.options.opacity); - } - }, - - _initContainer: function () { - var tilePane = this._map._panes.tilePane; - - if (!this._container) { - this._container = L.DomUtil.create('div', 'leaflet-layer'); - - this._updateZIndex(); - - if (this._animated) { - var className = 'leaflet-tile-container leaflet-zoom-animated'; - - this._bgBuffer = L.DomUtil.create('div', className, this._container); - this._tileContainer = L.DomUtil.create('div', className, this._container); - - } else { - this._tileContainer = this._container; - } - - tilePane.appendChild(this._container); - - if (this.options.opacity < 1) { - this._updateOpacity(); - } - } - }, - - _reset: function (e) { - for (var key in this._tiles) { - this.fire('tileunload', {tile: this._tiles[key]}); - } - - this._tiles = {}; - this._tilesToLoad = 0; - - if (this.options.reuseTiles) { - this._unusedTiles = []; - } - - this._tileContainer.innerHTML = ''; - - if (this._animated && e && e.hard) { - this._clearBgBuffer(); - } - - this._initContainer(); - }, - - _update: function () { - - if (!this._map) { return; } - - var bounds = this._map.getPixelBounds(), - zoom = this._map.getZoom(), - tileSize = this.options.tileSize; - - if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { - return; - } - - var tileBounds = L.bounds( - bounds.min.divideBy(tileSize)._floor(), - bounds.max.divideBy(tileSize)._floor()); - - this._addTilesFromCenterOut(tileBounds); - - if (this.options.unloadInvisibleTiles || this.options.reuseTiles) { - this._removeOtherTiles(tileBounds); - } - }, - - _addTilesFromCenterOut: function (bounds) { - var queue = [], - center = bounds.getCenter(); - - var j, i, point; - - for (j = bounds.min.y; j <= bounds.max.y; j++) { - for (i = bounds.min.x; i <= bounds.max.x; i++) { - point = new L.Point(i, j); - - if (this._tileShouldBeLoaded(point)) { - queue.push(point); - } - } - } - - var tilesToLoad = queue.length; - - if (tilesToLoad === 0) { return; } - - // load tiles in order of their distance to center - queue.sort(function (a, b) { - return a.distanceTo(center) - b.distanceTo(center); - }); - - var fragment = document.createDocumentFragment(); - - // if its the first batch of tiles to load - if (!this._tilesToLoad) { - this.fire('loading'); - } - - this._tilesToLoad += tilesToLoad; - - for (i = 0; i < tilesToLoad; i++) { - this._addTile(queue[i], fragment); - } - - this._tileContainer.appendChild(fragment); - }, - - _tileShouldBeLoaded: function (tilePoint) { - if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) { - return false; // already loaded - } - - var options = this.options; - - if (!options.continuousWorld) { - var limit = this._getWrapTileNum(); - - // don't load if exceeds world bounds - if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit)) || - tilePoint.y < 0 || tilePoint.y >= limit) { return false; } - } - - if (options.bounds) { - var tileSize = options.tileSize, - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - nw = this._map.unproject(nwPoint), - se = this._map.unproject(sePoint); - - // TODO temporary hack, will be removed after refactoring projections - // https://github.com/Leaflet/Leaflet/issues/1618 - if (!options.continuousWorld && !options.noWrap) { - nw = nw.wrap(); - se = se.wrap(); - } - - if (!options.bounds.intersects([nw, se])) { return false; } - } - - return true; - }, - - _removeOtherTiles: function (bounds) { - var kArr, x, y, key; - - for (key in this._tiles) { - kArr = key.split(':'); - x = parseInt(kArr[0], 10); - y = parseInt(kArr[1], 10); - - // remove tile if it's out of bounds - if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) { - this._removeTile(key); - } - } - }, - - _removeTile: function (key) { - var tile = this._tiles[key]; - - this.fire('tileunload', {tile: tile, url: tile.src}); - - if (this.options.reuseTiles) { - L.DomUtil.removeClass(tile, 'leaflet-tile-loaded'); - this._unusedTiles.push(tile); - - } else if (tile.parentNode === this._tileContainer) { - this._tileContainer.removeChild(tile); - } - - // for https://github.com/CloudMade/Leaflet/issues/137 - if (!L.Browser.android) { - tile.onload = null; - tile.src = L.Util.emptyImageUrl; - } - - delete this._tiles[key]; - }, - - _addTile: function (tilePoint, container) { - var tilePos = this._getTilePos(tilePoint); - - // get unused tile - or create a new tile - var tile = this._getTile(); - - /* - Chrome 20 layouts much faster with top/left (verify with timeline, frames) - Android 4 browser has display issues with top/left and requires transform instead - Android 2 browser requires top/left or tiles disappear on load or first drag - (reappear after zoom) https://github.com/CloudMade/Leaflet/issues/866 - (other browsers don't currently care) - see debug/hacks/jitter.html for an example - */ - L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome || L.Browser.android23); - - this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; - - this._loadTile(tile, tilePoint); - - if (tile.parentNode !== this._tileContainer) { - container.appendChild(tile); - } - }, - - _getZoomForUrl: function () { - - var options = this.options, - zoom = this._map.getZoom(); - - if (options.zoomReverse) { - zoom = options.maxZoom - zoom; - } - - return zoom + options.zoomOffset; - }, - - _getTilePos: function (tilePoint) { - var origin = this._map.getPixelOrigin(), - tileSize = this.options.tileSize; - - return tilePoint.multiplyBy(tileSize).subtract(origin); - }, - - // image-specific code (override to implement e.g. Canvas or SVG tile layer) - - getTileUrl: function (tilePoint) { - return L.Util.template(this._url, L.extend({ - s: this._getSubdomain(tilePoint), - z: tilePoint.z, - x: tilePoint.x, - y: tilePoint.y - }, this.options)); - }, - - _getWrapTileNum: function () { - // TODO refactor, limit is not valid for non-standard projections - return Math.pow(2, this._getZoomForUrl()); - }, - - _adjustTilePoint: function (tilePoint) { - - var limit = this._getWrapTileNum(); - - // wrap tile coordinates - if (!this.options.continuousWorld && !this.options.noWrap) { - tilePoint.x = ((tilePoint.x % limit) + limit) % limit; - } - - if (this.options.tms) { - tilePoint.y = limit - tilePoint.y - 1; - } - - tilePoint.z = this._getZoomForUrl(); - }, - - _getSubdomain: function (tilePoint) { - var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; - return this.options.subdomains[index]; - }, - - _createTileProto: function () { - var img = this._tileImg = L.DomUtil.create('img', 'leaflet-tile'); - img.style.width = img.style.height = this.options.tileSize + 'px'; - img.galleryimg = 'no'; - }, - - _getTile: function () { - if (this.options.reuseTiles && this._unusedTiles.length > 0) { - var tile = this._unusedTiles.pop(); - this._resetTile(tile); - return tile; - } - return this._createTile(); - }, - - // Override if data stored on a tile needs to be cleaned up before reuse - _resetTile: function (/*tile*/) {}, - - _createTile: function () { - var tile = this._tileImg.cloneNode(false); - tile.onselectstart = tile.onmousemove = L.Util.falseFn; - - if (L.Browser.ielt9 && this.options.opacity !== undefined) { - L.DomUtil.setOpacity(tile, this.options.opacity); - } - return tile; - }, - - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile.onload = this._tileOnLoad; - tile.onerror = this._tileOnError; - - this._adjustTilePoint(tilePoint); - tile.src = this.getTileUrl(tilePoint); - }, - - _tileLoaded: function () { - this._tilesToLoad--; - if (!this._tilesToLoad) { - this.fire('load'); - - if (this._animated) { - // clear scaled tiles after all new tiles are loaded (for performance) - clearTimeout(this._clearBgBufferTimer); - this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); - } - } - }, - - _tileOnLoad: function () { - var layer = this._layer; - - //Only if we are loading an actual image - if (this.src !== L.Util.emptyImageUrl) { - L.DomUtil.addClass(this, 'leaflet-tile-loaded'); - - layer.fire('tileload', { - tile: this, - url: this.src - }); - } - - layer._tileLoaded(); - }, - - _tileOnError: function () { - var layer = this._layer; - - layer.fire('tileerror', { - tile: this, - url: this.src - }); - - var newUrl = layer.options.errorTileUrl; - if (newUrl) { - this.src = newUrl; - } - - layer._tileLoaded(); - } -}); - -L.tileLayer = function (url, options) { - return new L.TileLayer(url, options); -}; - - -/* - * L.TileLayer.WMS is used for putting WMS tile layers on the map. - */ - -L.TileLayer.WMS = L.TileLayer.extend({ - - defaultWmsParams: { - service: 'WMS', - request: 'GetMap', - version: '1.1.1', - layers: '', - styles: '', - format: 'image/jpeg', - transparent: false - }, - - initialize: function (url, options) { // (String, Object) - - this._url = url; - - var wmsParams = L.extend({}, this.defaultWmsParams), - tileSize = options.tileSize || this.options.tileSize; - - if (options.detectRetina && L.Browser.retina) { - wmsParams.width = wmsParams.height = tileSize * 2; - } else { - wmsParams.width = wmsParams.height = tileSize; - } - - for (var i in options) { - // all keys that are not TileLayer options go to WMS params - if (!this.options.hasOwnProperty(i) && i !== 'crs') { - wmsParams[i] = options[i]; - } - } - - this.wmsParams = wmsParams; - - L.setOptions(this, options); - }, - - onAdd: function (map) { - - this._crs = this.options.crs || map.options.crs; - - var projectionKey = parseFloat(this.wmsParams.version) >= 1.3 ? 'crs' : 'srs'; - this.wmsParams[projectionKey] = this._crs.code; - - L.TileLayer.prototype.onAdd.call(this, map); - }, - - getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String - - var map = this._map, - tileSize = this.options.tileSize, - - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - - nw = this._crs.project(map.unproject(nwPoint, zoom)), - se = this._crs.project(map.unproject(sePoint, zoom)), - - bbox = [nw.x, se.y, se.x, nw.y].join(','), - - url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)}); - - return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox; - }, - - setParams: function (params, noRedraw) { - - L.extend(this.wmsParams, params); - - if (!noRedraw) { - this.redraw(); - } - - return this; - } -}); - -L.tileLayer.wms = function (url, options) { - return new L.TileLayer.WMS(url, options); -}; - - -/* - * L.TileLayer.Canvas is a class that you can use as a base for creating - * dynamically drawn Canvas-based tile layers. - */ - -L.TileLayer.Canvas = L.TileLayer.extend({ - options: { - async: false - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } - - for (var i in this._tiles) { - this._redrawTile(this._tiles[i]); - } - return this; - }, - - _redrawTile: function (tile) { - this.drawTile(tile, tile._tilePoint, this._map._zoom); - }, - - _createTileProto: function () { - var proto = this._canvasProto = L.DomUtil.create('canvas', 'leaflet-tile'); - proto.width = proto.height = this.options.tileSize; - }, - - _createTile: function () { - var tile = this._canvasProto.cloneNode(false); - tile.onselectstart = tile.onmousemove = L.Util.falseFn; - return tile; - }, - - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile._tilePoint = tilePoint; - - this._redrawTile(tile); - - if (!this.options.async) { - this.tileDrawn(tile); - } - }, - - drawTile: function (/*tile, tilePoint*/) { - // override with rendering code - }, - - tileDrawn: function (tile) { - this._tileOnLoad.call(tile); - } -}); - - -L.tileLayer.canvas = function (options) { - return new L.TileLayer.Canvas(options); -}; - - -/* - * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds). - */ - -L.ImageOverlay = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - opacity: 1 - }, - - initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) - this._url = url; - this._bounds = L.latLngBounds(bounds); - - L.setOptions(this, options); - }, - - onAdd: function (map) { - this._map = map; - - if (!this._image) { - this._initImage(); - } - - map._panes.overlayPane.appendChild(this._image); - - map.on('viewreset', this._reset, this); - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - - this._reset(); - }, - - onRemove: function (map) { - map.getPanes().overlayPane.removeChild(this._image); - - map.off('viewreset', this._reset, this); - - if (map.options.zoomAnimation) { - map.off('zoomanim', this._animateZoom, this); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - this._updateOpacity(); - return this; - }, - - // TODO remove bringToFront/bringToBack duplication from TileLayer/Path - bringToFront: function () { - if (this._image) { - this._map._panes.overlayPane.appendChild(this._image); - } - return this; - }, - - bringToBack: function () { - var pane = this._map._panes.overlayPane; - if (this._image) { - pane.insertBefore(this._image, pane.firstChild); - } - return this; - }, - - _initImage: function () { - this._image = L.DomUtil.create('img', 'leaflet-image-layer'); - - if (this._map.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._image, 'leaflet-zoom-animated'); - } else { - L.DomUtil.addClass(this._image, 'leaflet-zoom-hide'); - } - - this._updateOpacity(); - - //TODO createImage util method to remove duplication - L.extend(this._image, { - galleryimg: 'no', - onselectstart: L.Util.falseFn, - onmousemove: L.Util.falseFn, - onload: L.bind(this._onImageLoad, this), - src: this._url - }); - }, - - _animateZoom: function (e) { - var map = this._map, - image = this._image, - scale = map.getZoomScale(e.zoom), - nw = this._bounds.getNorthWest(), - se = this._bounds.getSouthEast(), - - topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center), - size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft), - origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale))); - - image.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; - }, - - _reset: function () { - var image = this._image, - topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()), - size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft); - - L.DomUtil.setPosition(image, topLeft); - - image.style.width = size.x + 'px'; - image.style.height = size.y + 'px'; - }, - - _onImageLoad: function () { - this.fire('load'); - }, - - _updateOpacity: function () { - L.DomUtil.setOpacity(this._image, this.options.opacity); - } -}); - -L.imageOverlay = function (url, bounds, options) { - return new L.ImageOverlay(url, bounds, options); -}; - - -/* - * L.Icon is an image-based icon class that you can use with L.Marker for custom markers. - */ - -L.Icon = L.Class.extend({ - options: { - /* - iconUrl: (String) (required) - iconRetinaUrl: (String) (optional, used for retina devices if detected) - iconSize: (Point) (can be set through CSS) - iconAnchor: (Point) (centered by default, can be set in CSS with negative margins) - popupAnchor: (Point) (if not specified, popup opens in the anchor point) - shadowUrl: (String) (no shadow by default) - shadowRetinaUrl: (String) (optional, used for retina devices if detected) - shadowSize: (Point) - shadowAnchor: (Point) - */ - className: '' - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - createIcon: function (oldIcon) { - return this._createIcon('icon', oldIcon); - }, - - createShadow: function (oldIcon) { - return this._createIcon('shadow', oldIcon); - }, - - _createIcon: function (name, oldIcon) { - var src = this._getIconUrl(name); - - if (!src) { - if (name === 'icon') { - throw new Error('iconUrl not set in Icon options (see the docs).'); - } - return null; - } - - var img; - if (!oldIcon || oldIcon.tagName !== 'IMG') { - img = this._createImg(src); - } else { - img = this._createImg(src, oldIcon); - } - this._setIconStyles(img, name); - - return img; - }, - - _setIconStyles: function (img, name) { - var options = this.options, - size = L.point(options[name + 'Size']), - anchor; - - if (name === 'shadow') { - anchor = L.point(options.shadowAnchor || options.iconAnchor); - } else { - anchor = L.point(options.iconAnchor); - } - - if (!anchor && size) { - anchor = size.divideBy(2, true); - } - - img.className = 'leaflet-marker-' + name + ' ' + options.className; - - if (anchor) { - img.style.marginLeft = (-anchor.x) + 'px'; - img.style.marginTop = (-anchor.y) + 'px'; - } - - if (size) { - img.style.width = size.x + 'px'; - img.style.height = size.y + 'px'; - } - }, - - _createImg: function (src, el) { - - if (!L.Browser.ie6) { - if (!el) { - el = document.createElement('img'); - } - el.src = src; - } else { - if (!el) { - el = document.createElement('div'); - } - el.style.filter = - 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")'; - } - return el; - }, - - _getIconUrl: function (name) { - if (L.Browser.retina && this.options[name + 'RetinaUrl']) { - return this.options[name + 'RetinaUrl']; - } - return this.options[name + 'Url']; - } -}); - -L.icon = function (options) { - return new L.Icon(options); -}; - - -/* - * L.Icon.Default is the blue marker icon used by default in Leaflet. - */ - -L.Icon.Default = L.Icon.extend({ - - options: { - iconSize: [25, 41], - iconAnchor: [12, 41], - popupAnchor: [1, -34], - - shadowSize: [41, 41] - }, - - _getIconUrl: function (name) { - var key = name + 'Url'; - - if (this.options[key]) { - return this.options[key]; - } - - if (L.Browser.retina && name === 'icon') { - name += '-2x'; - } - - var path = L.Icon.Default.imagePath; - - if (!path) { - throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.'); - } - - return path + '/marker-' + name + '.png'; - } -}); - -L.Icon.Default.imagePath = (function () { - var scripts = document.getElementsByTagName('script'), - leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/; - - var i, len, src, matches, path; - - for (i = 0, len = scripts.length; i < len; i++) { - src = scripts[i].src; - matches = src.match(leafletRe); - - if (matches) { - path = src.split(leafletRe)[0]; - return (path ? path + '/' : '') + 'images'; - } - } -}()); - - -/* - * L.Marker is used to display clickable/draggable icons on the map. - */ - -L.Marker = L.Class.extend({ - - includes: L.Mixin.Events, - - options: { - icon: new L.Icon.Default(), - title: '', - clickable: true, - draggable: false, - keyboard: true, - zIndexOffset: 0, - opacity: 1, - riseOnHover: false, - riseOffset: 250 - }, - - initialize: function (latlng, options) { - L.setOptions(this, options); - this._latlng = L.latLng(latlng); - }, - - onAdd: function (map) { - this._map = map; - - map.on('viewreset', this.update, this); - - this._initIcon(); - this.update(); - - if (map.options.zoomAnimation && map.options.markerZoomAnimation) { - map.on('zoomanim', this._animateZoom, this); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - if (this.dragging) { - this.dragging.disable(); - } - - this._removeIcon(); - this._removeShadow(); - - this.fire('remove'); - - map.off({ - 'viewreset': this.update, - 'zoomanim': this._animateZoom - }, this); - - this._map = null; - }, - - getLatLng: function () { - return this._latlng; - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - - this.update(); - - return this.fire('move', { latlng: this._latlng }); - }, - - setZIndexOffset: function (offset) { - this.options.zIndexOffset = offset; - this.update(); - - return this; - }, - - setIcon: function (icon) { - - this.options.icon = icon; - - if (this._map) { - this._initIcon(); - this.update(); - } - - return this; - }, - - update: function () { - if (this._icon) { - var pos = this._map.latLngToLayerPoint(this._latlng).round(); - this._setPos(pos); - } - - return this; - }, - - _initIcon: function () { - var options = this.options, - map = this._map, - animation = (map.options.zoomAnimation && map.options.markerZoomAnimation), - classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide'; - - var icon = options.icon.createIcon(this._icon), - addIcon = false; - - // if we're not reusing the icon, remove the old one and init new one - if (icon !== this._icon) { - if (this._icon) { - this._removeIcon(); - } - addIcon = true; - - if (options.title) { - icon.title = options.title; - } - } - - L.DomUtil.addClass(icon, classToAdd); - - if (options.keyboard) { - icon.tabIndex = '0'; - } - - this._icon = icon; - - this._initInteraction(); - - if (options.riseOnHover) { - L.DomEvent - .on(icon, 'mouseover', this._bringToFront, this) - .on(icon, 'mouseout', this._resetZIndex, this); - } - - var newShadow = options.icon.createShadow(this._shadow), - addShadow = false; - - if (newShadow !== this._shadow) { - this._removeShadow(); - addShadow = true; - } - - if (newShadow) { - L.DomUtil.addClass(newShadow, classToAdd); - } - this._shadow = newShadow; - - - if (options.opacity < 1) { - this._updateOpacity(); - } - - - var panes = this._map._panes; - - if (addIcon) { - panes.markerPane.appendChild(this._icon); - } - - if (newShadow && addShadow) { - panes.shadowPane.appendChild(this._shadow); - } - }, - - _removeIcon: function () { - if (this.options.riseOnHover) { - L.DomEvent - .off(this._icon, 'mouseover', this._bringToFront) - .off(this._icon, 'mouseout', this._resetZIndex); - } - - this._map._panes.markerPane.removeChild(this._icon); - - this._icon = null; - }, - - _removeShadow: function () { - if (this._shadow) { - this._map._panes.shadowPane.removeChild(this._shadow); - } - this._shadow = null; - }, - - _setPos: function (pos) { - L.DomUtil.setPosition(this._icon, pos); - - if (this._shadow) { - L.DomUtil.setPosition(this._shadow, pos); - } - - this._zIndex = pos.y + this.options.zIndexOffset; - - this._resetZIndex(); - }, - - _updateZIndex: function (offset) { - this._icon.style.zIndex = this._zIndex + offset; - }, - - _animateZoom: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); - - this._setPos(pos); - }, - - _initInteraction: function () { - - if (!this.options.clickable) { return; } - - // TODO refactor into something shared with Map/Path/etc. to DRY it up - - var icon = this._icon, - events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; - - L.DomUtil.addClass(icon, 'leaflet-clickable'); - L.DomEvent.on(icon, 'click', this._onMouseClick, this); - L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); - - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); - } - - if (L.Handler.MarkerDrag) { - this.dragging = new L.Handler.MarkerDrag(this); - - if (this.options.draggable) { - this.dragging.enable(); - } - } - }, - - _onMouseClick: function (e) { - var wasDragged = this.dragging && this.dragging.moved(); - - if (this.hasEventListeners(e.type) || wasDragged) { - L.DomEvent.stopPropagation(e); - } - - if (wasDragged) { return; } - - if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; } - - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng - }); - }, - - _onKeyPress: function (e) { - if (e.keyCode === 13) { - this.fire('click', { - originalEvent: e, - latlng: this._latlng - }); - } - }, - - _fireMouseEvent: function (e) { - - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng - }); - - // TODO proper custom event propagation - // this line will always be called if marker is in a FeatureGroup - if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) { - L.DomEvent.preventDefault(e); - } - if (e.type !== 'mousedown') { - L.DomEvent.stopPropagation(e); - } else { - L.DomEvent.preventDefault(e); - } - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - if (this._map) { - this._updateOpacity(); - } - - return this; - }, - - _updateOpacity: function () { - L.DomUtil.setOpacity(this._icon, this.options.opacity); - if (this._shadow) { - L.DomUtil.setOpacity(this._shadow, this.options.opacity); - } - }, - - _bringToFront: function () { - this._updateZIndex(this.options.riseOffset); - }, - - _resetZIndex: function () { - this._updateZIndex(0); - } -}); - -L.marker = function (latlng, options) { - return new L.Marker(latlng, options); -}; - - -/* - * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon) - * to use with L.Marker. - */ - -L.DivIcon = L.Icon.extend({ - options: { - iconSize: [12, 12], // also can be set through CSS - /* - iconAnchor: (Point) - popupAnchor: (Point) - html: (String) - bgPos: (Point) - */ - className: 'leaflet-div-icon', - html: false - }, - - createIcon: function (oldIcon) { - var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), - options = this.options; - - if (options.html !== false) { - div.innerHTML = options.html; - } else { - div.innerHTML = ''; - } - - if (options.bgPos) { - div.style.backgroundPosition = - (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; - } - - this._setIconStyles(div, 'icon'); - return div; - }, - - createShadow: function () { - return null; - } -}); - -L.divIcon = function (options) { - return new L.DivIcon(options); -}; - - -/* - * L.Popup is used for displaying popups on the map. - */ - -L.Map.mergeOptions({ - closePopupOnClick: true -}); - -L.Popup = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - minWidth: 50, - maxWidth: 300, - maxHeight: null, - autoPan: true, - closeButton: true, - offset: [0, 7], - autoPanPadding: [5, 5], - keepInView: false, - className: '', - zoomAnimation: true - }, - - initialize: function (options, source) { - L.setOptions(this, options); - - this._source = source; - this._animated = L.Browser.any3d && this.options.zoomAnimation; - this._isOpen = false; - }, - - onAdd: function (map) { - this._map = map; - - if (!this._container) { - this._initLayout(); - } - this._updateContent(); - - var animFade = map.options.fadeAnimation; - - if (animFade) { - L.DomUtil.setOpacity(this._container, 0); - } - map._panes.popupPane.appendChild(this._container); - - map.on(this._getEvents(), this); - - this._update(); - - if (animFade) { - L.DomUtil.setOpacity(this._container, 1); - } - - this.fire('open'); - - map.fire('popupopen', {popup: this}); - - if (this._source) { - this._source.fire('popupopen', {popup: this}); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - openOn: function (map) { - map.openPopup(this); - return this; - }, - - onRemove: function (map) { - map._panes.popupPane.removeChild(this._container); - - L.Util.falseFn(this._container.offsetWidth); // force reflow - - map.off(this._getEvents(), this); - - if (map.options.fadeAnimation) { - L.DomUtil.setOpacity(this._container, 0); - } - - this._map = null; - - this.fire('close'); - - map.fire('popupclose', {popup: this}); - - if (this._source) { - this._source.fire('popupclose', {popup: this}); - } - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - this._update(); - return this; - }, - - setContent: function (content) { - this._content = content; - this._update(); - return this; - }, - - _getEvents: function () { - var events = { - viewreset: this._updatePosition - }; - - if (this._animated) { - events.zoomanim = this._zoomAnimation; - } - if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { - events.preclick = this._close; - } - if (this.options.keepInView) { - events.moveend = this._adjustPan; - } - - return events; - }, - - _close: function () { - if (this._map) { - this._map.closePopup(this); - } - }, - - _initLayout: function () { - var prefix = 'leaflet-popup', - containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' + - (this._animated ? 'animated' : 'hide'), - container = this._container = L.DomUtil.create('div', containerClass), - closeButton; - - if (this.options.closeButton) { - closeButton = this._closeButton = - L.DomUtil.create('a', prefix + '-close-button', container); - closeButton.href = '#close'; - closeButton.innerHTML = '×'; - L.DomEvent.disableClickPropagation(closeButton); - - L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); - } - - var wrapper = this._wrapper = - L.DomUtil.create('div', prefix + '-content-wrapper', container); - L.DomEvent.disableClickPropagation(wrapper); - - this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); - L.DomEvent.on(this._contentNode, 'mousewheel', L.DomEvent.stopPropagation); - L.DomEvent.on(this._contentNode, 'MozMousePixelScroll', L.DomEvent.stopPropagation); - L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); - this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); - this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); - }, - - _update: function () { - if (!this._map) { return; } - - this._container.style.visibility = 'hidden'; - - this._updateContent(); - this._updateLayout(); - this._updatePosition(); - - this._container.style.visibility = ''; - - this._adjustPan(); - }, - - _updateContent: function () { - if (!this._content) { return; } - - if (typeof this._content === 'string') { - this._contentNode.innerHTML = this._content; - } else { - while (this._contentNode.hasChildNodes()) { - this._contentNode.removeChild(this._contentNode.firstChild); - } - this._contentNode.appendChild(this._content); - } - this.fire('contentupdate'); - }, - - _updateLayout: function () { - var container = this._contentNode, - style = container.style; - - style.width = ''; - style.whiteSpace = 'nowrap'; - - var width = container.offsetWidth; - width = Math.min(width, this.options.maxWidth); - width = Math.max(width, this.options.minWidth); - - style.width = (width + 1) + 'px'; - style.whiteSpace = ''; - - style.height = ''; - - var height = container.offsetHeight, - maxHeight = this.options.maxHeight, - scrolledClass = 'leaflet-popup-scrolled'; - - if (maxHeight && height > maxHeight) { - style.height = maxHeight + 'px'; - L.DomUtil.addClass(container, scrolledClass); - } else { - L.DomUtil.removeClass(container, scrolledClass); - } - - this._containerWidth = this._container.offsetWidth; - }, - - _updatePosition: function () { - if (!this._map) { return; } - - var pos = this._map.latLngToLayerPoint(this._latlng), - animated = this._animated, - offset = L.point(this.options.offset); - - if (animated) { - L.DomUtil.setPosition(this._container, pos); - } - - this._containerBottom = -offset.y - (animated ? 0 : pos.y); - this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x); - - // bottom position the popup in case the height of the popup changes (images loading etc) - this._container.style.bottom = this._containerBottom + 'px'; - this._container.style.left = this._containerLeft + 'px'; - }, - - _zoomAnimation: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); - - L.DomUtil.setPosition(this._container, pos); - }, - - _adjustPan: function () { - if (!this.options.autoPan) { return; } - - var map = this._map, - containerHeight = this._container.offsetHeight, - containerWidth = this._containerWidth, - - layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); - - if (this._animated) { - layerPos._add(L.DomUtil.getPosition(this._container)); - } - - var containerPos = map.layerPointToContainerPoint(layerPos), - padding = L.point(this.options.autoPanPadding), - size = map.getSize(), - dx = 0, - dy = 0; - - if (containerPos.x + containerWidth > size.x) { // right - dx = containerPos.x + containerWidth - size.x + padding.x; - } - if (containerPos.x - dx < 0) { // left - dx = containerPos.x - padding.x; - } - if (containerPos.y + containerHeight > size.y) { // bottom - dy = containerPos.y + containerHeight - size.y + padding.y; - } - if (containerPos.y - dy < 0) { // top - dy = containerPos.y - padding.y; - } - - if (dx || dy) { - map - .fire('autopanstart') - .panBy([dx, dy]); - } - }, - - _onCloseButtonClick: function (e) { - this._close(); - L.DomEvent.stop(e); - } -}); - -L.popup = function (options, source) { - return new L.Popup(options, source); -}; - - -L.Map.include({ - openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object]) - this.closePopup(); - - if (!(popup instanceof L.Popup)) { - var content = popup; - - popup = new L.Popup(options) - .setLatLng(latlng) - .setContent(content); - } - popup._isOpen = true; - - this._popup = popup; - return this.addLayer(popup); - }, - - closePopup: function (popup) { - if (!popup || popup === this._popup) { - popup = this._popup; - this._popup = null; - } - if (popup) { - this.removeLayer(popup); - popup._isOpen = false; - } - return this; - } -}); - - -/* - * Popup extension to L.Marker, adding popup-related methods. - */ - -L.Marker.include({ - openPopup: function () { - if (this._popup && this._map && !this._map.hasLayer(this._popup)) { - this._popup.setLatLng(this._latlng); - this._map.openPopup(this._popup); - } - - return this; - }, - - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; - }, - - togglePopup: function () { - if (this._popup) { - if (this._popup._isOpen) { - this.closePopup(); - } else { - this.openPopup(); - } - } - return this; - }, - - bindPopup: function (content, options) { - var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]); - - anchor = anchor.add(L.Popup.prototype.options.offset); - - if (options && options.offset) { - anchor = anchor.add(options.offset); - } - - options = L.extend({offset: anchor}, options); - - if (!this._popup) { - this - .on('click', this.togglePopup, this) - .on('remove', this.closePopup, this) - .on('move', this._movePopup, this); - } - - if (content instanceof L.Popup) { - L.setOptions(content, options); - this._popup = content; - } else { - this._popup = new L.Popup(options, this) - .setContent(content); - } - - return this; - }, - - setPopupContent: function (content) { - if (this._popup) { - this._popup.setContent(content); - } - return this; - }, - - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this.togglePopup) - .off('remove', this.closePopup) - .off('move', this._movePopup); - } - return this; - }, - - _movePopup: function (e) { - this._popup.setLatLng(e.latlng); - } -}); - - -/* - * L.LayerGroup is a class to combine several layers into one so that - * you can manipulate the group (e.g. add/remove it) as one layer. - */ - -L.LayerGroup = L.Class.extend({ - initialize: function (layers) { - this._layers = {}; - - var i, len; - - if (layers) { - for (i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } - } - }, - - addLayer: function (layer) { - var id = this.getLayerId(layer); - - this._layers[id] = layer; - - if (this._map) { - this._map.addLayer(layer); - } - - return this; - }, - - removeLayer: function (layer) { - var id = layer in this._layers ? layer : this.getLayerId(layer); - - if (this._map && this._layers[id]) { - this._map.removeLayer(this._layers[id]); - } - - delete this._layers[id]; - - return this; - }, - - hasLayer: function (layer) { - if (!layer) { return false; } - - return (layer in this._layers || this.getLayerId(layer) in this._layers); - }, - - clearLayers: function () { - this.eachLayer(this.removeLayer, this); - return this; - }, - - invoke: function (methodName) { - var args = Array.prototype.slice.call(arguments, 1), - i, layer; - - for (i in this._layers) { - layer = this._layers[i]; - - if (layer[methodName]) { - layer[methodName].apply(layer, args); - } - } - - return this; - }, - - onAdd: function (map) { - this._map = map; - this.eachLayer(map.addLayer, map); - }, - - onRemove: function (map) { - this.eachLayer(map.removeLayer, map); - this._map = null; - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, - - getLayer: function (id) { - return this._layers[id]; - }, - - getLayers: function () { - var layers = []; - - for (var i in this._layers) { - layers.push(this._layers[i]); - } - return layers; - }, - - setZIndex: function (zIndex) { - return this.invoke('setZIndex', zIndex); - }, - - getLayerId: function (layer) { - return L.stamp(layer); - } -}); - -L.layerGroup = function (layers) { - return new L.LayerGroup(layers); -}; - - -/* - * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods - * shared between a group of interactive layers (like vectors or markers). - */ - -L.FeatureGroup = L.LayerGroup.extend({ - includes: L.Mixin.Events, - - statics: { - EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose' - }, - - addLayer: function (layer) { - if (this.hasLayer(layer)) { - return this; - } - - layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); - - L.LayerGroup.prototype.addLayer.call(this, layer); - - if (this._popupContent && layer.bindPopup) { - layer.bindPopup(this._popupContent, this._popupOptions); - } - - return this.fire('layeradd', {layer: layer}); - }, - - removeLayer: function (layer) { - if (!this.hasLayer(layer)) { - return this; - } - if (layer in this._layers) { - layer = this._layers[layer]; - } - - layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this); - - L.LayerGroup.prototype.removeLayer.call(this, layer); - - if (this._popupContent) { - this.invoke('unbindPopup'); - } - - return this.fire('layerremove', {layer: layer}); - }, - - bindPopup: function (content, options) { - this._popupContent = content; - this._popupOptions = options; - return this.invoke('bindPopup', content, options); - }, - - setStyle: function (style) { - return this.invoke('setStyle', style); - }, - - bringToFront: function () { - return this.invoke('bringToFront'); - }, - - bringToBack: function () { - return this.invoke('bringToBack'); - }, - - getBounds: function () { - var bounds = new L.LatLngBounds(); - - this.eachLayer(function (layer) { - bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds()); - }); - - return bounds; - }, - - _propagateEvent: function (e) { - if (!e.layer) { - e.layer = e.target; - } - e.target = this; - - this.fire(e.type, e); - } -}); - -L.featureGroup = function (layers) { - return new L.FeatureGroup(layers); -}; - - -/* - * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc. - */ - -L.Path = L.Class.extend({ - includes: [L.Mixin.Events], - - statics: { - // how much to extend the clip area around the map view - // (relative to its size, e.g. 0.5 is half the screen in each direction) - // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is) - CLIP_PADDING: (function () { - var max = L.Browser.mobile ? 1280 : 2000, - target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2; - return Math.max(0, Math.min(0.5, target)); - })() - }, - - options: { - stroke: true, - color: '#0033ff', - dashArray: null, - weight: 5, - opacity: 0.5, - - fill: false, - fillColor: null, //same as color by default - fillOpacity: 0.2, - - clickable: true - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - onAdd: function (map) { - this._map = map; - - if (!this._container) { - this._initElements(); - this._initEvents(); - } - - this.projectLatlngs(); - this._updatePath(); - - if (this._container) { - this._map._pathRoot.appendChild(this._container); - } - - this.fire('add'); - - map.on({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - map._pathRoot.removeChild(this._container); - - // Need to fire remove event before we set _map to null as the event hooks might need the object - this.fire('remove'); - this._map = null; - - if (L.Browser.vml) { - this._container = null; - this._stroke = null; - this._fill = null; - } - - map.off({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, - - projectLatlngs: function () { - // do all projection stuff here - }, - - setStyle: function (style) { - L.setOptions(this, style); - - if (this._container) { - this._updateStyle(); - } - - return this; - }, - - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._updatePath(); - } - return this; - } -}); - -L.Map.include({ - _updatePathViewport: function () { - var p = L.Path.CLIP_PADDING, - size = this.getSize(), - panePos = L.DomUtil.getPosition(this._mapPane), - min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()), - max = min.add(size.multiplyBy(1 + p * 2)._round()); - - this._pathViewport = new L.Bounds(min, max); - } -}); - - -/* - * Extends L.Path with SVG-specific rendering code. - */ - -L.Path.SVG_NS = 'http://www.w3.org/2000/svg'; - -L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect); - -L.Path = L.Path.extend({ - statics: { - SVG: L.Browser.svg - }, - - bringToFront: function () { - var root = this._map._pathRoot, - path = this._container; - - if (path && root.lastChild !== path) { - root.appendChild(path); - } - return this; - }, - - bringToBack: function () { - var root = this._map._pathRoot, - path = this._container, - first = root.firstChild; - - if (path && first !== path) { - root.insertBefore(path, first); - } - return this; - }, - - getPathString: function () { - // form path string here - }, - - _createElement: function (name) { - return document.createElementNS(L.Path.SVG_NS, name); - }, - - _initElements: function () { - this._map._initPathRoot(); - this._initPath(); - this._initStyle(); - }, - - _initPath: function () { - this._container = this._createElement('g'); - - this._path = this._createElement('path'); - this._container.appendChild(this._path); - }, - - _initStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke-linejoin', 'round'); - this._path.setAttribute('stroke-linecap', 'round'); - } - if (this.options.fill) { - this._path.setAttribute('fill-rule', 'evenodd'); - } - if (this.options.pointerEvents) { - this._path.setAttribute('pointer-events', this.options.pointerEvents); - } - if (!this.options.clickable && !this.options.pointerEvents) { - this._path.setAttribute('pointer-events', 'none'); - } - this._updateStyle(); - }, - - _updateStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke', this.options.color); - this._path.setAttribute('stroke-opacity', this.options.opacity); - this._path.setAttribute('stroke-width', this.options.weight); - if (this.options.dashArray) { - this._path.setAttribute('stroke-dasharray', this.options.dashArray); - } else { - this._path.removeAttribute('stroke-dasharray'); - } - } else { - this._path.setAttribute('stroke', 'none'); - } - if (this.options.fill) { - this._path.setAttribute('fill', this.options.fillColor || this.options.color); - this._path.setAttribute('fill-opacity', this.options.fillOpacity); - } else { - this._path.setAttribute('fill', 'none'); - } - }, - - _updatePath: function () { - var str = this.getPathString(); - if (!str) { - // fix webkit empty string parsing bug - str = 'M0 0'; - } - this._path.setAttribute('d', str); - }, - - // TODO remove duplication with L.Map - _initEvents: function () { - if (this.options.clickable) { - if (L.Browser.svg || !L.Browser.vml) { - this._path.setAttribute('class', 'leaflet-clickable'); - } - - L.DomEvent.on(this._container, 'click', this._onMouseClick, this); - - var events = ['dblclick', 'mousedown', 'mouseover', - 'mouseout', 'mousemove', 'contextmenu']; - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); - } - } - }, - - _onMouseClick: function (e) { - if (this._map.dragging && this._map.dragging.moved()) { return; } - - this._fireMouseEvent(e); - }, - - _fireMouseEvent: function (e) { - if (!this.hasEventListeners(e.type)) { return; } - - var map = this._map, - containerPoint = map.mouseEventToContainerPoint(e), - layerPoint = map.containerPointToLayerPoint(containerPoint), - latlng = map.layerPointToLatLng(layerPoint); - - this.fire(e.type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, - originalEvent: e - }); - - if (e.type === 'contextmenu') { - L.DomEvent.preventDefault(e); - } - if (e.type !== 'mousemove') { - L.DomEvent.stopPropagation(e); - } - } -}); - -L.Map.include({ - _initPathRoot: function () { - if (!this._pathRoot) { - this._pathRoot = L.Path.prototype._createElement('svg'); - this._panes.overlayPane.appendChild(this._pathRoot); - - if (this.options.zoomAnimation && L.Browser.any3d) { - this._pathRoot.setAttribute('class', ' leaflet-zoom-animated'); - - this.on({ - 'zoomanim': this._animatePathZoom, - 'zoomend': this._endPathZoom - }); - } else { - this._pathRoot.setAttribute('class', ' leaflet-zoom-hide'); - } - - this.on('moveend', this._updateSvgViewport); - this._updateSvgViewport(); - } - }, - - _animatePathZoom: function (e) { - var scale = this.getZoomScale(e.zoom), - offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min); - - this._pathRoot.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') '; - - this._pathZooming = true; - }, - - _endPathZoom: function () { - this._pathZooming = false; - }, - - _updateSvgViewport: function () { - - if (this._pathZooming) { - // Do not update SVGs while a zoom animation is going on otherwise the animation will break. - // When the zoom animation ends we will be updated again anyway - // This fixes the case where you do a momentum move and zoom while the move is still ongoing. - return; - } - - this._updatePathViewport(); - - var vp = this._pathViewport, - min = vp.min, - max = vp.max, - width = max.x - min.x, - height = max.y - min.y, - root = this._pathRoot, - pane = this._panes.overlayPane; - - // Hack to make flicker on drag end on mobile webkit less irritating - if (L.Browser.mobileWebkit) { - pane.removeChild(root); - } - - L.DomUtil.setPosition(root, min); - root.setAttribute('width', width); - root.setAttribute('height', height); - root.setAttribute('viewBox', [min.x, min.y, width, height].join(' ')); - - if (L.Browser.mobileWebkit) { - pane.appendChild(root); - } - } -}); - - -/* - * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods. - */ - -L.Path.include({ - - bindPopup: function (content, options) { - - if (content instanceof L.Popup) { - this._popup = content; - } else { - if (!this._popup || options) { - this._popup = new L.Popup(options, this); - } - this._popup.setContent(content); - } - - if (!this._popupHandlersAdded) { - this - .on('click', this._openPopup, this) - .on('remove', this.closePopup, this); - - this._popupHandlersAdded = true; - } - - return this; - }, - - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this._openPopup) - .off('remove', this.closePopup); - - this._popupHandlersAdded = false; - } - return this; - }, - - openPopup: function (latlng) { - - if (this._popup) { - // open the popup from one of the path's points if not specified - latlng = latlng || this._latlng || - this._latlngs[Math.floor(this._latlngs.length / 2)]; - - this._openPopup({latlng: latlng}); - } - - return this; - }, - - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; - }, - - _openPopup: function (e) { - this._popup.setLatLng(e.latlng); - this._map.openPopup(this._popup); - } -}); - - -/* - * Vector rendering for IE6-8 through VML. - * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! - */ - -L.Browser.vml = !L.Browser.svg && (function () { - try { - var div = document.createElement('div'); - div.innerHTML = '<v:shape adj="1"/>'; - - var shape = div.firstChild; - shape.style.behavior = 'url(#default#VML)'; - - return shape && (typeof shape.adj === 'object'); - - } catch (e) { - return false; - } -}()); - -L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ - statics: { - VML: true, - CLIP_PADDING: 0.02 - }, - - _createElement: (function () { - try { - document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); - return function (name) { - return document.createElement('<lvml:' + name + ' class="lvml">'); - }; - } catch (e) { - return function (name) { - return document.createElement( - '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); - }; - } - }()), - - _initPath: function () { - var container = this._container = this._createElement('shape'); - L.DomUtil.addClass(container, 'leaflet-vml-shape'); - if (this.options.clickable) { - L.DomUtil.addClass(container, 'leaflet-clickable'); - } - container.coordsize = '1 1'; - - this._path = this._createElement('path'); - container.appendChild(this._path); - - this._map._pathRoot.appendChild(container); - }, - - _initStyle: function () { - this._updateStyle(); - }, - - _updateStyle: function () { - var stroke = this._stroke, - fill = this._fill, - options = this.options, - container = this._container; - - container.stroked = options.stroke; - container.filled = options.fill; - - if (options.stroke) { - if (!stroke) { - stroke = this._stroke = this._createElement('stroke'); - stroke.endcap = 'round'; - container.appendChild(stroke); - } - stroke.weight = options.weight + 'px'; - stroke.color = options.color; - stroke.opacity = options.opacity; - - if (options.dashArray) { - stroke.dashStyle = options.dashArray instanceof Array ? - options.dashArray.join(' ') : - options.dashArray.replace(/( *, *)/g, ' '); - } else { - stroke.dashStyle = ''; - } - - } else if (stroke) { - container.removeChild(stroke); - this._stroke = null; - } - - if (options.fill) { - if (!fill) { - fill = this._fill = this._createElement('fill'); - container.appendChild(fill); - } - fill.color = options.fillColor || options.color; - fill.opacity = options.fillOpacity; - - } else if (fill) { - container.removeChild(fill); - this._fill = null; - } - }, - - _updatePath: function () { - var style = this._container.style; - - style.display = 'none'; - this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug - style.display = ''; - } -}); - -L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : { - _initPathRoot: function () { - if (this._pathRoot) { return; } - - var root = this._pathRoot = document.createElement('div'); - root.className = 'leaflet-vml-container'; - this._panes.overlayPane.appendChild(root); - - this.on('moveend', this._updatePathViewport); - this._updatePathViewport(); - } -}); - - -/* - * Vector rendering for all browsers that support canvas. - */ - -L.Browser.canvas = (function () { - return !!document.createElement('canvas').getContext; -}()); - -L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({ - statics: { - //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value - CANVAS: true, - SVG: false - }, - - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._requestUpdate(); - } - return this; - }, - - setStyle: function (style) { - L.setOptions(this, style); - - if (this._map) { - this._updateStyle(); - this._requestUpdate(); - } - return this; - }, - - onRemove: function (map) { - map - .off('viewreset', this.projectLatlngs, this) - .off('moveend', this._updatePath, this); - - if (this.options.clickable) { - this._map.off('click', this._onClick, this); - this._map.off('mousemove', this._onMouseMove, this); - } - - this._requestUpdate(); - - this._map = null; - }, - - _requestUpdate: function () { - if (this._map && !L.Path._updateRequest) { - L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map); - } - }, - - _fireMapMoveEnd: function () { - L.Path._updateRequest = null; - this.fire('moveend'); - }, - - _initElements: function () { - this._map._initPathRoot(); - this._ctx = this._map._canvasCtx; - }, - - _updateStyle: function () { - var options = this.options; - - if (options.stroke) { - this._ctx.lineWidth = options.weight; - this._ctx.strokeStyle = options.color; - } - if (options.fill) { - this._ctx.fillStyle = options.fillColor || options.color; - } - }, - - _drawPath: function () { - var i, j, len, len2, point, drawMethod; - - this._ctx.beginPath(); - - for (i = 0, len = this._parts.length; i < len; i++) { - for (j = 0, len2 = this._parts[i].length; j < len2; j++) { - point = this._parts[i][j]; - drawMethod = (j === 0 ? 'move' : 'line') + 'To'; - - this._ctx[drawMethod](point.x, point.y); - } - // TODO refactor ugly hack - if (this instanceof L.Polygon) { - this._ctx.closePath(); - } - } - }, - - _checkIfEmpty: function () { - return !this._parts.length; - }, - - _updatePath: function () { - if (this._checkIfEmpty()) { return; } - - var ctx = this._ctx, - options = this.options; - - this._drawPath(); - ctx.save(); - this._updateStyle(); - - if (options.fill) { - ctx.globalAlpha = options.fillOpacity; - ctx.fill(); - } - - if (options.stroke) { - ctx.globalAlpha = options.opacity; - ctx.stroke(); - } - - ctx.restore(); - - // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature - }, - - _initEvents: function () { - if (this.options.clickable) { - // TODO dblclick - this._map.on('mousemove', this._onMouseMove, this); - this._map.on('click', this._onClick, this); - } - }, - - _onClick: function (e) { - if (this._containsPoint(e.layerPoint)) { - this.fire('click', e); - } - }, - - _onMouseMove: function (e) { - if (!this._map || this._map._animatingZoom) { return; } - - // TODO don't do on each move - if (this._containsPoint(e.layerPoint)) { - this._ctx.canvas.style.cursor = 'pointer'; - this._mouseInside = true; - this.fire('mouseover', e); - - } else if (this._mouseInside) { - this._ctx.canvas.style.cursor = ''; - this._mouseInside = false; - this.fire('mouseout', e); - } - } -}); - -L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : { - _initPathRoot: function () { - var root = this._pathRoot, - ctx; - - if (!root) { - root = this._pathRoot = document.createElement('canvas'); - root.style.position = 'absolute'; - ctx = this._canvasCtx = root.getContext('2d'); - - ctx.lineCap = 'round'; - ctx.lineJoin = 'round'; - - this._panes.overlayPane.appendChild(root); - - if (this.options.zoomAnimation) { - this._pathRoot.className = 'leaflet-zoom-animated'; - this.on('zoomanim', this._animatePathZoom); - this.on('zoomend', this._endPathZoom); - } - this.on('moveend', this._updateCanvasViewport); - this._updateCanvasViewport(); - } - }, - - _updateCanvasViewport: function () { - // don't redraw while zooming. See _updateSvgViewport for more details - if (this._pathZooming) { return; } - this._updatePathViewport(); - - var vp = this._pathViewport, - min = vp.min, - size = vp.max.subtract(min), - root = this._pathRoot; - - //TODO check if this works properly on mobile webkit - L.DomUtil.setPosition(root, min); - root.width = size.x; - root.height = size.y; - root.getContext('2d').translate(-min.x, -min.y); - } -}); - - -/* - * L.LineUtil contains different utility functions for line segments - * and polylines (clipping, simplification, distances, etc.) - */ - -/*jshint bitwise:false */ // allow bitwise oprations for this file - -L.LineUtil = { - - // Simplify polyline with vertex reduction and Douglas-Peucker simplification. - // Improves rendering performance dramatically by lessening the number of points to draw. - - simplify: function (/*Point[]*/ points, /*Number*/ tolerance) { - if (!tolerance || !points.length) { - return points.slice(); - } - - var sqTolerance = tolerance * tolerance; - - // stage 1: vertex reduction - points = this._reducePoints(points, sqTolerance); - - // stage 2: Douglas-Peucker simplification - points = this._simplifyDP(points, sqTolerance); - - return points; - }, - - // distance from a point to a segment between two points - pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); - }, - - closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return this._sqClosestPointOnSegment(p, p1, p2); - }, - - // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm - _simplifyDP: function (points, sqTolerance) { - - var len = points.length, - ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, - markers = new ArrayConstructor(len); - - markers[0] = markers[len - 1] = 1; - - this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); - - var i, - newPoints = []; - - for (i = 0; i < len; i++) { - if (markers[i]) { - newPoints.push(points[i]); - } - } - - return newPoints; - }, - - _simplifyDPStep: function (points, markers, sqTolerance, first, last) { - - var maxSqDist = 0, - index, i, sqDist; - - for (i = first + 1; i <= last - 1; i++) { - sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true); - - if (sqDist > maxSqDist) { - index = i; - maxSqDist = sqDist; - } - } - - if (maxSqDist > sqTolerance) { - markers[index] = 1; - - this._simplifyDPStep(points, markers, sqTolerance, first, index); - this._simplifyDPStep(points, markers, sqTolerance, index, last); - } - }, - - // reduce points that are too close to each other to a single point - _reducePoints: function (points, sqTolerance) { - var reducedPoints = [points[0]]; - - for (var i = 1, prev = 0, len = points.length; i < len; i++) { - if (this._sqDist(points[i], points[prev]) > sqTolerance) { - reducedPoints.push(points[i]); - prev = i; - } - } - if (prev < len - 1) { - reducedPoints.push(points[len - 1]); - } - return reducedPoints; - }, - - // Cohen-Sutherland line clipping algorithm. - // Used to avoid rendering parts of a polyline that are not currently visible. - - clipSegment: function (a, b, bounds, useLastCode) { - var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds), - codeB = this._getBitCode(b, bounds), - - codeOut, p, newCode; - - // save 2nd code to avoid calculating it on the next segment - this._lastCode = codeB; - - while (true) { - // if a,b is inside the clip window (trivial accept) - if (!(codeA | codeB)) { - return [a, b]; - // if a,b is outside the clip window (trivial reject) - } else if (codeA & codeB) { - return false; - // other cases - } else { - codeOut = codeA || codeB; - p = this._getEdgeIntersection(a, b, codeOut, bounds); - newCode = this._getBitCode(p, bounds); - - if (codeOut === codeA) { - a = p; - codeA = newCode; - } else { - b = p; - codeB = newCode; - } - } - } - }, - - _getEdgeIntersection: function (a, b, code, bounds) { - var dx = b.x - a.x, - dy = b.y - a.y, - min = bounds.min, - max = bounds.max; - - if (code & 8) { // top - return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y); - } else if (code & 4) { // bottom - return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y); - } else if (code & 2) { // right - return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx); - } else if (code & 1) { // left - return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx); - } - }, - - _getBitCode: function (/*Point*/ p, bounds) { - var code = 0; - - if (p.x < bounds.min.x) { // left - code |= 1; - } else if (p.x > bounds.max.x) { // right - code |= 2; - } - if (p.y < bounds.min.y) { // bottom - code |= 4; - } else if (p.y > bounds.max.y) { // top - code |= 8; - } - - return code; - }, - - // square distance (to avoid unnecessary Math.sqrt calls) - _sqDist: function (p1, p2) { - var dx = p2.x - p1.x, - dy = p2.y - p1.y; - return dx * dx + dy * dy; - }, - - // return closest point on segment or distance to that point - _sqClosestPointOnSegment: function (p, p1, p2, sqDist) { - var x = p1.x, - y = p1.y, - dx = p2.x - x, - dy = p2.y - y, - dot = dx * dx + dy * dy, - t; - - if (dot > 0) { - t = ((p.x - x) * dx + (p.y - y) * dy) / dot; - - if (t > 1) { - x = p2.x; - y = p2.y; - } else if (t > 0) { - x += dx * t; - y += dy * t; - } - } - - dx = p.x - x; - dy = p.y - y; - - return sqDist ? dx * dx + dy * dy : new L.Point(x, y); - } -}; - - -/* - * L.Polyline is used to display polylines on a map. - */ - -L.Polyline = L.Path.extend({ - initialize: function (latlngs, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlngs = this._convertLatLngs(latlngs); - }, - - options: { - // how much to simplify the polyline on each zoom level - // more = better performance and smoother look, less = more accurate - smoothFactor: 1.0, - noClip: false - }, - - projectLatlngs: function () { - this._originalPoints = []; - - for (var i = 0, len = this._latlngs.length; i < len; i++) { - this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]); - } - }, - - getPathString: function () { - for (var i = 0, len = this._parts.length, str = ''; i < len; i++) { - str += this._getPathPartStr(this._parts[i]); - } - return str; - }, - - getLatLngs: function () { - return this._latlngs; - }, - - setLatLngs: function (latlngs) { - this._latlngs = this._convertLatLngs(latlngs); - return this.redraw(); - }, - - addLatLng: function (latlng) { - this._latlngs.push(L.latLng(latlng)); - return this.redraw(); - }, - - spliceLatLngs: function () { // (Number index, Number howMany) - var removed = [].splice.apply(this._latlngs, arguments); - this._convertLatLngs(this._latlngs, true); - this.redraw(); - return removed; - }, - - closestLayerPoint: function (p) { - var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null; - - for (var j = 0, jLen = parts.length; j < jLen; j++) { - var points = parts[j]; - for (var i = 1, len = points.length; i < len; i++) { - p1 = points[i - 1]; - p2 = points[i]; - var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true); - if (sqDist < minDistance) { - minDistance = sqDist; - minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2); - } - } - } - if (minPoint) { - minPoint.distance = Math.sqrt(minDistance); - } - return minPoint; - }, - - getBounds: function () { - return new L.LatLngBounds(this.getLatLngs()); - }, - - _convertLatLngs: function (latlngs, overwrite) { - var i, len, target = overwrite ? latlngs : []; - - for (i = 0, len = latlngs.length; i < len; i++) { - if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { - return; - } - target[i] = L.latLng(latlngs[i]); - } - return target; - }, - - _initEvents: function () { - L.Path.prototype._initEvents.call(this); - }, - - _getPathPartStr: function (points) { - var round = L.Path.VML; - - for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { - p = points[j]; - if (round) { - p._round(); - } - str += (j ? 'L' : 'M') + p.x + ' ' + p.y; - } - return str; - }, - - _clipPoints: function () { - var points = this._originalPoints, - len = points.length, - i, k, segment; - - if (this.options.noClip) { - this._parts = [points]; - return; - } - - this._parts = []; - - var parts = this._parts, - vp = this._map._pathViewport, - lu = L.LineUtil; - - for (i = 0, k = 0; i < len - 1; i++) { - segment = lu.clipSegment(points[i], points[i + 1], vp, i); - if (!segment) { - continue; - } - - parts[k] = parts[k] || []; - parts[k].push(segment[0]); - - // if segment goes out of screen, or it's the last one, it's the end of the line part - if ((segment[1] !== points[i + 1]) || (i === len - 2)) { - parts[k].push(segment[1]); - k++; - } - } - }, - - // simplify each clipped part of the polyline - _simplifyPoints: function () { - var parts = this._parts, - lu = L.LineUtil; - - for (var i = 0, len = parts.length; i < len; i++) { - parts[i] = lu.simplify(parts[i], this.options.smoothFactor); - } - }, - - _updatePath: function () { - if (!this._map) { return; } - - this._clipPoints(); - this._simplifyPoints(); - - L.Path.prototype._updatePath.call(this); - } -}); - -L.polyline = function (latlngs, options) { - return new L.Polyline(latlngs, options); -}; - - -/* - * L.PolyUtil contains utility functions for polygons (clipping, etc.). - */ - -/*jshint bitwise:false */ // allow bitwise operations here - -L.PolyUtil = {}; - -/* - * Sutherland-Hodgeman polygon clipping algorithm. - * Used to avoid rendering parts of a polygon that are not currently visible. - */ -L.PolyUtil.clipPolygon = function (points, bounds) { - var clippedPoints, - edges = [1, 4, 2, 8], - i, j, k, - a, b, - len, edge, p, - lu = L.LineUtil; - - for (i = 0, len = points.length; i < len; i++) { - points[i]._code = lu._getBitCode(points[i], bounds); - } - - // for each edge (left, bottom, right, top) - for (k = 0; k < 4; k++) { - edge = edges[k]; - clippedPoints = []; - - for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { - a = points[i]; - b = points[j]; - - // if a is inside the clip window - if (!(a._code & edge)) { - // if b is outside the clip window (a->b goes out of screen) - if (b._code & edge) { - p = lu._getEdgeIntersection(b, a, edge, bounds); - p._code = lu._getBitCode(p, bounds); - clippedPoints.push(p); - } - clippedPoints.push(a); - - // else if b is inside the clip window (a->b enters the screen) - } else if (!(b._code & edge)) { - p = lu._getEdgeIntersection(b, a, edge, bounds); - p._code = lu._getBitCode(p, bounds); - clippedPoints.push(p); - } - } - points = clippedPoints; - } - - return points; -}; - - -/* - * L.Polygon is used to display polygons on a map. - */ - -L.Polygon = L.Polyline.extend({ - options: { - fill: true - }, - - initialize: function (latlngs, options) { - var i, len, hole; - - L.Polyline.prototype.initialize.call(this, latlngs, options); - - if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { - this._latlngs = this._convertLatLngs(latlngs[0]); - this._holes = latlngs.slice(1); - - for (i = 0, len = this._holes.length; i < len; i++) { - hole = this._holes[i] = this._convertLatLngs(this._holes[i]); - if (hole[0].equals(hole[hole.length - 1])) { - hole.pop(); - } - } - } - - // filter out last point if its equal to the first one - latlngs = this._latlngs; - - if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) { - latlngs.pop(); - } - }, - - projectLatlngs: function () { - L.Polyline.prototype.projectLatlngs.call(this); - - // project polygon holes points - // TODO move this logic to Polyline to get rid of duplication - this._holePoints = []; - - if (!this._holes) { return; } - - var i, j, len, len2; - - for (i = 0, len = this._holes.length; i < len; i++) { - this._holePoints[i] = []; - - for (j = 0, len2 = this._holes[i].length; j < len2; j++) { - this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]); - } - } - }, - - _clipPoints: function () { - var points = this._originalPoints, - newParts = []; - - this._parts = [points].concat(this._holePoints); - - if (this.options.noClip) { return; } - - for (var i = 0, len = this._parts.length; i < len; i++) { - var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport); - if (clipped.length) { - newParts.push(clipped); - } - } - - this._parts = newParts; - }, - - _getPathPartStr: function (points) { - var str = L.Polyline.prototype._getPathPartStr.call(this, points); - return str + (L.Browser.svg ? 'z' : 'x'); - } -}); - -L.polygon = function (latlngs, options) { - return new L.Polygon(latlngs, options); -}; - - -/* - * Contains L.MultiPolyline and L.MultiPolygon layers. - */ - -(function () { - function createMulti(Klass) { - - return L.FeatureGroup.extend({ - - initialize: function (latlngs, options) { - this._layers = {}; - this._options = options; - this.setLatLngs(latlngs); - }, - - setLatLngs: function (latlngs) { - var i = 0, - len = latlngs.length; - - this.eachLayer(function (layer) { - if (i < len) { - layer.setLatLngs(latlngs[i++]); - } else { - this.removeLayer(layer); - } - }, this); - - while (i < len) { - this.addLayer(new Klass(latlngs[i++], this._options)); - } - - return this; - }, - - getLatLngs: function () { - var latlngs = []; - - this.eachLayer(function (layer) { - latlngs.push(layer.getLatLngs()); - }); - - return latlngs; - } - }); - } - - L.MultiPolyline = createMulti(L.Polyline); - L.MultiPolygon = createMulti(L.Polygon); - - L.multiPolyline = function (latlngs, options) { - return new L.MultiPolyline(latlngs, options); - }; - - L.multiPolygon = function (latlngs, options) { - return new L.MultiPolygon(latlngs, options); - }; -}()); - - -/* - * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. - */ - -L.Rectangle = L.Polygon.extend({ - initialize: function (latLngBounds, options) { - L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options); - }, - - setBounds: function (latLngBounds) { - this.setLatLngs(this._boundsToLatLngs(latLngBounds)); - }, - - _boundsToLatLngs: function (latLngBounds) { - latLngBounds = L.latLngBounds(latLngBounds); - return [ - latLngBounds.getSouthWest(), - latLngBounds.getNorthWest(), - latLngBounds.getNorthEast(), - latLngBounds.getSouthEast() - ]; - } -}); - -L.rectangle = function (latLngBounds, options) { - return new L.Rectangle(latLngBounds, options); -}; - - -/* - * L.Circle is a circle overlay (with a certain radius in meters). - */ - -L.Circle = L.Path.extend({ - initialize: function (latlng, radius, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlng = L.latLng(latlng); - this._mRadius = radius; - }, - - options: { - fill: true - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - return this.redraw(); - }, - - setRadius: function (radius) { - this._mRadius = radius; - return this.redraw(); - }, - - projectLatlngs: function () { - var lngRadius = this._getLngRadius(), - latlng = this._latlng, - pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]); - - this._point = this._map.latLngToLayerPoint(latlng); - this._radius = Math.max(this._point.x - pointLeft.x, 1); - }, - - getBounds: function () { - var lngRadius = this._getLngRadius(), - latRadius = (this._mRadius / 40075017) * 360, - latlng = this._latlng; - - return new L.LatLngBounds( - [latlng.lat - latRadius, latlng.lng - lngRadius], - [latlng.lat + latRadius, latlng.lng + lngRadius]); - }, - - getLatLng: function () { - return this._latlng; - }, - - getPathString: function () { - var p = this._point, - r = this._radius; - - if (this._checkIfEmpty()) { - return ''; - } - - if (L.Browser.svg) { - return 'M' + p.x + ',' + (p.y - r) + - 'A' + r + ',' + r + ',0,1,1,' + - (p.x - 0.1) + ',' + (p.y - r) + ' z'; - } else { - p._round(); - r = Math.round(r); - return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360); - } - }, - - getRadius: function () { - return this._mRadius; - }, - - // TODO Earth hardcoded, move into projection code! - - _getLatRadius: function () { - return (this._mRadius / 40075017) * 360; - }, - - _getLngRadius: function () { - return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); - }, - - _checkIfEmpty: function () { - if (!this._map) { - return false; - } - var vp = this._map._pathViewport, - r = this._radius, - p = this._point; - - return p.x - r > vp.max.x || p.y - r > vp.max.y || - p.x + r < vp.min.x || p.y + r < vp.min.y; - } -}); - -L.circle = function (latlng, radius, options) { - return new L.Circle(latlng, radius, options); -}; - - -/* - * L.CircleMarker is a circle overlay with a permanent pixel radius. - */ - -L.CircleMarker = L.Circle.extend({ - options: { - radius: 10, - weight: 2 - }, - - initialize: function (latlng, options) { - L.Circle.prototype.initialize.call(this, latlng, null, options); - this._radius = this.options.radius; - }, - - projectLatlngs: function () { - this._point = this._map.latLngToLayerPoint(this._latlng); - }, - - _updateStyle : function () { - L.Circle.prototype._updateStyle.call(this); - this.setRadius(this.options.radius); - }, - - setRadius: function (radius) { - this.options.radius = this._radius = radius; - return this.redraw(); - } -}); - -L.circleMarker = function (latlng, options) { - return new L.CircleMarker(latlng, options); -}; - - -/* - * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines. - */ - -L.Polyline.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p, closed) { - var i, j, k, len, len2, dist, part, - w = this.options.weight / 2; - - if (L.Browser.touch) { - w += 10; // polyline click tolerance on touch devices - } - - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - if (!closed && (j === 0)) { - continue; - } - - dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]); - - if (dist <= w) { - return true; - } - } - } - return false; - } -}); - - -/* - * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons. - */ - -L.Polygon.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p) { - var inside = false, - part, p1, p2, - i, j, k, - len, len2; - - // TODO optimization: check if within bounds first - - if (L.Polyline.prototype._containsPoint.call(this, p, true)) { - // click on polygon border - return true; - } - - // ray casting algorithm for detecting if point is in polygon - - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; - - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - p1 = part[j]; - p2 = part[k]; - - if (((p1.y > p.y) !== (p2.y > p.y)) && - (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { - inside = !inside; - } - } - } - - return inside; - } -}); - - -/* - * Extends L.Circle with Canvas-specific code. - */ - -L.Circle.include(!L.Path.CANVAS ? {} : { - _drawPath: function () { - var p = this._point; - this._ctx.beginPath(); - this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false); - }, - - _containsPoint: function (p) { - var center = this._point, - w2 = this.options.stroke ? this.options.weight / 2 : 0; - - return (p.distanceTo(center) <= this._radius + w2); - } -}); - - -/* - * CircleMarker canvas specific drawing parts. - */ - -L.CircleMarker.include(!L.Path.CANVAS ? {} : { - _updateStyle: function () { - L.Path.prototype._updateStyle.call(this); - } -}); - - -/* - * L.GeoJSON turns any GeoJSON data into a Leaflet layer. - */ - -L.GeoJSON = L.FeatureGroup.extend({ - - initialize: function (geojson, options) { - L.setOptions(this, options); - - this._layers = {}; - - if (geojson) { - this.addData(geojson); - } - }, - - addData: function (geojson) { - var features = L.Util.isArray(geojson) ? geojson : geojson.features, - i, len, feature; - - if (features) { - for (i = 0, len = features.length; i < len; i++) { - // Only add this if geometry or geometries are set and not null - feature = features[i]; - if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { - this.addData(features[i]); - } - } - return this; - } - - var options = this.options; - - if (options.filter && !options.filter(geojson)) { return; } - - var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng); - layer.feature = L.GeoJSON.asFeature(geojson); - - layer.defaultOptions = layer.options; - this.resetStyle(layer); - - if (options.onEachFeature) { - options.onEachFeature(geojson, layer); - } - - return this.addLayer(layer); - }, - - resetStyle: function (layer) { - var style = this.options.style; - if (style) { - // reset any custom styles - L.Util.extend(layer.options, layer.defaultOptions); - - this._setLayerStyle(layer, style); - } - }, - - setStyle: function (style) { - this.eachLayer(function (layer) { - this._setLayerStyle(layer, style); - }, this); - }, - - _setLayerStyle: function (layer, style) { - if (typeof style === 'function') { - style = style(layer.feature); - } - if (layer.setStyle) { - layer.setStyle(style); - } - } -}); - -L.extend(L.GeoJSON, { - geometryToLayer: function (geojson, pointToLayer, coordsToLatLng) { - var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, - coords = geometry.coordinates, - layers = [], - latlng, latlngs, i, len, layer; - - coordsToLatLng = coordsToLatLng || this.coordsToLatLng; - - switch (geometry.type) { - case 'Point': - latlng = coordsToLatLng(coords); - return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); - - case 'MultiPoint': - for (i = 0, len = coords.length; i < len; i++) { - latlng = coordsToLatLng(coords[i]); - layer = pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); - layers.push(layer); - } - return new L.FeatureGroup(layers); - - case 'LineString': - latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng); - return new L.Polyline(latlngs); - - case 'Polygon': - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.Polygon(latlngs); - - case 'MultiLineString': - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.MultiPolyline(latlngs); - - case 'MultiPolygon': - latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng); - return new L.MultiPolygon(latlngs); - - case 'GeometryCollection': - for (i = 0, len = geometry.geometries.length; i < len; i++) { - - layer = this.geometryToLayer({ - geometry: geometry.geometries[i], - type: 'Feature', - properties: geojson.properties - }, pointToLayer, coordsToLatLng); - - layers.push(layer); - } - return new L.FeatureGroup(layers); - - default: - throw new Error('Invalid GeoJSON object.'); - } - }, - - coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng - return new L.LatLng(coords[1], coords[0]); - }, - - coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array - var latlng, i, len, - latlngs = []; - - for (i = 0, len = coords.length; i < len; i++) { - latlng = levelsDeep ? - this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : - (coordsToLatLng || this.coordsToLatLng)(coords[i]); - - latlngs.push(latlng); - } - - return latlngs; - }, - - latLngToCoords: function (latLng) { - return [latLng.lng, latLng.lat]; - }, - - latLngsToCoords: function (latLngs) { - var coords = []; - - for (var i = 0, len = latLngs.length; i < len; i++) { - coords.push(L.GeoJSON.latLngToCoords(latLngs[i])); - } - - return coords; - }, - - getFeature: function (layer, newGeometry) { - return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry); - }, - - asFeature: function (geoJSON) { - if (geoJSON.type === 'Feature') { - return geoJSON; - } - - return { - type: 'Feature', - properties: {}, - geometry: geoJSON - }; - } -}); - -var PointToGeoJSON = { - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'Point', - coordinates: L.GeoJSON.latLngToCoords(this.getLatLng()) - }); - } -}; - -L.Marker.include(PointToGeoJSON); -L.Circle.include(PointToGeoJSON); -L.CircleMarker.include(PointToGeoJSON); - -L.Polyline.include({ - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'LineString', - coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs()) - }); - } -}); - -L.Polygon.include({ - toGeoJSON: function () { - var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())], - i, len, hole; - - coords[0].push(coords[0][0]); - - if (this._holes) { - for (i = 0, len = this._holes.length; i < len; i++) { - hole = L.GeoJSON.latLngsToCoords(this._holes[i]); - hole.push(hole[0]); - coords.push(hole); - } - } - - return L.GeoJSON.getFeature(this, { - type: 'Polygon', - coordinates: coords - }); - } -}); - -(function () { - function includeMulti(Klass, type) { - Klass.include({ - toGeoJSON: function () { - var coords = []; - - this.eachLayer(function (layer) { - coords.push(layer.toGeoJSON().geometry.coordinates); - }); - - return L.GeoJSON.getFeature(this, { - type: type, - coordinates: coords - }); - } - }); - } - - includeMulti(L.MultiPolyline, 'MultiLineString'); - includeMulti(L.MultiPolygon, 'MultiPolygon'); -}()); - -L.LayerGroup.include({ - toGeoJSON: function () { - var features = []; - - this.eachLayer(function (layer) { - if (layer.toGeoJSON) { - features.push(L.GeoJSON.asFeature(layer.toGeoJSON())); - } - }); - - return { - type: 'FeatureCollection', - features: features - }; - } -}); - -L.geoJson = function (geojson, options) { - return new L.GeoJSON(geojson, options); -}; - - -/* - * L.DomEvent contains functions for working with DOM events. - */ - -L.DomEvent = { - /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */ - addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object]) - - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler, originalHandler, newType; - - if (obj[key]) { return this; } - - handler = function (e) { - return fn.call(context || obj, e || L.DomEvent._getEvent()); - }; - - if (L.Browser.msTouch && type.indexOf('touch') === 0) { - return this.addMsTouchListener(obj, type, handler, id); - } - if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { - this.addDoubleTapListener(obj, handler, id); - } - - if ('addEventListener' in obj) { - - if (type === 'mousewheel') { - obj.addEventListener('DOMMouseScroll', handler, false); - obj.addEventListener(type, handler, false); - - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - - originalHandler = handler; - newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); - - handler = function (e) { - if (!L.DomEvent._checkMouse(obj, e)) { return; } - return originalHandler(e); - }; - - obj.addEventListener(newType, handler, false); - - } else if (type === 'click' && L.Browser.android) { - originalHandler = handler; - handler = function (e) { - return L.DomEvent._filterClick(e, originalHandler); - }; - - obj.addEventListener(type, handler, false); - } else { - obj.addEventListener(type, handler, false); - } - - } else if ('attachEvent' in obj) { - obj.attachEvent('on' + type, handler); - } - - obj[key] = handler; - - return this; - }, - - removeListener: function (obj, type, fn) { // (HTMLElement, String, Function) - - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler = obj[key]; - - if (!handler) { return this; } - - if (L.Browser.msTouch && type.indexOf('touch') === 0) { - this.removeMsTouchListener(obj, type, id); - } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { - this.removeDoubleTapListener(obj, id); - - } else if ('removeEventListener' in obj) { - - if (type === 'mousewheel') { - obj.removeEventListener('DOMMouseScroll', handler, false); - obj.removeEventListener(type, handler, false); - - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); - } else { - obj.removeEventListener(type, handler, false); - } - } else if ('detachEvent' in obj) { - obj.detachEvent('on' + type, handler); - } - - obj[key] = null; - - return this; - }, - - stopPropagation: function (e) { - - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; - } - return this; - }, - - disableClickPropagation: function (el) { - var stop = L.DomEvent.stopPropagation; - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.addListener(el, L.Draggable.START[i], stop); - } - - return L.DomEvent - .addListener(el, 'click', L.DomEvent._fakeStop) - .addListener(el, 'dblclick', stop); - }, - - preventDefault: function (e) { - - if (e.preventDefault) { - e.preventDefault(); - } else { - e.returnValue = false; - } - return this; - }, - - stop: function (e) { - return L.DomEvent.preventDefault(e).stopPropagation(e); - }, - - getMousePosition: function (e, container) { - - var ie7 = L.Browser.ie7, - body = document.body, - docEl = document.documentElement, - x = e.pageX ? e.pageX - body.scrollLeft - docEl.scrollLeft: e.clientX, - y = e.pageY ? e.pageY - body.scrollTop - docEl.scrollTop: e.clientY, - pos = new L.Point(x, y), - rect = container.getBoundingClientRect(), - left = rect.left - container.clientLeft, - top = rect.top - container.clientTop; - - // webkit (and ie <= 7) handles RTL scrollLeft different to everyone else - // https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js - if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) { - left += container.scrollWidth - container.clientWidth; - - // ie7 shows the scrollbar by default and provides clientWidth counting it, so we - // need to add it back in if it is visible; scrollbar is on the left as we are RTL - if (ie7 && L.DomUtil.getStyle(container, 'overflow-y') !== 'hidden' && - L.DomUtil.getStyle(container, 'overflow') !== 'hidden') { - left += 17; - } - } - - return pos._subtract(new L.Point(left, top)); - }, - - getWheelDelta: function (e) { - - var delta = 0; - - if (e.wheelDelta) { - delta = e.wheelDelta / 120; - } - if (e.detail) { - delta = -e.detail / 3; - } - return delta; - }, - - _skipEvents: {}, - - _fakeStop: function (e) { - // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e) - L.DomEvent._skipEvents[e.type] = true; - }, - - _skipped: function (e) { - var skipped = this._skipEvents[e.type]; - // reset when checking, as it's only used in map container and propagates outside of the map - this._skipEvents[e.type] = false; - return skipped; - }, - - // check if element really left/entered the event target (for mouseenter/mouseleave) - _checkMouse: function (el, e) { - - var related = e.relatedTarget; - - if (!related) { return true; } - - try { - while (related && (related !== el)) { - related = related.parentNode; - } - } catch (err) { - return false; - } - return (related !== el); - }, - - _getEvent: function () { // evil magic for IE - /*jshint noarg:false */ - var e = window.event; - if (!e) { - var caller = arguments.callee.caller; - while (caller) { - e = caller['arguments'][0]; - if (e && window.Event === e.constructor) { - break; - } - caller = caller.caller; - } - } - return e; - }, - - // this is a horrible workaround for a bug in Android where a single touch triggers two click events - _filterClick: function (e, handler) { - var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), - elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); - - // are they closer together than 1000ms yet more than 100ms? - // Android typically triggers them ~300ms apart while multiple listeners - // on the same event should be triggered far faster; - // or check if click is simulated on the element, and if it is, reject any non-simulated events - - if ((elapsed && elapsed > 100 && elapsed < 1000) || (e.target._simulatedClick && !e._simulated)) { - L.DomEvent.stop(e); - return; - } - L.DomEvent._lastClick = timeStamp; - - return handler(e); - } -}; - -L.DomEvent.on = L.DomEvent.addListener; -L.DomEvent.off = L.DomEvent.removeListener; - - -/* - * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too. - */ - -L.Draggable = L.Class.extend({ - includes: L.Mixin.Events, - - statics: { - START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], - END: { - mousedown: 'mouseup', - touchstart: 'touchend', - MSPointerDown: 'touchend' - }, - MOVE: { - mousedown: 'mousemove', - touchstart: 'touchmove', - MSPointerDown: 'touchmove' - } - }, - - initialize: function (element, dragStartTarget) { - this._element = element; - this._dragStartTarget = dragStartTarget || element; - }, - - enable: function () { - if (this._enabled) { return; } - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); - } - - this._enabled = true; - }, - - disable: function () { - if (!this._enabled) { return; } - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); - } - - this._enabled = false; - this._moved = false; - }, - - _onDown: function (e) { - if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } - - L.DomEvent - .stopPropagation(e); - - if (L.Draggable._disabled) { return; } - - L.DomUtil.disableImageDrag(); - L.DomUtil.disableTextSelection(); - - var first = e.touches ? e.touches[0] : e, - el = first.target; - - // if touching a link, highlight it - if (L.Browser.touch && el.tagName.toLowerCase() === 'a') { - L.DomUtil.addClass(el, 'leaflet-active'); - } - - this._moved = false; - - if (this._moving) { return; } - - this._startPoint = new L.Point(first.clientX, first.clientY); - this._startPos = this._newPos = L.DomUtil.getPosition(this._element); - - L.DomEvent - .on(document, L.Draggable.MOVE[e.type], this._onMove, this) - .on(document, L.Draggable.END[e.type], this._onUp, this); - }, - - _onMove: function (e) { - if (e.touches && e.touches.length > 1) { return; } - - var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), - newPoint = new L.Point(first.clientX, first.clientY), - offset = newPoint.subtract(this._startPoint); - - if (!offset.x && !offset.y) { return; } - - L.DomEvent.preventDefault(e); - - if (!this._moved) { - this.fire('dragstart'); - - this._moved = true; - this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); - - if (!L.Browser.touch) { - L.DomUtil.addClass(document.body, 'leaflet-dragging'); - } - } - - this._newPos = this._startPos.add(offset); - this._moving = true; - - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); - }, - - _updatePosition: function () { - this.fire('predrag'); - L.DomUtil.setPosition(this._element, this._newPos); - this.fire('drag'); - }, - - _onUp: function () { - if (!L.Browser.touch) { - L.DomUtil.removeClass(document.body, 'leaflet-dragging'); - } - - for (var i in L.Draggable.MOVE) { - L.DomEvent - .off(document, L.Draggable.MOVE[i], this._onMove) - .off(document, L.Draggable.END[i], this._onUp); - } - - L.DomUtil.enableImageDrag(); - L.DomUtil.enableTextSelection(); - - if (this._moved) { - // ensure drag is not fired after dragend - L.Util.cancelAnimFrame(this._animRequest); - - this.fire('dragend'); - } - - this._moving = false; - } -}); - - -/* - L.Handler is a base class for handler classes that are used internally to inject - interaction features like dragging to classes like Map and Marker. -*/ - -L.Handler = L.Class.extend({ - initialize: function (map) { - this._map = map; - }, - - enable: function () { - if (this._enabled) { return; } - - this._enabled = true; - this.addHooks(); - }, - - disable: function () { - if (!this._enabled) { return; } - - this._enabled = false; - this.removeHooks(); - }, - - enabled: function () { - return !!this._enabled; - } -}); - - -/* - * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. - */ - -L.Map.mergeOptions({ - dragging: true, - - inertia: !L.Browser.android23, - inertiaDeceleration: 3400, // px/s^2 - inertiaMaxSpeed: Infinity, // px/s - inertiaThreshold: L.Browser.touch ? 32 : 18, // ms - easeLinearity: 0.25, - - // TODO refactor, move to CRS - worldCopyJump: false -}); - -L.Map.Drag = L.Handler.extend({ - addHooks: function () { - if (!this._draggable) { - var map = this._map; - - this._draggable = new L.Draggable(map._mapPane, map._container); - - this._draggable.on({ - 'dragstart': this._onDragStart, - 'drag': this._onDrag, - 'dragend': this._onDragEnd - }, this); - - if (map.options.worldCopyJump) { - this._draggable.on('predrag', this._onPreDrag, this); - map.on('viewreset', this._onViewReset, this); - - this._onViewReset(); - } - } - this._draggable.enable(); - }, - - removeHooks: function () { - this._draggable.disable(); - }, - - moved: function () { - return this._draggable && this._draggable._moved; - }, - - _onDragStart: function () { - var map = this._map; - - if (map._panAnim) { - map._panAnim.stop(); - } - - map - .fire('movestart') - .fire('dragstart'); - - if (map.options.inertia) { - this._positions = []; - this._times = []; - } - }, - - _onDrag: function () { - if (this._map.options.inertia) { - var time = this._lastTime = +new Date(), - pos = this._lastPos = this._draggable._newPos; - - this._positions.push(pos); - this._times.push(time); - - if (time - this._times[0] > 200) { - this._positions.shift(); - this._times.shift(); - } - } - - this._map - .fire('move') - .fire('drag'); - }, - - _onViewReset: function () { - // TODO fix hardcoded Earth values - var pxCenter = this._map.getSize()._divideBy(2), - pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); - - this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; - this._worldWidth = this._map.project([0, 180]).x; - }, - - _onPreDrag: function () { - // TODO refactor to be able to adjust map pane position after zoom - var worldWidth = this._worldWidth, - halfWidth = Math.round(worldWidth / 2), - dx = this._initialWorldOffset, - x = this._draggable._newPos.x, - newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, - newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, - newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; - - this._draggable._newPos.x = newX; - }, - - _onDragEnd: function () { - var map = this._map, - options = map.options, - delay = +new Date() - this._lastTime, - - noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; - - map.fire('dragend'); - - if (noInertia) { - map.fire('moveend'); - - } else { - - var direction = this._lastPos.subtract(this._positions[0]), - duration = (this._lastTime + delay - this._times[0]) / 1000, - ease = options.easeLinearity, - - speedVector = direction.multiplyBy(ease / duration), - speed = speedVector.distanceTo([0, 0]), - - limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), - limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), - - decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), - offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); - - if (!offset.x || !offset.y) { - map.fire('moveend'); - - } else { - L.Util.requestAnimFrame(function () { - map.panBy(offset, { - duration: decelerationDuration, - easeLinearity: ease, - noMoveStart: true - }); - }); - } - } - } -}); - -L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); - - -/* - * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. - */ - -L.Map.mergeOptions({ - doubleClickZoom: true -}); - -L.Map.DoubleClickZoom = L.Handler.extend({ - addHooks: function () { - this._map.on('dblclick', this._onDoubleClick); - }, - - removeHooks: function () { - this._map.off('dblclick', this._onDoubleClick); - }, - - _onDoubleClick: function (e) { - this.setZoomAround(e.containerPoint, this._zoom + 1); - } -}); - -L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); - - -/* - * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. - */ - -L.Map.mergeOptions({ - scrollWheelZoom: true -}); - -L.Map.ScrollWheelZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); - L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - this._delta = 0; - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll); - L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - }, - - _onWheelScroll: function (e) { - var delta = L.DomEvent.getWheelDelta(e); - - this._delta += delta; - this._lastMousePos = this._map.mouseEventToContainerPoint(e); - - if (!this._startTime) { - this._startTime = +new Date(); - } - - var left = Math.max(40 - (+new Date() - this._startTime), 0); - - clearTimeout(this._timer); - this._timer = setTimeout(L.bind(this._performZoom, this), left); - - L.DomEvent.preventDefault(e); - L.DomEvent.stopPropagation(e); - }, - - _performZoom: function () { - var map = this._map, - delta = this._delta, - zoom = map.getZoom(); - - delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta); - delta = Math.max(Math.min(delta, 4), -4); - delta = map._limitZoom(zoom + delta) - zoom; - - this._delta = 0; - this._startTime = null; - - if (!delta) { return; } - - map.setZoomAround(this._lastMousePos, zoom + delta); - } -}); - -L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); - - -/* - * Extends the event handling code with double tap support for mobile browsers. - */ - -L.extend(L.DomEvent, { - - _touchstart: L.Browser.msTouch ? 'MSPointerDown' : 'touchstart', - _touchend: L.Browser.msTouch ? 'MSPointerUp' : 'touchend', - - // inspired by Zepto touch code by Thomas Fuchs - addDoubleTapListener: function (obj, handler, id) { - var last, - doubleTap = false, - delay = 250, - touch, - pre = '_leaflet_', - touchstart = this._touchstart, - touchend = this._touchend, - trackedTouches = []; - - function onTouchStart(e) { - var count; - - if (L.Browser.msTouch) { - trackedTouches.push(e.pointerId); - count = trackedTouches.length; - } else { - count = e.touches.length; - } - if (count > 1) { - return; - } - - var now = Date.now(), - delta = now - (last || now); - - touch = e.touches ? e.touches[0] : e; - doubleTap = (delta > 0 && delta <= delay); - last = now; - } - - function onTouchEnd(e) { - if (L.Browser.msTouch) { - var idx = trackedTouches.indexOf(e.pointerId); - if (idx === -1) { - return; - } - trackedTouches.splice(idx, 1); - } - - if (doubleTap) { - if (L.Browser.msTouch) { - // work around .type being readonly with MSPointer* events - var newTouch = { }, - prop; - - // jshint forin:false - for (var i in touch) { - prop = touch[i]; - if (typeof prop === 'function') { - newTouch[i] = prop.bind(touch); - } else { - newTouch[i] = prop; - } - } - touch = newTouch; - } - touch.type = 'dblclick'; - handler(touch); - last = null; - } - } - obj[pre + touchstart + id] = onTouchStart; - obj[pre + touchend + id] = onTouchEnd; - - // on msTouch we need to listen on the document, otherwise a drag starting on the map and moving off screen - // will not come through to us, so we will lose track of how many touches are ongoing - var endElement = L.Browser.msTouch ? document.documentElement : obj; - - obj.addEventListener(touchstart, onTouchStart, false); - endElement.addEventListener(touchend, onTouchEnd, false); - - if (L.Browser.msTouch) { - endElement.addEventListener('MSPointerCancel', onTouchEnd, false); - } - - return this; - }, - - removeDoubleTapListener: function (obj, id) { - var pre = '_leaflet_'; - - obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); - (L.Browser.msTouch ? document.documentElement : obj).removeEventListener( - this._touchend, obj[pre + this._touchend + id], false); - - if (L.Browser.msTouch) { - document.documentElement.removeEventListener('MSPointerCancel', obj[pre + this._touchend + id], false); - } - - return this; - } -}); - - -/* - * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. - */ - -L.extend(L.DomEvent, { - - _msTouches: [], - _msDocumentListener: false, - - // Provides a touch events wrapper for msPointer events. - // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 - - addMsTouchListener: function (obj, type, handler, id) { - - switch (type) { - case 'touchstart': - return this.addMsTouchListenerStart(obj, type, handler, id); - case 'touchend': - return this.addMsTouchListenerEnd(obj, type, handler, id); - case 'touchmove': - return this.addMsTouchListenerMove(obj, type, handler, id); - default: - throw 'Unknown touch event type'; - } - }, - - addMsTouchListenerStart: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._msTouches; - - var cb = function (e) { - - var alreadyInArray = false; - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - alreadyInArray = true; - break; - } - } - if (!alreadyInArray) { - touches.push(e); - } - - e.touches = touches.slice(); - e.changedTouches = [e]; - - handler(e); - }; - - obj[pre + 'touchstart' + id] = cb; - obj.addEventListener('MSPointerDown', cb, false); - - // need to also listen for end events to keep the _msTouches list accurate - // this needs to be on the body and never go away - if (!this._msDocumentListener) { - var internalCb = function (e) { - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches.splice(i, 1); - break; - } - } - }; - //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener('MSPointerUp', internalCb, false); - document.documentElement.addEventListener('MSPointerCancel', internalCb, false); - - this._msDocumentListener = true; - } - - return this; - }, - - addMsTouchListenerMove: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._msTouches; - - function cb(e) { - - // don't fire touch moves when mouse isn't down - if (e.pointerType === e.MSPOINTER_TYPE_MOUSE && e.buttons === 0) { return; } - - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches[i] = e; - break; - } - } - - e.touches = touches.slice(); - e.changedTouches = [e]; - - handler(e); - } - - obj[pre + 'touchmove' + id] = cb; - obj.addEventListener('MSPointerMove', cb, false); - - return this; - }, - - addMsTouchListenerEnd: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._msTouches; - - var cb = function (e) { - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches.splice(i, 1); - break; - } - } - - e.touches = touches.slice(); - e.changedTouches = [e]; - - handler(e); - }; - - obj[pre + 'touchend' + id] = cb; - obj.addEventListener('MSPointerUp', cb, false); - obj.addEventListener('MSPointerCancel', cb, false); - - return this; - }, - - removeMsTouchListener: function (obj, type, id) { - var pre = '_leaflet_', - cb = obj[pre + type + id]; - - switch (type) { - case 'touchstart': - obj.removeEventListener('MSPointerDown', cb, false); - break; - case 'touchmove': - obj.removeEventListener('MSPointerMove', cb, false); - break; - case 'touchend': - obj.removeEventListener('MSPointerUp', cb, false); - obj.removeEventListener('MSPointerCancel', cb, false); - break; - } - - return this; - } -}); - - -/* - * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. - */ - -L.Map.mergeOptions({ - touchZoom: L.Browser.touch && !L.Browser.android23 -}); - -L.Map.TouchZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); - }, - - _onTouchStart: function (e) { - var map = this._map; - - if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } - - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]), - viewCenter = map._getCenterLayerPoint(); - - this._startCenter = p1.add(p2)._divideBy(2); - this._startDist = p1.distanceTo(p2); - - this._moved = false; - this._zooming = true; - - this._centerOffset = viewCenter.subtract(this._startCenter); - - if (map._panAnim) { - map._panAnim.stop(); - } - - L.DomEvent - .on(document, 'touchmove', this._onTouchMove, this) - .on(document, 'touchend', this._onTouchEnd, this); - - L.DomEvent.preventDefault(e); - }, - - _onTouchMove: function (e) { - var map = this._map; - - if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } - - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]); - - this._scale = p1.distanceTo(p2) / this._startDist; - this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); - - if (this._scale === 1) { return; } - - if (!this._moved) { - L.DomUtil.addClass(map._mapPane, 'leaflet-touching'); - - map - .fire('movestart') - .fire('zoomstart'); - - this._moved = true; - } - - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame( - this._updateOnMove, this, true, this._map._container); - - L.DomEvent.preventDefault(e); - }, - - _updateOnMove: function () { - var map = this._map, - origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), - zoom = map.getScaleZoom(this._scale); - - map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta); - }, - - _onTouchEnd: function () { - if (!this._moved || !this._zooming) { - this._zooming = false; - return; - } - - var map = this._map; - - this._zooming = false; - L.DomUtil.removeClass(map._mapPane, 'leaflet-touching'); - L.Util.cancelAnimFrame(this._animRequest); - - L.DomEvent - .off(document, 'touchmove', this._onTouchMove) - .off(document, 'touchend', this._onTouchEnd); - - var origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), - - oldZoom = map.getZoom(), - floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom, - roundZoomDelta = (floatZoomDelta > 0 ? - Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)), - - zoom = map._limitZoom(oldZoom + roundZoomDelta), - scale = map.getZoomScale(zoom) / this._scale; - - map._animateZoom(center, zoom, origin, scale); - }, - - _getScaleOrigin: function () { - var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale); - return this._startCenter.add(centerOffset); - } -}); - -L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); - - -/* - * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. - */ - -L.Map.mergeOptions({ - tap: true, - tapTolerance: 15 -}); - -L.Map.Tap = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this); - }, - - _onDown: function (e) { - if (!e.touches) { return; } - - L.DomEvent.preventDefault(e); - - this._fireClick = true; - - // don't simulate click or track longpress if more than 1 touch - if (e.touches.length > 1) { - this._fireClick = false; - clearTimeout(this._holdTimeout); - return; - } - - var first = e.touches[0], - el = first.target; - - this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); - - // if touching a link, highlight it - if (el.tagName.toLowerCase() === 'a') { - L.DomUtil.addClass(el, 'leaflet-active'); - } - - // simulate long hold but setting a timeout - this._holdTimeout = setTimeout(L.bind(function () { - if (this._isTapValid()) { - this._fireClick = false; - this._onUp(); - this._simulateEvent('contextmenu', first); - } - }, this), 1000); - - L.DomEvent - .on(document, 'touchmove', this._onMove, this) - .on(document, 'touchend', this._onUp, this); - }, - - _onUp: function (e) { - clearTimeout(this._holdTimeout); - - L.DomEvent - .off(document, 'touchmove', this._onMove, this) - .off(document, 'touchend', this._onUp, this); - - if (this._fireClick && e && e.changedTouches) { - - var first = e.changedTouches[0], - el = first.target; - - if (el.tagName.toLowerCase() === 'a') { - L.DomUtil.removeClass(el, 'leaflet-active'); - } - - // simulate click if the touch didn't move too much - if (this._isTapValid()) { - this._simulateEvent('click', first); - } - } - }, - - _isTapValid: function () { - return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; - }, - - _onMove: function (e) { - var first = e.touches[0]; - this._newPos = new L.Point(first.clientX, first.clientY); - }, - - _simulateEvent: function (type, e) { - var simulatedEvent = document.createEvent('MouseEvents'); - - simulatedEvent._simulated = true; - e.target._simulatedClick = true; - - simulatedEvent.initMouseEvent( - type, true, true, window, 1, - e.screenX, e.screenY, - e.clientX, e.clientY, - false, false, false, false, 0, null); - - e.target.dispatchEvent(simulatedEvent); - } -}); - -if (L.Browser.touch && !L.Browser.msTouch) { - L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); -} - - -/* - * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map - * (zoom to a selected bounding box), enabled by default. - */ - -L.Map.mergeOptions({ - boxZoom: true -}); - -L.Map.BoxZoom = L.Handler.extend({ - initialize: function (map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - }, - - addHooks: function () { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); - }, - - _onMouseDown: function (e) { - if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - - this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); - L.DomUtil.setPosition(this._box, this._startLayerPoint); - - //TODO refactor: move cursor to styles - this._container.style.cursor = 'crosshair'; - - L.DomEvent - .on(document, 'mousemove', this._onMouseMove, this) - .on(document, 'mouseup', this._onMouseUp, this) - .on(document, 'keydown', this._onKeyDown, this); - - this._map.fire('boxzoomstart'); - }, - - _onMouseMove: function (e) { - var startPoint = this._startLayerPoint, - box = this._box, - - layerPoint = this._map.mouseEventToLayerPoint(e), - offset = layerPoint.subtract(startPoint), - - newPos = new L.Point( - Math.min(layerPoint.x, startPoint.x), - Math.min(layerPoint.y, startPoint.y)); - - L.DomUtil.setPosition(box, newPos); - - // TODO refactor: remove hardcoded 4 pixels - box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; - box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; - }, - - _finish: function () { - this._pane.removeChild(this._box); - this._container.style.cursor = ''; - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - - L.DomEvent - .off(document, 'mousemove', this._onMouseMove) - .off(document, 'mouseup', this._onMouseUp) - .off(document, 'keydown', this._onKeyDown); - }, - - _onMouseUp: function (e) { - - this._finish(); - - var map = this._map, - layerPoint = map.mouseEventToLayerPoint(e); - - if (this._startLayerPoint.equals(layerPoint)) { return; } - - var bounds = new L.LatLngBounds( - map.layerPointToLatLng(this._startLayerPoint), - map.layerPointToLatLng(layerPoint)); - - map.fitBounds(bounds); - - map.fire('boxzoomend', { - boxZoomBounds: bounds - }); - }, - - _onKeyDown: function (e) { - if (e.keyCode === 27) { - this._finish(); - } - } -}); - -L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); - - -/* - * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. - */ - -L.Map.mergeOptions({ - keyboard: true, - keyboardPanOffset: 80, - keyboardZoomOffset: 1 -}); - -L.Map.Keyboard = L.Handler.extend({ - - keyCodes: { - left: [37], - right: [39], - down: [40], - up: [38], - zoomIn: [187, 107, 61], - zoomOut: [189, 109, 173] - }, - - initialize: function (map) { - this._map = map; - - this._setPanOffset(map.options.keyboardPanOffset); - this._setZoomOffset(map.options.keyboardZoomOffset); - }, - - addHooks: function () { - var container = this._map._container; - - // make the container focusable by tabbing - if (container.tabIndex === -1) { - container.tabIndex = '0'; - } - - L.DomEvent - .on(container, 'focus', this._onFocus, this) - .on(container, 'blur', this._onBlur, this) - .on(container, 'mousedown', this._onMouseDown, this); - - this._map - .on('focus', this._addHooks, this) - .on('blur', this._removeHooks, this); - }, - - removeHooks: function () { - this._removeHooks(); - - var container = this._map._container; - - L.DomEvent - .off(container, 'focus', this._onFocus, this) - .off(container, 'blur', this._onBlur, this) - .off(container, 'mousedown', this._onMouseDown, this); - - this._map - .off('focus', this._addHooks, this) - .off('blur', this._removeHooks, this); - }, - - _onMouseDown: function () { - if (this._focused) { return; } - - var body = document.body, - docEl = document.documentElement, - top = body.scrollTop || docEl.scrollTop, - left = body.scrollLeft || docEl.scrollLeft; - - this._map._container.focus(); - - window.scrollTo(left, top); - }, - - _onFocus: function () { - this._focused = true; - this._map.fire('focus'); - }, - - _onBlur: function () { - this._focused = false; - this._map.fire('blur'); - }, - - _setPanOffset: function (pan) { - var keys = this._panKeys = {}, - codes = this.keyCodes, - i, len; - - for (i = 0, len = codes.left.length; i < len; i++) { - keys[codes.left[i]] = [-1 * pan, 0]; - } - for (i = 0, len = codes.right.length; i < len; i++) { - keys[codes.right[i]] = [pan, 0]; - } - for (i = 0, len = codes.down.length; i < len; i++) { - keys[codes.down[i]] = [0, pan]; - } - for (i = 0, len = codes.up.length; i < len; i++) { - keys[codes.up[i]] = [0, -1 * pan]; - } - }, - - _setZoomOffset: function (zoom) { - var keys = this._zoomKeys = {}, - codes = this.keyCodes, - i, len; - - for (i = 0, len = codes.zoomIn.length; i < len; i++) { - keys[codes.zoomIn[i]] = zoom; - } - for (i = 0, len = codes.zoomOut.length; i < len; i++) { - keys[codes.zoomOut[i]] = -zoom; - } - }, - - _addHooks: function () { - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - }, - - _removeHooks: function () { - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - }, - - _onKeyDown: function (e) { - var key = e.keyCode, - map = this._map; - - if (key in this._panKeys) { - - if (map._panAnim && map._panAnim._inProgress) { return; } - - map.panBy(this._panKeys[key]); - - if (map.options.maxBounds) { - map.panInsideBounds(map.options.maxBounds); - } - - } else if (key in this._zoomKeys) { - map.setZoom(map.getZoom() + this._zoomKeys[key]); - - } else { - return; - } - - L.DomEvent.stop(e); - } -}); - -L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); - - -/* - * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. - */ - -L.Handler.MarkerDrag = L.Handler.extend({ - initialize: function (marker) { - this._marker = marker; - }, - - addHooks: function () { - var icon = this._marker._icon; - if (!this._draggable) { - this._draggable = new L.Draggable(icon, icon); - } - - this._draggable - .on('dragstart', this._onDragStart, this) - .on('drag', this._onDrag, this) - .on('dragend', this._onDragEnd, this); - this._draggable.enable(); - }, - - removeHooks: function () { - this._draggable - .off('dragstart', this._onDragStart, this) - .off('drag', this._onDrag, this) - .off('dragend', this._onDragEnd, this); - - this._draggable.disable(); - }, - - moved: function () { - return this._draggable && this._draggable._moved; - }, - - _onDragStart: function () { - this._marker - .closePopup() - .fire('movestart') - .fire('dragstart'); - }, - - _onDrag: function () { - var marker = this._marker, - shadow = marker._shadow, - iconPos = L.DomUtil.getPosition(marker._icon), - latlng = marker._map.layerPointToLatLng(iconPos); - - // update shadow position - if (shadow) { - L.DomUtil.setPosition(shadow, iconPos); - } - - marker._latlng = latlng; - - marker - .fire('move', {latlng: latlng}) - .fire('drag'); - }, - - _onDragEnd: function () { - this._marker - .fire('moveend') - .fire('dragend'); - } -}); - - -/* - * L.Control is a base class for implementing map controls. Handles positioning. - * All other controls extend from this class. - */ - -L.Control = L.Class.extend({ - options: { - position: 'topright' - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - getPosition: function () { - return this.options.position; - }, - - setPosition: function (position) { - var map = this._map; - - if (map) { - map.removeControl(this); - } - - this.options.position = position; - - if (map) { - map.addControl(this); - } - - return this; - }, - - getContainer: function () { - return this._container; - }, - - addTo: function (map) { - this._map = map; - - var container = this._container = this.onAdd(map), - pos = this.getPosition(), - corner = map._controlCorners[pos]; - - L.DomUtil.addClass(container, 'leaflet-control'); - - if (pos.indexOf('bottom') !== -1) { - corner.insertBefore(container, corner.firstChild); - } else { - corner.appendChild(container); - } - - return this; - }, - - removeFrom: function (map) { - var pos = this.getPosition(), - corner = map._controlCorners[pos]; - - corner.removeChild(this._container); - this._map = null; - - if (this.onRemove) { - this.onRemove(map); - } - - return this; - } -}); - -L.control = function (options) { - return new L.Control(options); -}; - - -// adds control-related methods to L.Map - -L.Map.include({ - addControl: function (control) { - control.addTo(this); - return this; - }, - - removeControl: function (control) { - control.removeFrom(this); - return this; - }, - - _initControlPos: function () { - var corners = this._controlCorners = {}, - l = 'leaflet-', - container = this._controlContainer = - L.DomUtil.create('div', l + 'control-container', this._container); - - function createCorner(vSide, hSide) { - var className = l + vSide + ' ' + l + hSide; - - corners[vSide + hSide] = L.DomUtil.create('div', className, container); - } - - createCorner('top', 'left'); - createCorner('top', 'right'); - createCorner('bottom', 'left'); - createCorner('bottom', 'right'); - }, - - _clearControlPos: function () { - this._container.removeChild(this._controlContainer); - } -}); - - -/* - * L.Control.Zoom is used for the default zoom buttons on the map. - */ - -L.Control.Zoom = L.Control.extend({ - options: { - position: 'topleft' - }, - - onAdd: function (map) { - var zoomName = 'leaflet-control-zoom', - container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); - - this._map = map; - - this._zoomInButton = this._createButton( - '+', 'Zoom in', zoomName + '-in', container, this._zoomIn, this); - this._zoomOutButton = this._createButton( - '-', 'Zoom out', zoomName + '-out', container, this._zoomOut, this); - - map.on('zoomend zoomlevelschange', this._updateDisabled, this); - - return container; - }, - - onRemove: function (map) { - map.off('zoomend zoomlevelschange', this._updateDisabled, this); - }, - - _zoomIn: function (e) { - this._map.zoomIn(e.shiftKey ? 3 : 1); - }, - - _zoomOut: function (e) { - this._map.zoomOut(e.shiftKey ? 3 : 1); - }, - - _createButton: function (html, title, className, container, fn, context) { - var link = L.DomUtil.create('a', className, container); - link.innerHTML = html; - link.href = '#'; - link.title = title; - - var stop = L.DomEvent.stopPropagation; - - L.DomEvent - .on(link, 'click', stop) - .on(link, 'mousedown', stop) - .on(link, 'dblclick', stop) - .on(link, 'click', L.DomEvent.preventDefault) - .on(link, 'click', fn, context); - - return link; - }, - - _updateDisabled: function () { - var map = this._map, - className = 'leaflet-disabled'; - - L.DomUtil.removeClass(this._zoomInButton, className); - L.DomUtil.removeClass(this._zoomOutButton, className); - - if (map._zoom === map.getMinZoom()) { - L.DomUtil.addClass(this._zoomOutButton, className); - } - if (map._zoom === map.getMaxZoom()) { - L.DomUtil.addClass(this._zoomInButton, className); - } - } -}); - -L.Map.mergeOptions({ - zoomControl: true -}); - -L.Map.addInitHook(function () { - if (this.options.zoomControl) { - this.zoomControl = new L.Control.Zoom(); - this.addControl(this.zoomControl); - } -}); - -L.control.zoom = function (options) { - return new L.Control.Zoom(options); -}; - - - -/* - * L.Control.Attribution is used for displaying attribution on the map (added by default). - */ - -L.Control.Attribution = L.Control.extend({ - options: { - position: 'bottomright', - prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>' - }, - - initialize: function (options) { - L.setOptions(this, options); - - this._attributions = {}; - }, - - onAdd: function (map) { - this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); - L.DomEvent.disableClickPropagation(this._container); - - map - .on('layeradd', this._onLayerAdd, this) - .on('layerremove', this._onLayerRemove, this); - - this._update(); - - return this._container; - }, - - onRemove: function (map) { - map - .off('layeradd', this._onLayerAdd) - .off('layerremove', this._onLayerRemove); - - }, - - setPrefix: function (prefix) { - this.options.prefix = prefix; - this._update(); - return this; - }, - - addAttribution: function (text) { - if (!text) { return; } - - if (!this._attributions[text]) { - this._attributions[text] = 0; - } - this._attributions[text]++; - - this._update(); - - return this; - }, - - removeAttribution: function (text) { - if (!text) { return; } - - if (this._attributions[text]) { - this._attributions[text]--; - this._update(); - } - - return this; - }, - - _update: function () { - if (!this._map) { return; } - - var attribs = []; - - for (var i in this._attributions) { - if (this._attributions[i]) { - attribs.push(i); - } - } - - var prefixAndAttribs = []; - - if (this.options.prefix) { - prefixAndAttribs.push(this.options.prefix); - } - if (attribs.length) { - prefixAndAttribs.push(attribs.join(', ')); - } - - this._container.innerHTML = prefixAndAttribs.join(' | '); - }, - - _onLayerAdd: function (e) { - if (e.layer.getAttribution) { - this.addAttribution(e.layer.getAttribution()); - } - }, - - _onLayerRemove: function (e) { - if (e.layer.getAttribution) { - this.removeAttribution(e.layer.getAttribution()); - } - } -}); - -L.Map.mergeOptions({ - attributionControl: true -}); - -L.Map.addInitHook(function () { - if (this.options.attributionControl) { - this.attributionControl = (new L.Control.Attribution()).addTo(this); - } -}); - -L.control.attribution = function (options) { - return new L.Control.Attribution(options); -}; - - -/* - * L.Control.Scale is used for displaying metric/imperial scale on the map. - */ - -L.Control.Scale = L.Control.extend({ - options: { - position: 'bottomleft', - maxWidth: 100, - metric: true, - imperial: true, - updateWhenIdle: false - }, - - onAdd: function (map) { - this._map = map; - - var className = 'leaflet-control-scale', - container = L.DomUtil.create('div', className), - options = this.options; - - this._addScales(options, className, container); - - map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); - map.whenReady(this._update, this); - - return container; - }, - - onRemove: function (map) { - map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); - }, - - _addScales: function (options, className, container) { - if (options.metric) { - this._mScale = L.DomUtil.create('div', className + '-line', container); - } - if (options.imperial) { - this._iScale = L.DomUtil.create('div', className + '-line', container); - } - }, - - _update: function () { - var bounds = this._map.getBounds(), - centerLat = bounds.getCenter().lat, - halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), - dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180, - - size = this._map.getSize(), - options = this.options, - maxMeters = 0; - - if (size.x > 0) { - maxMeters = dist * (options.maxWidth / size.x); - } - - this._updateScales(options, maxMeters); - }, - - _updateScales: function (options, maxMeters) { - if (options.metric && maxMeters) { - this._updateMetric(maxMeters); - } - - if (options.imperial && maxMeters) { - this._updateImperial(maxMeters); - } - }, - - _updateMetric: function (maxMeters) { - var meters = this._getRoundNum(maxMeters); - - this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px'; - this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; - }, - - _updateImperial: function (maxMeters) { - var maxFeet = maxMeters * 3.2808399, - scale = this._iScale, - maxMiles, miles, feet; - - if (maxFeet > 5280) { - maxMiles = maxFeet / 5280; - miles = this._getRoundNum(maxMiles); - - scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px'; - scale.innerHTML = miles + ' mi'; - - } else { - feet = this._getRoundNum(maxFeet); - - scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px'; - scale.innerHTML = feet + ' ft'; - } - }, - - _getScaleWidth: function (ratio) { - return Math.round(this.options.maxWidth * ratio) - 10; - }, - - _getRoundNum: function (num) { - var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), - d = num / pow10; - - d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; - - return pow10 * d; - } -}); - -L.control.scale = function (options) { - return new L.Control.Scale(options); -}; - - -/* - * L.Control.Layers is a control to allow users to switch between different layers on the map. - */ - -L.Control.Layers = L.Control.extend({ - options: { - collapsed: true, - position: 'topright', - autoZIndex: true - }, - - initialize: function (baseLayers, overlays, options) { - L.setOptions(this, options); - - this._layers = {}; - this._lastZIndex = 0; - this._handlingClick = false; - - for (var i in baseLayers) { - this._addLayer(baseLayers[i], i); - } - - for (i in overlays) { - this._addLayer(overlays[i], i, true); - } - }, - - onAdd: function (map) { - this._initLayout(); - this._update(); - - map - .on('layeradd', this._onLayerChange, this) - .on('layerremove', this._onLayerChange, this); - - return this._container; - }, - - onRemove: function (map) { - map - .off('layeradd', this._onLayerChange) - .off('layerremove', this._onLayerChange); - }, - - addBaseLayer: function (layer, name) { - this._addLayer(layer, name); - this._update(); - return this; - }, - - addOverlay: function (layer, name) { - this._addLayer(layer, name, true); - this._update(); - return this; - }, - - removeLayer: function (layer) { - var id = L.stamp(layer); - delete this._layers[id]; - this._update(); - return this; - }, - - _initLayout: function () { - var className = 'leaflet-control-layers', - container = this._container = L.DomUtil.create('div', className); - - //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released - container.setAttribute('aria-haspopup', true); - - if (!L.Browser.touch) { - L.DomEvent.disableClickPropagation(container); - L.DomEvent.on(container, 'mousewheel', L.DomEvent.stopPropagation); - } else { - L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); - } - - var form = this._form = L.DomUtil.create('form', className + '-list'); - - if (this.options.collapsed) { - if (!L.Browser.android) { - L.DomEvent - .on(container, 'mouseover', this._expand, this) - .on(container, 'mouseout', this._collapse, this); - } - var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); - link.href = '#'; - link.title = 'Layers'; - - if (L.Browser.touch) { - L.DomEvent - .on(link, 'click', L.DomEvent.stop) - .on(link, 'click', this._expand, this); - } - else { - L.DomEvent.on(link, 'focus', this._expand, this); - } - - this._map.on('click', this._collapse, this); - // TODO keyboard accessibility - } else { - this._expand(); - } - - this._baseLayersList = L.DomUtil.create('div', className + '-base', form); - this._separator = L.DomUtil.create('div', className + '-separator', form); - this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); - - container.appendChild(form); - }, - - _addLayer: function (layer, name, overlay) { - var id = L.stamp(layer); - - this._layers[id] = { - layer: layer, - name: name, - overlay: overlay - }; - - if (this.options.autoZIndex && layer.setZIndex) { - this._lastZIndex++; - layer.setZIndex(this._lastZIndex); - } - }, - - _update: function () { - if (!this._container) { - return; - } - - this._baseLayersList.innerHTML = ''; - this._overlaysList.innerHTML = ''; - - var baseLayersPresent = false, - overlaysPresent = false, - i, obj; - - for (i in this._layers) { - obj = this._layers[i]; - this._addItem(obj); - overlaysPresent = overlaysPresent || obj.overlay; - baseLayersPresent = baseLayersPresent || !obj.overlay; - } - - this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; - }, - - _onLayerChange: function (e) { - var obj = this._layers[L.stamp(e.layer)]; - - if (!obj) { return; } - - if (!this._handlingClick) { - this._update(); - } - - var type = obj.overlay ? - (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') : - (e.type === 'layeradd' ? 'baselayerchange' : null); - - if (type) { - this._map.fire(type, obj); - } - }, - - // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) - _createRadioElement: function (name, checked) { - - var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' + name + '"'; - if (checked) { - radioHtml += ' checked="checked"'; - } - radioHtml += '/>'; - - var radioFragment = document.createElement('div'); - radioFragment.innerHTML = radioHtml; - - return radioFragment.firstChild; - }, - - _addItem: function (obj) { - var label = document.createElement('label'), - input, - checked = this._map.hasLayer(obj.layer); - - if (obj.overlay) { - input = document.createElement('input'); - input.type = 'checkbox'; - input.className = 'leaflet-control-layers-selector'; - input.defaultChecked = checked; - } else { - input = this._createRadioElement('leaflet-base-layers', checked); - } - - input.layerId = L.stamp(obj.layer); - - L.DomEvent.on(input, 'click', this._onInputClick, this); - - var name = document.createElement('span'); - name.innerHTML = ' ' + obj.name; - - label.appendChild(input); - label.appendChild(name); - - var container = obj.overlay ? this._overlaysList : this._baseLayersList; - container.appendChild(label); - - return label; - }, - - _onInputClick: function () { - var i, input, obj, - inputs = this._form.getElementsByTagName('input'), - inputsLen = inputs.length; - - this._handlingClick = true; - - for (i = 0; i < inputsLen; i++) { - input = inputs[i]; - obj = this._layers[input.layerId]; - - if (input.checked && !this._map.hasLayer(obj.layer)) { - this._map.addLayer(obj.layer); - - } else if (!input.checked && this._map.hasLayer(obj.layer)) { - this._map.removeLayer(obj.layer); - } - } - - this._handlingClick = false; - }, - - _expand: function () { - L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); - }, - - _collapse: function () { - this._container.className = this._container.className.replace(' leaflet-control-layers-expanded', ''); - } -}); - -L.control.layers = function (baseLayers, overlays, options) { - return new L.Control.Layers(baseLayers, overlays, options); -}; - - -/* - * L.PosAnimation is used by Leaflet internally for pan animations. - */ - -L.PosAnimation = L.Class.extend({ - includes: L.Mixin.Events, - - run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) - this.stop(); - - this._el = el; - this._inProgress = true; - this._newPos = newPos; - - this.fire('start'); - - el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) + - 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)'; - - L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); - L.DomUtil.setPosition(el, newPos); - - // toggle reflow, Chrome flickers for some reason if you don't do this - L.Util.falseFn(el.offsetWidth); - - // there's no native way to track value updates of transitioned properties, so we imitate this - this._stepTimer = setInterval(L.bind(this._onStep, this), 50); - }, - - stop: function () { - if (!this._inProgress) { return; } - - // if we just removed the transition property, the element would jump to its final position, - // so we need to make it stay at the current position - - L.DomUtil.setPosition(this._el, this._getPos()); - this._onTransitionEnd(); - L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation - }, - - _onStep: function () { - var stepPos = this._getPos(); - if (!stepPos) { - this._onTransitionEnd(); - return; - } - // jshint camelcase: false - // make L.DomUtil.getPosition return intermediate position value during animation - this._el._leaflet_pos = stepPos; - - this.fire('step'); - }, - - // you can't easily get intermediate values of properties animated with CSS3 Transitions, - // we need to parse computed style (in case of transform it returns matrix string) - - _transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/, - - _getPos: function () { - var left, top, matches, - el = this._el, - style = window.getComputedStyle(el); - - if (L.Browser.any3d) { - matches = style[L.DomUtil.TRANSFORM].match(this._transformRe); - if (!matches) { return; } - left = parseFloat(matches[1]); - top = parseFloat(matches[2]); - } else { - left = parseFloat(style.left); - top = parseFloat(style.top); - } - - return new L.Point(left, top, true); - }, - - _onTransitionEnd: function () { - L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); - - if (!this._inProgress) { return; } - this._inProgress = false; - - this._el.style[L.DomUtil.TRANSITION] = ''; - - // jshint camelcase: false - // make sure L.DomUtil.getPosition returns the final position value after animation - this._el._leaflet_pos = this._newPos; - - clearInterval(this._stepTimer); - - this.fire('step').fire('end'); - } - -}); - - -/* - * Extends L.Map to handle panning animations. - */ - -L.Map.include({ - - setView: function (center, zoom, options) { - - zoom = this._limitZoom(zoom); - center = L.latLng(center); - options = options || {}; - - if (this._panAnim) { - this._panAnim.stop(); - } - - if (this._loaded && !options.reset && options !== true) { - - if (options.animate !== undefined) { - options.zoom = L.extend({animate: options.animate}, options.zoom); - options.pan = L.extend({animate: options.animate}, options.pan); - } - - // try animating pan or zoom - var animated = (this._zoom !== zoom) ? - this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : - this._tryAnimatedPan(center, options.pan); - - if (animated) { - // prevent resize handler call, the view will refresh after animation anyway - clearTimeout(this._sizeTimer); - return this; - } - } - - // animation didn't start, just reset the map view - this._resetView(center, zoom); - - return this; - }, - - panBy: function (offset, options) { - offset = L.point(offset).round(); - options = options || {}; - - if (!offset.x && !offset.y) { - return this; - } - - if (!this._panAnim) { - this._panAnim = new L.PosAnimation(); - - this._panAnim.on({ - 'step': this._onPanTransitionStep, - 'end': this._onPanTransitionEnd - }, this); - } - - // don't fire movestart if animating inertia - if (!options.noMoveStart) { - this.fire('movestart'); - } - - // animate pan unless animate: false specified - if (options.animate !== false) { - L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); - - var newPos = this._getMapPanePos().subtract(offset); - this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); - } else { - this._rawPanBy(offset); - this.fire('move').fire('moveend'); - } - - return this; - }, - - _onPanTransitionStep: function () { - this.fire('move'); - }, - - _onPanTransitionEnd: function () { - L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim'); - this.fire('moveend'); - }, - - _tryAnimatedPan: function (center, options) { - // difference between the new and current centers in pixels - var offset = this._getCenterOffset(center)._floor(); - - // don't animate too far unless animate: true specified in options - if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } - - this.panBy(offset, options); - - return true; - } -}); - - -/* - * L.PosAnimation fallback implementation that powers Leaflet pan animations - * in browsers that don't support CSS3 Transitions. - */ - -L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({ - - run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) - this.stop(); - - this._el = el; - this._inProgress = true; - this._duration = duration || 0.25; - this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); - - this._startPos = L.DomUtil.getPosition(el); - this._offset = newPos.subtract(this._startPos); - this._startTime = +new Date(); - - this.fire('start'); - - this._animate(); - }, - - stop: function () { - if (!this._inProgress) { return; } - - this._step(); - this._complete(); - }, - - _animate: function () { - // animation loop - this._animId = L.Util.requestAnimFrame(this._animate, this); - this._step(); - }, - - _step: function () { - var elapsed = (+new Date()) - this._startTime, - duration = this._duration * 1000; - - if (elapsed < duration) { - this._runFrame(this._easeOut(elapsed / duration)); - } else { - this._runFrame(1); - this._complete(); - } - }, - - _runFrame: function (progress) { - var pos = this._startPos.add(this._offset.multiplyBy(progress)); - L.DomUtil.setPosition(this._el, pos); - - this.fire('step'); - }, - - _complete: function () { - L.Util.cancelAnimFrame(this._animId); - - this._inProgress = false; - this.fire('end'); - }, - - _easeOut: function (t) { - return 1 - Math.pow(1 - t, this._easeOutPower); - } -}); - - -/* - * Extends L.Map to handle zoom animations. - */ - -L.Map.mergeOptions({ - zoomAnimation: true, - zoomAnimationThreshold: 4 -}); - -if (L.DomUtil.TRANSITION) { - - L.Map.addInitHook(function () { - // don't animate on browsers without hardware-accelerated transitions or old Android/Opera - this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION && - L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera; - - // zoom transitions run with the same duration for all layers, so if one of transitionend events - // happens after starting zoom animation (propagating to the map pane), we know that it ended globally - if (this._zoomAnimated) { - L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this); - } - }); -} - -L.Map.include(!L.DomUtil.TRANSITION ? {} : { - - _catchTransitionEnd: function () { - if (this._animatingZoom) { - this._onZoomTransitionEnd(); - } - }, - - _nothingToAnimate: function () { - return !this._container.getElementsByClassName('leaflet-zoom-animated').length; - }, - - _tryAnimatedZoom: function (center, zoom, options) { - - if (this._animatingZoom) { return true; } - - options = options || {}; - - // don't animate if disabled, not supported or zoom difference is too large - if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || - Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } - - // offset is the pixel coords of the zoom origin relative to the current center - var scale = this.getZoomScale(zoom), - offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale), - origin = this._getCenterLayerPoint()._add(offset); - - // don't animate if the zoom origin isn't within one screen from the current center, unless forced - if (options.animate !== true && !this.getSize().contains(offset)) { return false; } - - this - .fire('movestart') - .fire('zoomstart'); - - this._animateZoom(center, zoom, origin, scale, null, true); - - return true; - }, - - _animateZoom: function (center, zoom, origin, scale, delta, backwards) { - - this._animatingZoom = true; - - // put transform transition on all layers with leaflet-zoom-animated class - L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); - - // remember what center/zoom to set after animation - this._animateToCenter = center; - this._animateToZoom = zoom; - - // disable any dragging during animation - if (L.Draggable) { - L.Draggable._disabled = true; - } - - this.fire('zoomanim', { - center: center, - zoom: zoom, - origin: origin, - scale: scale, - delta: delta, - backwards: backwards - }); - }, - - _onZoomTransitionEnd: function () { - - this._animatingZoom = false; - - L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); - - this._resetView(this._animateToCenter, this._animateToZoom, true, true); - - if (L.Draggable) { - L.Draggable._disabled = false; - } - } -}); - - -/* - Zoom animation logic for L.TileLayer. -*/ - -L.TileLayer.include({ - _animateZoom: function (e) { - if (!this._animating) { - this._animating = true; - this._prepareBgBuffer(); - } - - var bg = this._bgBuffer, - transform = L.DomUtil.TRANSFORM, - initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], - scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); - - bg.style[transform] = e.backwards ? - scaleStr + ' ' + initialTransform : - initialTransform + ' ' + scaleStr; - }, - - _endZoomAnim: function () { - var front = this._tileContainer, - bg = this._bgBuffer; - - front.style.visibility = ''; - front.parentNode.appendChild(front); // Bring to fore - - // force reflow - L.Util.falseFn(bg.offsetWidth); - - this._animating = false; - }, - - _clearBgBuffer: function () { - var map = this._map; - - if (map && !map._animatingZoom && !map.touchZoom._zooming) { - this._bgBuffer.innerHTML = ''; - this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; - } - }, - - _prepareBgBuffer: function () { - - var front = this._tileContainer, - bg = this._bgBuffer; - - // if foreground layer doesn't have many tiles but bg layer does, - // keep the existing bg layer and just zoom it some more - - var bgLoaded = this._getLoadedTilesPercentage(bg), - frontLoaded = this._getLoadedTilesPercentage(front); - - if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { - - front.style.visibility = 'hidden'; - this._stopLoadingImages(front); - return; - } - - // prepare the buffer to become the front tile pane - bg.style.visibility = 'hidden'; - bg.style[L.DomUtil.TRANSFORM] = ''; - - // switch out the current layer to be the new bg layer (and vice-versa) - this._tileContainer = bg; - bg = this._bgBuffer = front; - - this._stopLoadingImages(bg); - - //prevent bg buffer from clearing right after zoom - clearTimeout(this._clearBgBufferTimer); - }, - - _getLoadedTilesPercentage: function (container) { - var tiles = container.getElementsByTagName('img'), - i, len, count = 0; - - for (i = 0, len = tiles.length; i < len; i++) { - if (tiles[i].complete) { - count++; - } - } - return count / len; - }, - - // stops loading all tiles in the background layer - _stopLoadingImages: function (container) { - var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), - i, len, tile; - - for (i = 0, len = tiles.length; i < len; i++) { - tile = tiles[i]; - - if (!tile.complete) { - tile.onload = L.Util.falseFn; - tile.onerror = L.Util.falseFn; - tile.src = L.Util.emptyImageUrl; - - tile.parentNode.removeChild(tile); - } - } - } -}); - - -/* - * Provides L.Map with convenient shortcuts for using browser geolocation features. - */ - -L.Map.include({ - _defaultLocateOptions: { - watch: false, - setView: false, - maxZoom: Infinity, - timeout: 10000, - maximumAge: 0, - enableHighAccuracy: false - }, - - locate: function (/*Object*/ options) { - - options = this._locateOptions = L.extend(this._defaultLocateOptions, options); - - if (!navigator.geolocation) { - this._handleGeolocationError({ - code: 0, - message: 'Geolocation not supported.' - }); - return this; - } - - var onResponse = L.bind(this._handleGeolocationResponse, this), - onError = L.bind(this._handleGeolocationError, this); - - if (options.watch) { - this._locationWatchId = - navigator.geolocation.watchPosition(onResponse, onError, options); - } else { - navigator.geolocation.getCurrentPosition(onResponse, onError, options); - } - return this; - }, - - stopLocate: function () { - if (navigator.geolocation) { - navigator.geolocation.clearWatch(this._locationWatchId); - } - if (this._locateOptions) { - this._locateOptions.setView = false; - } - return this; - }, - - _handleGeolocationError: function (error) { - var c = error.code, - message = error.message || - (c === 1 ? 'permission denied' : - (c === 2 ? 'position unavailable' : 'timeout')); - - if (this._locateOptions.setView && !this._loaded) { - this.fitWorld(); - } - - this.fire('locationerror', { - code: c, - message: 'Geolocation error: ' + message + '.' - }); - }, - - _handleGeolocationResponse: function (pos) { - var lat = pos.coords.latitude, - lng = pos.coords.longitude, - latlng = new L.LatLng(lat, lng), - - latAccuracy = 180 * pos.coords.accuracy / 40075017, - lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat), - - bounds = L.latLngBounds( - [lat - latAccuracy, lng - lngAccuracy], - [lat + latAccuracy, lng + lngAccuracy]), - - options = this._locateOptions; - - if (options.setView) { - var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom); - this.setView(latlng, zoom); - } - - var data = { - latlng: latlng, - bounds: bounds - }; - - for (var i in pos.coords) { - if (typeof pos.coords[i] === 'number') { - data[i] = pos.coords[i]; - } - } - - this.fire('locationfound', data); - } -}); - - -}(window, document)); \ No newline at end of file
--- a/fujix/leaflet/leaflet.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,467 +0,0 @@ -/* required styles */ - -.leaflet-map-pane, -.leaflet-tile, -.leaflet-marker-icon, -.leaflet-marker-shadow, -.leaflet-tile-pane, -.leaflet-tile-container, -.leaflet-overlay-pane, -.leaflet-shadow-pane, -.leaflet-marker-pane, -.leaflet-popup-pane, -.leaflet-overlay-pane svg, -.leaflet-zoom-box, -.leaflet-image-layer, -.leaflet-layer { - position: absolute; - left: 0; - top: 0; - } -.leaflet-container { - overflow: hidden; - -ms-touch-action: none; - } -.leaflet-tile, -.leaflet-marker-icon, -.leaflet-marker-shadow { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - -webkit-user-drag: none; - } -.leaflet-marker-icon, -.leaflet-marker-shadow { - display: block; - } -/* map is broken in FF if you have max-width: 100% on tiles */ -.leaflet-container img { - max-width: none !important; - } -/* stupid Android 2 doesn't understand "max-width: none" properly */ -.leaflet-container img.leaflet-image-layer { - max-width: 15000px !important; - } -.leaflet-tile { - filter: inherit; - visibility: hidden; - } -.leaflet-tile-loaded { - visibility: inherit; - } -.leaflet-zoom-box { - width: 0; - height: 0; - } -/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ -.leaflet-overlay-pane svg { - -moz-user-select: none; - } - -.leaflet-tile-pane { z-index: 2; } -.leaflet-objects-pane { z-index: 3; } -.leaflet-overlay-pane { z-index: 4; } -.leaflet-shadow-pane { z-index: 5; } -.leaflet-marker-pane { z-index: 6; } -.leaflet-popup-pane { z-index: 7; } - - -/* control positioning */ - -.leaflet-control { - position: relative; - z-index: 7; - 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, -.leaflet-fade-anim .leaflet-popup { - opacity: 0; - -webkit-transition: opacity 0.2s linear; - -moz-transition: opacity 0.2s linear; - -o-transition: opacity 0.2s linear; - transition: opacity 0.2s linear; - } -.leaflet-fade-anim .leaflet-tile-loaded, -.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { - opacity: 1; - } - -.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); - -o-transition: -o-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, -.leaflet-touching .leaflet-zoom-animated { - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; - } - -.leaflet-zoom-anim .leaflet-zoom-hide { - visibility: hidden; - } - - -/* cursors */ - -.leaflet-clickable { - cursor: pointer; - } -.leaflet-container { - cursor: -webkit-grab; - cursor: -moz-grab; - } -.leaflet-popup-pane, -.leaflet-control { - cursor: auto; - } -.leaflet-dragging, -.leaflet-dragging .leaflet-clickable, -.leaflet-dragging .leaflet-container { - cursor: move; - cursor: -webkit-grabbing; - cursor: -moz-grabbing; - } - - -/* 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 #05f; - background: white; - opacity: 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 7px rgba(0,0,0,0.65); - -webkit-border-radius: 4px; - 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 { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - } -.leaflet-bar a:last-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-bottom-right-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 { - -webkit-border-radius: 10px; - border-radius: 10px; - } -.leaflet-touch .leaflet-bar a { - width: 30px; - height: 30px; - } -.leaflet-touch .leaflet-bar a:first-child { - -webkit-border-top-left-radius: 7px; - border-top-left-radius: 7px; - -webkit-border-top-right-radius: 7px; - border-top-right-radius: 7px; - } -.leaflet-touch .leaflet-bar a:last-child { - -webkit-border-bottom-left-radius: 7px; - border-bottom-left-radius: 7px; - -webkit-border-bottom-right-radius: 7px; - border-bottom-right-radius: 7px; - border-bottom: none; - } - - -/* zoom control */ - -.leaflet-control-zoom-in { - font: bold 18px 'Lucida Console', Monaco, monospace; - } -.leaflet-control-zoom-out { - font: bold 22px 'Lucida Console', Monaco, monospace; - } - -.leaflet-touch .leaflet-control-zoom-in { - font-size: 22px; - line-height: 30px; - } -.leaflet-touch .leaflet-control-zoom-out { - font-size: 28px; - line-height: 30px; - } - - -/* layers control */ - -.leaflet-control-layers { - box-shadow: 0 1px 7px rgba(0,0,0,0.4); - background: #f8f8f9; - -webkit-border-radius: 5px; - 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-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; - } - - -/* attribution and scale controls */ - -.leaflet-container .leaflet-control-attribution { - background-color: rgba(255, 255, 255, 0.7); - box-shadow: 0 0 5px #bbb; - margin: 0; - } -.leaflet-control-attribution, -.leaflet-control-scale-line { - padding: 0 5px; - color: #333; - } -.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; - color: black; - line-height: 1.1; - padding: 2px 5px 1px; - font-size: 11px; - text-shadow: 1px 1px 1px #fff; - background-color: rgba(255, 255, 255, 0.5); - box-shadow: 0 -1px 5px rgba(0, 0, 0, 0.2); - white-space: nowrap; - overflow: hidden; - } -.leaflet-control-scale-line:not(:first-child) { - border-top: 2px solid #777; - border-bottom: none; - margin-top: -2px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); - } -.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: 4px solid rgba(0,0,0,0.3); - } - - -/* popup */ - -.leaflet-popup { - position: absolute; - text-align: center; - } -.leaflet-popup-content-wrapper { - padding: 1px; - text-align: left; - -webkit-border-radius: 12px; - border-radius: 12px; - } -.leaflet-popup-content { - margin: 13px 19px; - line-height: 1.4; - } -.leaflet-popup-content p { - margin: 18px 0; - } -.leaflet-popup-tip-container { - margin: 0 auto; - width: 40px; - height: 20px; - position: relative; - overflow: hidden; - } -.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); - -o-transform: rotate(45deg); - transform: rotate(45deg); - } -.leaflet-popup-content-wrapper, .leaflet-popup-tip { - background: white; - - 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; - 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; - } - - -/* div icon */ - -.leaflet-div-icon { - background: #fff; - border: 1px solid #666; - } -.leaflet-editing-icon { - -webkit-border-radius: 2px; - border-radius: 2px; - }
--- a/fujix/leaflet/leaflet.ie.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -.leaflet-vml-shape { - width: 1px; - height: 1px; - } -.lvml { - behavior: url(#default#VML); - display: inline-block; - position: absolute; - } - -.leaflet-control { - display: inline; - } - -.leaflet-popup-tip { - width: 21px; - _width: 27px; - margin: 0 auto; - _margin-top: -3px; - - filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); - -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; - } -.leaflet-popup-tip-container { - margin-top: -1px; - } -.leaflet-popup-content-wrapper, .leaflet-popup-tip { - border: 1px solid #999; - } -.leaflet-popup-content-wrapper { - zoom: 1; - } - -.leaflet-control-zoom, -.leaflet-control-layers { - border: 3px solid #999; - } -.leaflet-control-layers-toggle { - } -.leaflet-control-attribution, -.leaflet-control-layers, -.leaflet-control-scale-line { - background: white; - } -.leaflet-zoom-box { - filter: alpha(opacity=50); - } -.leaflet-control-attribution { - border-top: 1px solid #bbb; - border-left: 1px solid #bbb; - }
--- a/fujix/leaflet/leaflet.js Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -/* - Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com - (c) 2010-2013, Vladimir Agafonkin - (c) 2010-2011, CloudMade -*/ -!function(t,e,i){var n=t.L,o={};o.version="0.6.4","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;i<o.length&&!n;i++)n=t[o[i]+e];return n}function i(e){var i=+new Date,o=Math.max(0,16-(i-n));return n=i+o,t.setTimeout(e,o)}var n=0,s=t.requestAnimationFrame||e("RequestAnimationFrame")||i,a=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};o.Util.requestAnimFrame=function(e,n,a,r){return e=o.bind(e,n),a&&s===i?(e(),void 0):s.call(t,e,r)},o.Util.cancelAnimFrame=function(e){e&&a.call(t,e)}}(),o.extend=o.Util.extend,o.bind=o.Util.bind,o.stamp=o.Util.stamp,o.setOptions=o.Util.setOptions,o.Class=function(){},o.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var n=new i;n.constructor=e,e.prototype=n;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(o.extend(e,t.statics),delete t.statics),t.includes&&(o.Util.extend.apply(null,[n].concat(t.includes)),delete t.includes),t.options&&n.options&&(t.options=o.extend({},n.options,t.options)),o.extend(n,t),n._initHooks=[];var a=this;return e.__super__=a.prototype,n.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=n._initHooks.length;e>t;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],i?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=i&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n=!!t.ActiveXObject,s=n&&!t.XMLHttpRequest,a=n&&!e.querySelector,r=n&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("phantom"),d=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",m=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,L="MozPerspective"in g.style,P="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||L||P)&&!c,w=!t.L_NO_TOUCH&&!c&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ie6:s,ie7:a,ielt9:r,webkit:l,android:d,android23:p,chrome:u,ie3d:v,webkit3d:y,gecko3d:L,opera3d:P,any3d:x,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&y,mobileOpera:_&&t.opera,touch:w,msTouch:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(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},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},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(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 o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement,l=o.Browser.ie7;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var u=o.DomUtil.getStyle(a,"width"),c=o.DomUtil.getStyle(a,"max-width"),d=a.getBoundingClientRect();("none"!==u||"none"!==c)&&(s+=d.left+a.clientLeft),n+=d.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==o.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){return t.className.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){o.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){t.className=o.Util.trim((" "+t.className+" ").replace(" "+e+" "," "))},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;n<t.length;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=o.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",n=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+n},getScaleString:function(t,e){var i=o.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),n=" scale("+t+") ";return i+n},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&o.Browser.any3d?(t.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(e),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},o.DomUtil.TRANSFORM=o.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),o.DomUtil.TRANSITION=o.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),o.DomUtil.TRANSITION_END="webkitTransition"===o.DomUtil.TRANSITION||"OTransition"===o.DomUtil.TRANSITION?o.DomUtil.TRANSITION+"End":"transitionend",function(){var i=o.DomUtil.testProp(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);o.extend(o.DomUtil,{disableTextSelection:function(){if(o.DomEvent.on(t,"selectstart",o.DomEvent.preventDefault),i){var n=e.documentElement.style;this._userSelect=n[i],n[i]="none"}},enableTextSelection:function(){o.DomEvent.off(t,"selectstart",o.DomEvent.preventDefault),i&&(e.documentElement.style[i]=this._userSelect,delete this._userSelect)},disableImageDrag:function(){o.DomEvent.on(t,"dragstart",o.DomEvent.preventDefault)},enableImageDrag:function(){o.DomEvent.off(t,"dragstart",o.DomEvent.preventDefault)}})}(),o.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},o.extend(o.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),o.LatLng.prototype={equals:function(t){if(!t)return!1;t=o.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return e<=o.LatLng.MAX_MARGIN},toString:function(t){return"LatLng("+o.Util.formatNum(this.lat,t)+", "+o.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=o.latLng(t);var e=6378137,i=o.LatLng.DEG_TO_RAD,n=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(n/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?new o.LatLng(t[0],t[1]):t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){return t?(t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this):this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this.setView(this.getCenter(),t,{zoom:e})},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t,e){if(t=o.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this.off("moveend",this._panInsideMaxBounds,this),this;var i=this.getBoundsZoom(t,!0);return this._boundsMinZoom=i,this._loaded&&(this._zoom<i?this.setView(t.getCenter(),i,e):this.panInsideBounds(t)),this.on("moveend",this._panInsideMaxBounds,this),this},panInsideBounds:function(t){t=o.latLngBounds(t);var e=this.getPixelBounds(),i=e.getBottomLeft(),n=e.getTopRight(),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return n.y<a.y&&(h=Math.ceil(a.y-n.y)),n.x>a.x&&(r=Math.floor(a.x-n.x)),i.y>s.y&&(h=Math.floor(s.y-i.y)),i.x<s.x&&(r=Math.ceil(s.x-i.x)),r||h?this.panBy([r,h]):this},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);if(this._layers[e])return this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();if(this._sizeChanged=!0,this.options.maxBounds&&this.setMaxBounds(this.options.maxBounds),!this._loaded)return this;var i=this.getSize(),n=e.subtract(i).divideBy(2).round();return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(e){var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this}},remove:function(){return this._loaded&&this.fire("unload"),this._initEvents("off"),delete this._container._leaflet,this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._moved()?this.layerPointToLatLng(this._getCenterLayerPoint()):this._initialCenter},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){var t=this._layersMinZoom===i?0:this._layersMinZoom,e=this._boundsMinZoom===i?0:this._boundsMinZoom;return this.options.minZoom===i?Math.max(t,e):this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x<r.x||n.y<r.y:r.contains(n);while(u&&a>=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(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 e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&this.dragging&&this.dragging.moved()||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new o.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update() -},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container leaflet-zoom-animated";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||e<this.options.minZoom)){var n=o.bounds(t.min.divideBy(i)._floor(),t.max.divideBy(i)._floor());this._addTilesFromCenterOut(n),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(n)}}},_addTilesFromCenterOut:function(t){var i,n,s,a=[],r=t.getCenter();for(i=t.min.y;i<=t.max.y;i++)for(n=t.min.x;n<=t.max.x;n++)s=new o.Point(n,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,n=0;h>n;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i)||t.y<0||t.y>=i)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(i<t.min.x||i>t.max.x||n<t.min.y||n>t.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs;var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,n=this.options.tileSize,s=t.multiplyBy(n),a=s.add([n,n]),r=this._crs.project(i.unproject(s,e)),h=this._crs.project(i.unproject(a,e)),l=[r.x,h.y,h.x,r.y].join(","),u=o.Util.template(this._url,{s:this._getSubdomain(t)});return u+o.Util.getParamString(this.wmsParams,u,!0)+"&BBOX="+l},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return o.Browser.ie6?(i||(i=e.createElement("div")),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i||(i=e.createElement("img")),i.src=t),i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)o.DomEvent.on(t,e[i],this._fireMouseEvent,this);o.Handler.MarkerDrag&&(this.dragging=new o.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&o.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t,latlng:this._latlng})},_onKeyPress:function(t){13===t.keyCode&&this.fire("click",{originalEvent:t,latlng:this._latlng})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t,latlng:this._latlng}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&o.DomEvent.preventDefault(t),"mousedown"!==t.type?o.DomEvent.stopPropagation(t):o.DomEvent.preventDefault(t)},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){o.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&o.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),o.marker=function(t,e){return new o.Marker(t,e)},o.DivIcon=o.Icon.extend({options:{iconSize:[12,12],className:"leaflet-div-icon",html:!1},createIcon:function(t){var i=t&&"DIV"===t.tagName?t:e.createElement("div"),n=this.options;return i.innerHTML=n.html!==!1?n.html:"",n.bgPos&&(i.style.backgroundPosition=-n.bgPos.x+"px "+-n.bgPos.y+"px"),this._setIconStyles(i,"icon"),i},createShadow:function(){return null}}),o.divIcon=function(t){return new o.DivIcon(t)},o.Map.mergeOptions({closePopupOnClick:!0}),o.Popup=o.Class.extend({includes:o.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:[0,7],autoPanPadding:[5,5],keepInView:!1,className:"",zoomAnimation:!0},initialize:function(t,e){o.setOptions(this,t),this._source=e,this._animated=o.Browser.any3d&&this.options.zoomAnimation,this._isOpen=!1},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&o.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on(this._getEvents(),this),this._update(),e&&o.DomUtil.setOpacity(this._container,1),this.fire("open"),t.fire("popupopen",{popup:this}),this._source&&this._source.fire("popupopen",{popup:this})},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),o.Util.falseFn(this._container.offsetWidth),t.off(this._getEvents(),this),t.options.fadeAnimation&&o.DomUtil.setOpacity(this._container,0),this._map=null,this.fire("close"),t.fire("popupclose",{popup:this}),this._source&&this._source.fire("popupclose",{popup:this})},setLatLng:function(t){return this._latlng=o.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_getEvents:function(){var t={viewreset:this._updatePosition};return this._animated&&(t.zoomanim=this._zoomAnimation),("closeOnClick"in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),n=this._container=o.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=o.DomUtil.create("a",e+"-close-button",n),t.href="#close",t.innerHTML="×",o.DomEvent.disableClickPropagation(t),o.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=o.DomUtil.create("div",e+"-content-wrapper",n);o.DomEvent.disableClickPropagation(s),this._contentNode=o.DomUtil.create("div",e+"-content",s),o.DomEvent.on(this._contentNode,"mousewheel",o.DomEvent.stopPropagation),o.DomEvent.on(this._contentNode,"MozMousePixelScroll",o.DomEvent.stopPropagation),o.DomEvent.on(s,"contextmenu",o.DomEvent.stopPropagation),this._tipContainer=o.DomUtil.create("div",e+"-tip-container",n),this._tip=o.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var n=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&n>s?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=t.getSize(),h=0,l=0;s.x+i>r.x&&(h=s.x+i-r.x+a.x),s.x-h<0&&(h=s.x-a.x),s.y+e>r.y&&(l=s.y+e-r.y+a.y),s.y-l<0&&(l=s.y-a.y),(h||l)&&t.fire("autopanstart").panBy([h,l])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popup||this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:(t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e<t.length;e++)o.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),n=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(n);this.fire(t.type,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&o.DomEvent.preventDefault(t),"mousemove"!==t.type&&o.DomEvent.stopPropagation(t)}}}),o.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=o.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&o.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,n=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;o.Browser.mobileWebkit&&r.removeChild(a),o.DomUtil.setPosition(a,e),a.setAttribute("width",n),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,n,s].join(" ")),o.Browser.mobileWebkit&&r.appendChild(a)}}}),o.Path.include({bindPopup:function(t,e){return t instanceof o.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new o.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),o.Browser.vml=!o.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape"); -o.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.x<e.min.x?i|=1:t.x>e.max.x&&(i|=2),t.y<e.min.y?i|=4:t.y>e.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){var i,n,s;if(o.Polyline.prototype.initialize.call(this,t,e),t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),i=0,n=this._holes.length;n>i;i++)s=this._holes[i]=this._convertLatLngs(this._holes[i]),s[0].equals(s[s.length-1])&&s.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+e<t.min.x||i.y+e<t.min.y}}),o.circle=function(t,e,i){return new o.Circle(t,e,i)},o.CircleMarker=o.Circle.extend({options:{radius:10,weight:2},initialize:function(t,e){o.Circle.prototype.initialize.call(this,t,null,e),this._radius=this.options.radius},projectLatlngs:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_updateStyle:function(){o.Circle.prototype._updateStyle.call(this),this.setRadius(this.options.radius)},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()}}),o.circleMarker=function(t,e){return new o.CircleMarker(t,e)},o.Polyline.include(o.Path.CANVAS?{_containsPoint:function(t,e){var i,n,s,a,r,h,l,u=this.options.weight/2;for(o.Browser.touch&&(u+=10),i=0,a=this._parts.length;a>i;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i){var n,s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return n=i(u),e?e(t,n):new o.Marker(n);case"MultiPoint":for(a=0,r=u.length;r>a;a++)n=i(u[a]),h=e?e(t,n):new o.Marker(n),c.push(h);return new o.FeatureGroup(c);case"LineString":return s=this.coordsToLatLngs(u,0,i),new o.Polyline(s);case"Polygon":return s=this.coordsToLatLngs(u,1,i),new o.Polygon(s);case"MultiLineString":return s=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(s);case"MultiPolygon":return s=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(s);case"GeometryCollection":for(a=0,r=l.geometries.length;r>a;a++)h=this.geometryToLayer({geometry:l.geometries[a],type:"Feature",properties:t.properties},e,i),c.push(h);return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){return[t.lng,t.lat]},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t,e){t.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){t.push(e.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:e,coordinates:t})}})}t(o.MultiPolyline,"MultiLineString"),t(o.MultiPolygon,"MultiPolygon")}(),o.LayerGroup.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){e.toGeoJSON&&t.push(o.GeoJSON.asFeature(e.toGeoJSON()))}),{type:"FeatureCollection",features:t}}}),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.addListener(t,o.Draggable.START[i],e);return o.DomEvent.addListener(t,"click",o.DomEvent._fakeStop).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=o.Browser.ie7,s=e.body,a=e.documentElement,r=t.pageX?t.pageX-s.scrollLeft-a.scrollLeft:t.clientX,h=t.pageY?t.pageY-s.scrollTop-a.scrollTop:t.clientY,l=new o.Point(r,h),u=i.getBoundingClientRect(),c=u.left-i.clientLeft,d=u.top-i.clientTop;return o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!n||(c+=i.scrollWidth-i.clientWidth,n&&"hidden"!==o.DomUtil.getStyle(i,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(i,"overflow")&&(c+=17)),l._subtract(new o.Point(c,d))},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!t.shiftKey&&(1===t.which||1===t.button||t.touches)&&(o.DomEvent.stopPropagation(t),!o.Draggable._disabled)){o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection();var i=t.touches?t.touches[0]:t,n=i.target;o.Browser.touch&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.Browser.touch||o.DomUtil.addClass(e.body,"leaflet-dragging")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.Browser.touch||o.DomUtil.removeClass(e.body,"leaflet-dragging");for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),this._onViewReset())}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)<Math.abs(s+i)?o:s;this._draggable._newPos.x=a},_onDragEnd:function(){var t=this._map,e=t.options,i=+new Date-this._lastTime,n=!e.inertia||i>e.inertiaThreshold||!this._positions[0];if(t.fire("dragend"),n)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),d=u/(e.inertiaDeceleration*r),p=c.multiplyBy(-d/2).round();p.x&&p.y?o.Util.requestAnimFrame(function(){t.panBy(p,{duration:d,easeLinearity:r,noMoveStart:!0})}):t.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setZoomAround(t.containerPoint,this._zoom+1)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&t.setZoomAround(this._lastMousePos,i+e)}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:o.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.msTouch?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.msTouch){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.msTouch){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.msTouch?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;i<a.length;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;e<s.length;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),o.Map.mergeOptions({touchZoom:o.Browser.touch&&!o.Browser.android23}),o.Map.TouchZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){o.DomEvent.off(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 n=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=n.add(s)._divideBy(2),this._startDist=n.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),o.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),o.DomEvent.preventDefault(t)}},_onTouchMove:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&this._zooming){var i=e.mouseEventToLayerPoint(t.touches[0]),n=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(n)/this._startDist,this._delta=i._add(n)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return this._zooming=!1,void 0;var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this) -},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.msTouch&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),this._map.fire("boxzoomstart"),void 0)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._pane.removeChild(this._box),this._container.style.cursor="",o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable()},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},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):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.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,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):(o.DomEvent.disableClickPropagation(e),o.DomEvent.on(e,"mousewheel",o.DomEvent.stopPropagation));var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"';i&&(n+=' checked="checked"'),n+="/>";var o=e.createElement("div");return o.innerHTML=n,o.firstChild},_addItem:function(t){var i,n=e.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?(i=e.createElement("input"),i.type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers",s),i.layerId=o.stamp(t.layer),o.DomEvent.on(i,"click",this._onInputClick,this);var a=e.createElement("span");a.innerHTML=" "+t.name,n.appendChild(i),n.appendChild(a);var r=t.overlay?this._overlaysList:this._baseLayersList;return r.appendChild(n),n},_onInputClick:function(){var t,e,i,n=this._form.getElementsByTagName("input"),o=n.length;for(this._handlingClick=!0,t=0;o>t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=this._limitZoom(e),t=o.latLng(t),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file
--- a/fujix/map.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -#!/usr/bin/env ruby -#coding:utf-8 - -require 'cgi' -c = CGI.new(:accept_charset => "UTF-8") - -#lon = c["lon"].to_f -#lat = c["lat"].to_f - -if ARGV[1] != nil - lon = ARGV[1].to_f - lat = ARGV[0].to_f -else - lat = 38.91525 - lon = 139.83450 -end - -print("Content-type: text/html; charset=UTF-8\n\n") - -printf(<<_EOS_,lat,lon) -<html> -<head> - <title>Simple OSM GPX Track</title> - <script src="http://www.openlayers.org/api/OpenLayers.js"></script> - <script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script> - - <script type="text/javascript"> - lat = %f - lon = %f - var zoom=15 - - var map; - - function init() { - map = new OpenLayers.Map ("map", { - controls:[ - new OpenLayers.Control.Navigation(), - new OpenLayers.Control.PanZoomBar(), - new OpenLayers.Control.Attribution() - ], - maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), - maxResolution: 156543.0399, - numZoomLevels: 6, - units: \'m\', - projection: new OpenLayers.Projection("EPSG:900913"), - displayProjection: new OpenLayers.Projection("EPSG:4326") - } ); - - layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); - map.addLayer(layerMapnik); - layerMarkers = new OpenLayers.Layer.Markers("Markers"); - map.addLayer(layerMarkers); - - var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); - map.setCenter(lonLat, zoom); - var size = new OpenLayers.Size(21, 25); - var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); - var icon = new OpenLayers.Icon(\'http://www.openstreetmap.org/openlayers/img/marker.png\',size,offset); - layerMarkers.addMarker(new OpenLayers.Marker(lonLat,icon)); - } - </script> -<meta http-equiv="refresh" content="20;redirect.html"> -</head> - -<body onload="init();"> -_EOS_ -print"<div style=\"width:90\%\; height:90\%\" id=\"map\"></div> -</body> -</html> -"
--- a/fujix/redirect.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>たいとる</title> -</head> -<script language="javascript"> - -time = 1; - -url = "http://skip.koeki-prj.org/fujix/leaf.rb"; -curl = "http://skip.koeki-prj.org/fujix/leaf.rb"; - -if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition( - - function (hoge) { - var lon = hoge.coords.latitude; - var lat = hoge.coords.longitude; - url += "?" + lon + "+" + lat; - - }, - - function (error) { - - var message = ""; - - switch (error.code) { - - case error.POSITION_UNAVAILABLE: - message = "位置情報の取得ができませんでした。"; - break; - - case error.PERMISSION_DENIED: - message = "位置情報取得の使用許可がされませんでした。"; - break; - - case error.PERMISSION_DENIED_TIMEOUT: - message = "位置情報取得中にタイムアウトしました。"; - break; - - } - window.alert(message); - } - ); -} - -function jumpPage() { - if (url == curl){ - url += "?error"; - } - location.href = url; -} - -setTimeout("jumpPage()",time*1000) -</script> -<body> -<p>位置情報を取得し直して再表示します</p> -</body> -</html>
--- a/fujix/sql/dummy.txt Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -hoge
--- a/mackey/academy/.htaccess Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -AddHandler cgi-script .rb -Options +ExecCGI -AddType "text/html; charset=euc-jp" .html .rb \ No newline at end of file
--- a/mackey/academy/.htaccess~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -AddHandler cgi-script .rb -Options +ExecCGI -AddType "text/html; charset=utf-8" .html .rb \ No newline at end of file
--- a/mackey/academy/add.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> -<title>桼Ͽ</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1>Ͽ</h1> -<div class="center01"> -<div> -<h2>ϤϿܥƤ</h2> -<form method="POST" action="add.rb"> -<p> -<span>ID:</span><input type="text" name="id"><br> -<span>PASS:</span><input type="password" name="pass"><br> -<span>̾:</span><input type="text" name="name"><br> -<span>:</span><input type="radio" name="sex" value="man"><br> -<span></span><input type="radio" name="sex" value="woman"></p> -<button class="css3button" type="submit" name="Battle" value="1">Ͽ</button> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/add.html~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>ユーザー登録</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1>新規登録</h1> -<div class="center01"> -<div> -<h2>入力したら登録ボタンを押してください</h2> -<form method="POST" action="add.rb"> -<p> -<span>ID:</span><input type="text" name="id"><br> -<span>PASS:</span><input type="password" name="pass"><br> -<span>名前:</span><input type="text" name="name"><br> -<span>性別:</span><input type="radio" name="sex" value="man">男<br> -<span></span><input type="radio" name="sex" value="woman">女</p> -<button class="css3button" type="submit" name="Battle" value="1">登録</button> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/add.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -#!/usr/bin/env ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "euc-jp") -print"Content-type: text/html; charset=euc-jp\n\n" - -number = c["id"] -pswd = c["pass"] -namae = c["name"] -sx = c["sex"] -check = 0 - -begin - conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') - a = "select id from userdata" - ip = conn.exec(a) - ip.each do |row| - if number == row["id"] - check = 1 - end - end - if check == 0 - q = "insert into userdata (id, password, name, sex, level, exp, quest) values ('#{number}', '#{pswd}', '#{namae}', '#{sx}', '1', '0', '0')" - export = conn.exec(q) - end -end -print"<html> -<head> -<meta http-equiv=\"Content-Type\" content=\"text/html; charset=euc-jp\"> -<title>桼Ͽ</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body>\n" -if check == 0 - print"<h1>Ͽλ</h1> -<a href=\"login.html\"> -<button class=\"css3button\"></button>\n" -elsif check == 1 - print"<h1>Error</h1> -<p>IDȤƤޤ</p> -<a href=\"add.html\"> -<button class=\"css3button\">⤦</button>\n" -end -print"</a> -</body> -</html>\n"
--- a/mackey/academy/add.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -#!/usr/bin/env ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"Content-type: text/html; charset=utf-8\n\n" - -number = c["id"] -pswd = c["pass"] -namae = c["name"] -sx = c["sex"] -check = 0 - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - a = "select id from userdata" - ip = conn.exec(a) - ip.each do |row| - if number == row["id"] - check = 1 - end - end - if check == 0 - q = "insert into userdata (id, password, name, sex, level, exp, quest) values ('#{number}', '#{pswd}', '#{namae}', '#{sx}', '1', '0', '0')" - export = conn.exec(q) - end -end -print"<html> -<head> -<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> -<title>桼Ͽ</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body>\n" -if check == 0 - print"<h1>Ͽλ</h1> -<a href=\"login.html\"> -<button class=\"css3button\"></button>\n" -elsif check == 1 - print"<h1>Error</h1> -<p>IDȤƤޤ</p> -<a href=\"add.html\"> -<button class=\"css3button\">⤦</button>\n" -end -print"</a> -</body> -</html>\n"
--- a/mackey/academy/ans.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 - -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print "Content-type: text/html; charset=utf-8\n\n" - -check = c["answer"] -quiznum = c["dat"] - -srand -number=rand(1060) -num = 0 -damage = "" -quiz = "" -ansone = "" -anstwo = "" -ansthi = "" -ansfou = "" -anstrue = "" -open("data.txt", "r:utf-8") do |list| - while line = list.gets - if /(\d+),(\S+),(\S+),(\S+),(\S+),(\S+),(\d)/ =~ line - if quiznum.to_i == $1.to_i - if check.to_i == $7.to_i - damage = "攻撃成功!" - else - damage = "攻撃失敗!" - end - end - if number.to_i == $1.to_i - num = $1.to_i - quiz = $2.to_s - ansone = $3.to_s - anstwo = $4.to_s - ansthi = $5.to_s - ansfou = $6.to_s - anstrue = $7.to_i - end - end - end -end - - - -printf("<html> -<head> -<title>きみのこうげきだよ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>きみのこうげきだよ</h1> -<h2>#{damage}</h2> -<p>No.#{number}</p> -<div class=\"main\"> -<div> -<img border=\"1\" src=\"maou.png\" width=\"480\" height=\"320\" -alt=\"まおうのがぞうっぽいよ\" title=\"まおう\"> - -<h2>問題</h2> -<p>%s</p> - -<form method=\"POST\" action=\"ans.rb\"> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"1\">%s</bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"2\">%s</bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"3\">%s<br></bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"4\">%s<br></bu\ -tton> -<input type=\"hidden\" name=\"dat\" value=\"%d\"> -</form> -</div> -</div> -</body> -</html>", quiz, ansone, anstwo, ansthi, ansfou, num)
--- a/mackey/academy/battle.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> -<title>ƥȥ</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1>ƥȥ</h1> -<div class="center01"> -<div> -<img border="1" src="forest.jpg" width="480" height="320" -alt="ط" title="ط"> -<h2>õ褦</h2> -<form method="POST" action="battle.rb"> -<button class="css3button" type="submit" name="Battle" value="1">Start</button> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/battle.html~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>テストクエスト</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1>テストクエスト</h1> -<div class="center01"> -<div> -<img border="1" src="forest.jpg" width="480" height="320" -alt="背景" title="背景"> -<h2>探索しよう!</h2> -<form method="POST" action="battle.rb"> -<button class="css3button" type="submit" name="Battle" value="1">Start</button> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/battle.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -#!/usr/bin/env ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "euc-jp") -print"ontent-type: text/html; charset=euc-jp\n\n" - -tai = c["hp"] -dhp = c["defohp"] -tekihp = c["thp"] -ct = c["count"] -nn = c["namae"] -lvl = c["level"] -idnum = c["id"] -ep = c["exp"] -cou = ct -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 - -begin - conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -srand -number = rand(x) -check = rand(4) - -printf("<html> -<head> -<title>ߤΤ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>ߤΤ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>ƤHP #{tekihp} / #{tekihp} -<img border=\"1\" src=\"battle.jpg\" width=\"480\" height=\"320\" -alt=\"ط\" title=\"ط\"> -<h1>:#{tai} / #{dhp} -<h2></h2> -<p>%s</p> - -<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) - -if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" -elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" -elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" -elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" -end -printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> -<input type=\"hidden\" name=\"defothp\" value=\"#{tekihp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> -</form> -</div> -</div> -</body> -</html>\n", wordone[number])
--- a/mackey/academy/battle.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -#!/usr/bin/ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"ontent-type: text/html; charset=utf-8\n\n" - -tai = c["hp"] -dhp = c["defohp"] -tekihp = c["thp"] -ct = c["count"] -nn = c["namae"] -lvl = c["level"] -idnum = c["id"] -ep = c["exp"] -cou = ct -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -srand -number = rand(x) -check = rand(4) - -printf("<html> -<head> -<title>ߤΤ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>ߤΤ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>ƤHP #{tekihp} / #{tekihp} -<img border=\"1\" src=\"battle.jpg\" width=\"480\" height=\"320\" -alt=\"ط\" title=\"ط\"> -<h1>:#{tai} / #{dhp} -<h2></h2> -<p>%s</p> - -<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) - -if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" -elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" -elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" -elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" -end -printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> -<input type=\"hidden\" name=\"defothp\" value=\"#{tekihp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> -</form> -</div> -</div> -</body> -</html>\n", wordone[number])
--- a/mackey/academy/battle2.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,206 +0,0 @@ -#!/usr/bin/env ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "euc-jp") -print"ontent-type: text/html; charset=euc-jp\n\n" - -kaito = c["answer"] -ans = c["dat"] -ber = c["num"] -tai = c["hp"] -tekihp = c["thp"] -dthp = c["defothp"] -dhp = c["defohp"] -nn = c["namae"] -lvl = c["level"] -ep = c["exp"] -idnum = c["id"] -sum = tai.to_i -tsum = tekihp.to_i -nb = ber.to_i -cu = c["count"] -cou = cu.to_i -ct = cou + 1 -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 -y = 0 - -begin - conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -if ans.to_s == kaito.to_s - srand - attack = rand(90) + 10 - tsum -= attack -else - srand - tekiat = rand(20) + 5 - sum -= tekiat -end - -if tsum >= 0 && sum >= 0 - - srand - number = rand(x) - srand - check = rand(4) - - print"<html> -<head> -<title>ߤΤ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>ߤΤ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>ƤHP #{tsum} / #{dthp}</h1> - -<img border=\"1\" src=\"" - - if ans.to_s == kaito.to_s - print"atack.gif" - else - print"damage.gif" - end -print"\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\">\n" - - - if ans.to_s == kaito.to_s - print"<h1>!</h1>\n" - else - print"<h1>⼺</h1>\n" - end - printf("<h1>:#{sum} / #{dhp} -<h2></h2> -<p>%s</p> -<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) - - if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" - elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" - elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" - elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" - end - printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> -<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> -<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -</form> -</div> -</body> -</html>\n", wordone[number]) - -elsif tsum <= 0 && sum > 0 - if ct == 4 - print"<html> -<head> -<title>ɥ饴!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>ɥ饴!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> -<h1>!</h1> -<h1>:#{sum} / #{dhp}</h1> -<h2>õλ</h2>" -#<form method=\"POST\" action=\"boss.rb\"> -#<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> -#<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"><input type=\"hidden\" name=\"thp\" value=\"500\"> -#<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> -#</form> -print"</div> -</body> -</html>\n" - - else - print"<html> -<head> -<title>ɥ饴!</title> <link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> </head> <body> <h1>ɥ饴!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> -<h1>!</h1> -<h1>:#{sum} / #{dhp}</h1> -<h2>õ³褦!</h2> -<form method=\"POST\" action=\"battle.rb\"> -<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> -<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{dthp}\"> -<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> -<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -</form> -</div> -</body> -</html>\n" - end -else - print"<html><head><title>餱Ƥޤä</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>餱Ƥޤä</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> -<h1>:0 / #{dhp}</h1> -<h2>⤦õ!</h2> -<form method=\"POST\" action=\"login.rb\"> -<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -</form> - -</a> -</div> -</body> -</html>\n" -end
--- a/mackey/academy/battle2.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,206 +0,0 @@ -#!/usr/bin/ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"ontent-type: text/html; charset=utf-8\n\n" - -kaito = c["answer"] -ans = c["dat"] -ber = c["num"] -tai = c["hp"] -tekihp = c["thp"] -dthp = c["defothp"] -dhp = c["defohp"] -nn = c["namae"] -lvl = c["level"] -ep = c["exp"] -idnum = c["id"] -sum = tai.to_i -tsum = tekihp.to_i -nb = ber.to_i -cu = c["count"] -cou = cu.to_i -ct = cou + 1 -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 -y = 0 - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -if ans.to_s == kaito.to_s - srand - attack = rand(90) + 10 - tsum -= attack -else - srand - tekiat = rand(20) + 5 - sum -= tekiat -end - -if tsum >= 0 && sum >= 0 - - srand - number = rand(x) - srand - check = rand(4) - - print"<html> -<head> -<title>ߤΤ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>ߤΤ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>ƤHP #{tsum} / #{dthp}</h1> - -<img border=\"1\" src=\"" - - if ans.to_s == kaito.to_s - print"atack.gif" - else - print"damage.gif" - end -print"\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\">\n" - - - if ans.to_s == kaito.to_s - print"<h1>!</h1>\n" - else - print"<h1>⼺</h1>\n" - end - printf("<h1>:#{sum} / #{dhp} -<h2></h2> -<p>%s</p> -<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) - - if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" - elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" - elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" - elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" - end - printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> -<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> -<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -</form> -</div> -</body> -</html>\n", wordone[number]) - -elsif tsum <= 0 && sum > 0 - if ct == 3 - print"<html> -<head> -<title>ɥ饴!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>ɥ饴!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> -<h1>!</h1> -<h1>:#{sum} / #{dhp}</h1> -<h2>õλ</h2>" -#<form method=\"POST\" action=\"boss.rb\"> -#<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> -#<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"><input type=\"hidden\" name=\"thp\" value=\"500\"> -#<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> -#</form> -print"</div> -</body> -</html>\n" - - else - print"<html> -<head> -<title>ɥ饴!</title> <link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> </head> <body> <h1>ɥ饴!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> -<h1>!</h1> -<h1>:#{sum} / #{dhp}</h1> -<h2>õ³褦!</h2> -<form method=\"POST\" action=\"battle.rb\"> -<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> -<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{dthp}\"> -<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> -<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -</form> -</div> -</body> -</html>\n" - end -else - print"<html><head><title>餱Ƥޤä</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>餱Ƥޤä</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> -<h1>:#{sum} / #{dhp}</h1> -<h2>⤦õ!</h2> -<form method=\"POST\" action=\"login.rb\"> -<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> -<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> -</form> - -</a> -</div> -</body> -</html>\n" -end
--- a/mackey/academy/boss.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"ontent-type: text/html; charset=utf-8\n\n" - -tai = c["hp"] -dh = c["defohp"] -tekihp = c["thp"] -nn = c["namae"] -lvl = c["level"] -number = c["id"] -ep = c["exp"] -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -srand -number = rand(x) -check = rand(4) - -printf("<html> -<head> -<title>きみのこうげきだよ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>きみのこうげきだよ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>BOSS HP #{tekihp} / 500 -<img border=\"1\" src=\"boss.jpg\" width=\"480\" height=\"320\" -alt=\"背景\" title=\"背景\"> -<h1>体力: #{tai} / 999 -<h2>問題</h2> -<p>%s</p> - -<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) - -if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" -elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" -elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" -elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" -end -printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> -</form> -</div> -</div> -</body> -</html>\n", wordone[number])
--- a/mackey/academy/boss.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"ontent-type: text/html; charset=utf-8\n\n" - -tai = c["hp"] -tekihp = c["thp"] -nn = c["namae"] -lvl = c["level"] -number = c["id"] -ep = c["exp"] -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -srand -number = rand(x) -check = rand(4) - -printf("<html> -<head> -<title>きみのこうげきだよ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>きみのこうげきだよ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>BOSS HP #{tekihp} / 500 -<img border=\"1\" src=\"boss.jpg\" width=\"480\" height=\"320\" -alt=\"背景\" title=\"背景\"> -<h1>体力: #{tai} / 999 -<h2>問題</h2> -<p>%s</p> - -<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) - -if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" -elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" -elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" -elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" -end -printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> -</form> -</div> -</div> -</body> -</html>\n", wordone[number])
--- a/mackey/academy/boss2.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"ontent-type: text/html; charset=utf-8\n\n" - -kaito = c["answer"] -ans = c["dat"] -ber = c["num"] -tai = c["hp"] -tekihp = c["thp"] -sum = tai.to_i -tsum = tekihp.to_i -nb = ber.to_i -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 -y = 0 - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -if ans.to_s == kaito.to_s - srand - attack = rand(90) + 100 - tsum -= attack -else - srand - tekiat = rand(60) + 60 - sum -= tekiat -end - -if tsum >= 0 && sum >= 0 - - srand - number = rand(x) - srand - check = rand(4) - - print"<html> -<head> -<title>きみのこうげきだよ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>きみのこうげきだよ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>BOSS HP #{tsum} / 500</h1> -<img border=\"1\" src=\"boss.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\">\n" - - if ans.to_s == kaito.to_s - print"<h1>攻撃成功!</h1>\n" - else - print"<h1>攻撃失敗</h1>\n" - end - - printf("<h1>体力: #{sum} / 999 -<h2>問題</h2> -<p>%s</p> -<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) - - if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" - elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" - elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" - elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" - end - printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> -</form> -</div> -</div> -</body> -</html>\n", wordone[number]) - -elsif tsum <= 0 && sum > 0 - print"<html> -<head> -<title>BOSSをたおした!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>BOSSをたおした!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\"> -<h1>攻撃成功!</h1> -<h1>体力: #{sum} / 999</h1> -<h2>探索完了!</h2> -<a href=\"quest.html\"> -<button class=\"css3button\">Start</button> -</a> -</div> -</body> -</html>\n" -else - print"<html> -<head> -<title>BOSSをたおした!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>BOSSをたおした!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"\\ -背景\"> -<h1>体力: #{sum} / 999</h1> -<h2>もう一度探索!</h2> -<a href=\"quest.html\"> -<button class=\"css3button\">Start</button> -</a> -</div> -</body> -</html>\n" - -end
--- a/mackey/academy/boss2.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"ontent-type: text/html; charset=utf-8\n\n" - -kaito = c["answer"] -ans = c["dat"] -ber = c["num"] -tai = c["hp"] -tekihp = c["thp"] -sum = tai.to_i -tsum = tekihp.to_i -nb = ber.to_i -quest = [] -wordone = [] -wordtwo = [] -wordthi = [] -wordfou = [] -subject = [] -x = 0 -y = 0 - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - quest << row["question"].to_s - wordone << row["word1"].to_s - wordtwo << row["word2"].to_s - wordthi << row["word3"].to_s - wordfou << row["word4"].to_s - x += 1 - end -end - -if ans.to_s == kaito.to_s - srand - attack = rand(90) + 100 - tsum -= attack -else - srand - tekiat = rand(60) + 60 - sum -= tekiat -end - -if tsum >= 0 && sum >= 0 - - srand - number = rand(x) - srand - check = rand(4) - - print"<html> -<head> -<title>きみのこうげきだよ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>きみのこうげきだよ</h1> -<p>No.#{number}</p> -<div class=\"center01\"> -<div> -<h1>BOSS HP #{tsum} / 500</h1> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\">\n" - - if ans.to_s == kaito.to_s - print"<h1>攻撃成功!</h1>\n" - else - print"<h1>攻撃失敗</h1>\n" - end - - printf("<h1>体力: #{sum} / 999 -<h2>問題</h2> -<p>%s</p> -<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) - - if check == 0 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ -tton>\n" - elsif check == 1 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" - elsif check == 2 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" - elsif check == 3 - print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" - end - printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> -<input type=\"hidden\" name=\"num\" value=\"#{number}\"> -<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> -<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> -</form> -</div> -</div> -</body> -</html>\n", wordone[number]) - -elsif tsum <= 0 && sum > 0 - print"<html> -<head> -<title>BOSSをたおした!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>BOSSをたおした!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\"> -<h1>攻撃成功!</h1> -<h1>体力: #{sum} / 999</h1> -<h2>探索完了!</h2> -<a href=\"quest.html\"> -<button class=\"css3button\">Start</button> -</a> -</div> -</body> -</html>\n" -else - print"<html> -<head> -<title>BOSSをたおした!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>BOSSをたおした!</h1> -<div class=\"center01\"> -<div> -<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"\\ -背景\"> -<h1>体力: #{sum} / 999</h1> -<h2>もう一度探索!</h2> -<a href=\"quest.html\"> -<button class=\"css3button\">Start</button> -</a> -</div> -</body> -</html>\n" - -end
--- a/mackey/academy/damage.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 -def damage() - srand - check = rand(4) - if check == 0 - point = 100 - point - elsif check == 1 - point = 126 - point - elsif check == 2 - point = 87 - point - elsif check == 3 - point == 199 - point - end -end
--- a/mackey/academy/data.txt Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2063 +0,0 @@ -0,1+1=?,1,2,3,4,2 -1,日本<=なんと読む?,いっぽん,にほん,さんほん,よんほん,2 -2,選択肢の中で仲間はずれは?,イワシ,クロマグロ,サンマ,タカミダイ,4 -3,水の化学式H2Oの1molあたりの量は?,16,17,18,19,3 -4,「水兵リーベ僕の船」の兵は何を示している?,水素,リチウム,ヘリウム,ベリ -リウム,2 -5,群馬県の県庁所在地は?,高崎市,桐生市,群馬市,前橋市,4 -6,福岡県の県庁所在地は?,博多市,福岡市,小倉市,酒田市,2 -7,人は生物学上何に分類される?,霊長類,魚類,鳥類,哺乳類,4 -8,「忄」は何へん?,りっしんべん,のぎへん,しめすへん,にんべん,1 -9,「胡座」なんと読む?,ござ,あぐら,あくび,ぎょうざ,2 -10,角度30度の時、1/2なのはどれ?,sin,cos,tan,どれでもない,1 -11,三角形の比率で存在するのは3:4::?,5,6,7,8,1 -12,ギターの英語のスペルは?,gitar,guiter,guitar,giter,3 -13,北海道の県庁所在地は?,札幌市,青森市,盛岡市,仙台市,1 -14,青森県の県庁所在地は?,青森市,盛岡市,仙台市,秋田市,1 -15,岩手県の県庁所在地は?,盛岡市,仙台市,秋田市,山形市,1 -16,宮城県の県庁所在地は?,仙台市,秋田市,山形市,福島市,1 -17,秋田県の県庁所在地は?,秋田市,山形市,福島市,水戸市,1 -18,山形県の県庁所在地は?,山形市,福島市,水戸市,宇都宮市,1 -19,福島県の県庁所在地は?,福島市,水戸市,宇都宮市,前橋市,1 -20,茨城県の県庁所在地は?,水戸市,宇都宮市,前橋市,さいたま市,1 -21,栃木県の県庁所在地は?,宇都宮市,前橋市,さいたま市,千葉市,1 -22,群馬県の県庁所在地は?,前橋市,さいたま市,千葉市,東京,1 -23,埼玉県の県庁所在地は?,さいたま市,千葉市,東京,横浜市,1 -24,千葉県の県庁所在地は?,千葉市,東京,横浜市,新潟,1 -25,東京都の県庁所在地は?,東京,横浜市,新潟,富山市,1 -26,神奈川県の県庁所在地は?,横浜市,新潟,富山市,金沢市,1 -27,新潟県の県庁所在地は?,新潟,富山市,金沢市,福井市,1 -28,富山県の県庁所在地は?,富山市,金沢市,福井市,甲府市,1 -29,石川県の県庁所在地は?,金沢市,福井市,甲府市,長野市,1 -30,福井県の県庁所在地は?,福井市,甲府市,長野市,岐阜市,1 -31,山梨県の県庁所在地は?,甲府市,長野市,岐阜市,静岡市,1 -32,長野県の県庁所在地は?,長野市,岐阜市,静岡市,名古屋市,1 -33,岐阜県の県庁所在地は?,岐阜市,静岡市,名古屋市,津市,1 -34,静岡県の県庁所在地は?,静岡市,名古屋市,津市,大津市,1 -35,愛知県の県庁所在地は?,名古屋市,津市,大津市,京都市,1 -36,三重県の県庁所在地は?,津市,大津市,京都市,大阪市,1 -37,滋賀県の県庁所在地は?,大津市,京都市,大阪市,神戸市,1 -38,京都府の県庁所在地は?,京都市,大阪市,神戸市,奈良市,1 -39,大阪府の県庁所在地は?,大阪市,神戸市,奈良市,和歌山市,1 -40,兵庫県の県庁所在地は?,神戸市,奈良市,和歌山市,鳥取市,1 -41,奈良県の県庁所在地は?,奈良市,和歌山市,鳥取市,松江市,1 -42,和歌山県の県庁所在地は?,和歌山市,鳥取市,松江市,岡山市,1 -43,鳥取県の県庁所在地は?,鳥取市,松江市,岡山市,広島市,1 -44,島根県の県庁所在地は?,松江市,岡山市,広島市,山口市,1 -45,岡山県の県庁所在地は?,岡山市,広島市,山口市,徳島市,1 -46,広島県の県庁所在地は?,広島市,山口市,徳島市,高松市,1 -47,山口県の県庁所在地は?,山口市,徳島市,高松市,松山市,1 -48,徳島県の県庁所在地は?,徳島市,高松市,松山市,高知市,1 -49,香川県の県庁所在地は?,高松市,松山市,高知市,福岡市,1 -50,愛媛県の県庁所在地は?,松山市,高知市,福岡市,佐賀市,1 -51,高知県の県庁所在地は?,高知市,福岡市,佐賀市,長崎市,1 -52,福岡県の県庁所在地は?,福岡市,佐賀市,長崎市,熊本市,1 -53,佐賀県の県庁所在地は?,佐賀市,長崎市,熊本市,大分市,1 -54,長崎県の県庁所在地は?,長崎市,熊本市,大分市,宮崎市,1 -55,熊本県の県庁所在地は?,熊本市,大分市,宮崎市,鹿児島市1 -56,大分県の県庁所在地は?,大分市,宮崎市,鹿児島市,那覇市,1 -57,宮崎県の県庁所在地は?,宮崎市,鹿児島市,那覇市,福岡市,1 -58,鹿児島県の県庁所在地は?,鹿児島市,宮崎市,大分市,熊本市,1 -59,沖縄県の県庁所在地は?,那覇市,鹿児島市,宮崎市,大分市,1 -60,1年生の漢字[子]の読みは?,こ,おう,き,そら,1 -61,1年生の漢字[一]の読みは?,いち,おと,きゅう,つき,1 -62,1年生の漢字[右]の読みは?,みぎ,した,きゅう,いぬ,1 -63,1年生の漢字[雨]の読みは?,あめ,はな,たま,けん,1 -64,1年生の漢字[円]の読みは?,えん,がく,きん,ご,1 -65,1年生の漢字[王]の読みは?,おう,き,そら,くち,1 -66,1年生の漢字[音]の読みは?,おと,きゅう,つき,こう,1 -67,1年生の漢字[下]の読みは?,した,きゅう,いぬ,ひだり,1 -68,1年生の漢字[花]の読みは?,はな,たま,けん,さん,1 -69,1年生の漢字[学]の読みは?,がく,きん,ご,やま,1 -70,1年生の漢字[気]の読みは?,き,そら,くち,よん,1 -71,1年生の漢字[九]の読みは?,きゅう,つき,こう,いと,1 -72,1年生の漢字[休]の読みは?,きゅう,いぬ,ひだり,じ,1 -73,1年生の漢字[玉]の読みは?,たま,けん,さん,みみ,1 -74,1年生の漢字[金]の読みは?,きん,ご,やま,なな,1 -75,1年生の漢字[空]の読みは?,そら,くち,よん,くるま,1 -76,1年生の漢字[月]の読みは?,つき,こう,いと,て,1 -77,1年生の漢字[犬]の読みは?,いぬ,ひだり,じ,じゅう,1 -78,1年生の漢字[見]の読みは?,けん,さん,みみ,しゅつ,1 -79,1年生の漢字[五]の読みは?,ご,やま,なな,おんな,1 -80,1年生の漢字[口]の読みは?,くち,よん,くるま,しょう,1 -81,1年生の漢字[校]の読みは?,こう,いと,て,うえ,1 -82,1年生の漢字[左]の読みは?,ひだり,じ,じゅう,もり,1 -83,1年生の漢字[三]の読みは?,さん,みみ,しゅつ,ひと,1 -84,1年生の漢字[山]の読みは?,やま,なな,おんな,みず,1 -85,1年生の漢字[四]の読みは?,よん,くるま,しょう,しょう,1 -86,1年生の漢字[糸]の読みは?,いと,て,うえ,しょう,1 -87,1年生の漢字[字]の読みは?,じ,じゅう,もり,あお,1 -88,1年生の漢字[耳]の読みは?,みみ,しゅつ,ひと,ゆう,1 -89,1年生の漢字[七]の読みは?,なな,おんな,みず,いし,1 -90,1年生の漢字[車]の読みは?,くるま,しょう,しょう,あか,1 -91,1年生の漢字[手]の読みは?,て,うえ,しょう,せん,1 -92,1年生の漢字[十]の読みは?,じゅう,もり,あお,かわ,1 -93,1年生の漢字[出]の読みは?,しゅつ,ひと,ゆう,さき,1 -94,1年生の漢字[女]の読みは?,おんな,みず,いし,そう,1 -95,1年生の漢字[小]の読みは?,しょう,しょう,あか,そう,1 -96,1年生の漢字[上]の読みは?,うえ,しょう,せん,あし,1 -97,1年生の漢字[森]の読みは?,もり,あお,かわ,むら,1 -98,1年生の漢字[人]の読みは?,ひと,ゆう,さき,だい,1 -99,1年生の漢字[水]の読みは?,みず,いし,そう,おとこ,1 -100,1年生の漢字[正]の読みは?,しょう,あか,そう,たけ,1 -101,1年生の漢字[生]の読みは?,しょう,せん,あし,ちゅう,1 -102,1年生の漢字[青]の読みは?,あお,かわ,むら,むし,1 -103,1年生の漢字[夕]の読みは?,ゆう,さき,だい,まち,1 -104,1年生の漢字[石]の読みは?,いし,そう,おとこ,てん,1 -105,1年生の漢字[赤]の読みは?,あか,そう,たけ,た,1 -106,1年生の漢字[千]の読みは?,せん,あし,ちゅう,つち,1 -107,1年生の漢字[川]の読みは?,かわ,むら,むし,に,1 -108,1年生の漢字[先]の読みは?,さき,だい,まち,にち,1 -109,1年生の漢字[早]の読みは?,そう,おとこ,てん,にゅう,1 -110,1年生の漢字[草]の読みは?,そう,たけ,た,とし,1 -111,1年生の漢字[足]の読みは?,あし,ちゅう,つち,しろ,1 -112,1年生の漢字[村]の読みは?,むら,むし,に,はち,1 -113,1年生の漢字[大]の読みは?,だい,まち,にち,ひゃく,1 -114,1年生の漢字[男]の読みは?,おとこ,てん,にゅう,ぶん,1 -115,1年生の漢字[竹]の読みは?,たけ,た,とし,き,1 -116,1年生の漢字[中]の読みは?,ちゅう,つち,しろ,ほん,1 -117,1年生の漢字[虫]の読みは?,むし,に,はち,めい,1 -118,1年生の漢字[町]の読みは?,まち,にち,ひゃく,め,1 -119,1年生の漢字[天]の読みは?,てん,にゅう,ぶん,りつ,1 -120,1年生の漢字[田]の読みは?,た,とし,き,ちから,1 -121,1年生の漢字[土]の読みは?,つち,しろ,ほん,はやし,1 -122,1年生の漢字[二]の読みは?,に,はち,めい,ろく,1 -123,1年生の漢字[日]の読みは?,にち,ひゃく,め,いん,1 -124,1年生の漢字[入]の読みは?,にゅう,ぶん,りつ,はね,1 -125,1年生の漢字[年]の読みは?,とし,き,ちから,くも,1 -126,1年生の漢字[白]の読みは?,しろ,ほん,はやし,えん,1 -127,1年生の漢字[八]の読みは?,はち,めい,ろく,えん,1 -128,1年生の漢字[百]の読みは?,ひゃく,め,いん,なに,1 -129,1年生の漢字[文]の読みは?,ぶん,りつ,はね,か,1 -130,1年生の漢字[木]の読みは?,き,ちから,くも,なつ,1 -131,1年生の漢字[本]の読みは?,ほん,はやし,えん,いえ,1 -132,1年生の漢字[名]の読みは?,めい,ろく,えん,うた,1 -133,1年生の漢字[目]の読みは?,め,いん,なに,が,1 -134,1年生の漢字[立]の読みは?,りつ,はね,か,かい,1 -135,1年生の漢字[力]の読みは?,ちから,くも,なつ,かい,1 -136,1年生の漢字[林]の読みは?,はやし,えん,いえ,うみ,1 -137,1年生の漢字[六]の読みは?,ろく,えん,うた,え,1 -138,2年生の漢字[引]の読みは?,いん,なに,が,そと,1 -139,2年生の漢字[羽]の読みは?,はね,か,かい,かく,1 -140,2年生の漢字[雲]の読みは?,くも,なつ,かい,らく,1 -141,2年生の漢字[園]の読みは?,えん,いえ,うみ,かつ,1 -142,2年生の漢字[遠]の読みは?,えん,うた,え,あいだ,1 -143,2年生の漢字[何]の読みは?,なに,が,そと,いわ,1 -144,2年生の漢字[科]の読みは?,か,かい,かく,かお,1 -145,2年生の漢字[夏]の読みは?,なつ,かい,らく,き,1 -146,2年生の漢字[家]の読みは?,いえ,うみ,かつ,き,1 -147,2年生の漢字[歌]の読みは?,うた,え,あいだ,き,1 -148,2年生の漢字[画]の読みは?,が,そと,いわ,ゆみ,1 -149,2年生の漢字[回]の読みは?,かい,かく,かお,うし,1 -150,2年生の漢字[会]の読みは?,かい,らく,き,さかな,1 -151,2年生の漢字[海]の読みは?,うみ,かつ,き,けい,1 -152,2年生の漢字[絵]の読みは?,え,あいだ,き,きょう,1 -153,2年生の漢字[外]の読みは?,そと,いわ,ゆみ,きょう,1 -154,2年生の漢字[角]の読みは?,かく,かお,うし,きん,1 -155,2年生の漢字[楽]の読みは?,らく,き,さかな,あに,1 -156,2年生の漢字[活]の読みは?,かつ,き,けい,かたち,1 -157,2年生の漢字[間]の読みは?,あいだ,き,きょう,けい,1 -158,2年生の漢字[岩]の読みは?,いわ,ゆみ,きょう,もと,1 -159,2年生の漢字[顔]の読みは?,かお,うし,きん,げん,1 -160,2年生の漢字[汽]の読みは?,き,さかな,あに,げん,1 -161,2年生の漢字[記]の読みは?,き,けい,かたち,と,1 -162,2年生の漢字[帰]の読みは?,き,きょう,けい,こ,1 -163,2年生の漢字[弓]の読みは?,ゆみ,きょう,もと,うし,1 -164,2年生の漢字[牛]の読みは?,うし,きん,げん,あと,1 -165,2年生の漢字[魚]の読みは?,さかな,あに,げん,ご,1 -166,2年生の漢字[京]の読みは?,けい,かたち,と,こう,1 -167,2年生の漢字[強]の読みは?,きょう,けい,こ,こう,1 -168,2年生の漢字[教]の読みは?,きょう,もと,うし,こう,1 -169,2年生の漢字[近]の読みは?,きん,げん,あと,こう,1 -170,2年生の漢字[兄]の読みは?,あに,げん,ご,ひかり,1 -171,2年生の漢字[形]の読みは?,かたち,と,こう,こう,1 -172,2年生の漢字[計]の読みは?,けい,こ,こう,ぎょう,1 -173,2年生の漢字[元]の読みは?,もと,うし,こう,こう,1 -174,2年生の漢字[言]の読みは?,げん,あと,こう,き,1 -175,2年生の漢字[原]の読みは?,げん,ご,ひかり,ごう,1 -176,2年生の漢字[戸]の読みは?,と,こう,こう,たに,1 -177,2年生の漢字[古]の読みは?,こ,こう,ぎょう,くに,1 -178,2年生の漢字[牛]の読みは?,うし,こう,こう,くろ,1 -179,2年生の漢字[後]の読みは?,あと,こう,き,いま,1 -180,2年生の漢字[語]の読みは?,ご,ひかり,ごう,さい,1 -181,2年生の漢字[工]の読みは?,こう,こう,たに,さい,1 -182,2年生の漢字[公]の読みは?,こう,ぎょう,くに,さく,1 -183,2年生の漢字[広]の読みは?,こう,こう,くろ,さん,1 -184,2年生の漢字[交]の読みは?,こう,き,いま,し,1 -185,2年生の漢字[光]の読みは?,ひかり,ごう,さい,し,1 -186,2年生の漢字[考]の読みは?,こう,たに,さい,や,1 -187,2年生の漢字[行]の読みは?,ぎょう,くに,さく,あね,1 -188,2年生の漢字[高]の読みは?,こう,くろ,さん,し,1 -189,2年生の漢字[黄]の読みは?,き,いま,し,かみ,1 -190,2年生の漢字[合]の読みは?,ごう,さい,し,てら,1 -191,2年生の漢字[谷]の読みは?,たに,さい,や,じ,1 -192,2年生の漢字[国]の読みは?,くに,さく,あね,じ,1 -193,2年生の漢字[黒]の読みは?,くろ,さん,し,しつ,1 -194,2年生の漢字[今]の読みは?,いま,し,かみ,しゃ,1 -195,2年生の漢字[才]の読みは?,さい,し,てら,じゃく,1 -196,2年生の漢字[細]の読みは?,さい,や,じ,くび,1 -197,2年生の漢字[作]の読みは?,さく,あね,じ,あき,1 -198,2年生の漢字[算]の読みは?,さん,し,しつ,しゅう,1 -199,2年生の漢字[止]の読みは?,し,かみ,しゃ,はる,1 -200,2年生の漢字[市]の読みは?,し,てら,じゃく,しょ,1 -201,2年生の漢字[矢]の読みは?,や,じ,くび,しょう,1 -202,2年生の漢字[姉]の読みは?,あね,じ,あき,ば,1 -203,2年生の漢字[思]の読みは?,し,しつ,しゅう,いろ,1 -204,2年生の漢字[紙]の読みは?,かみ,しゃ,はる,こころ,1 -205,2年生の漢字[寺]の読みは?,てら,じゃく,しょ,しょく,1 -206,2年生の漢字[自]の読みは?,じ,くび,しょう,しん,1 -207,2年生の漢字[時]の読みは?,じ,あき,ば,おや,1 -208,2年生の漢字[室]の読みは?,しつ,しゅう,いろ,ず,1 -209,2年生の漢字[社]の読みは?,しゃ,はる,こころ,かず,1 -210,2年生の漢字[弱]の読みは?,じゃく,しょ,しょく,にし,1 -211,2年生の漢字[首]の読みは?,くび,しょう,しん,こえ,1 -212,2年生の漢字[秋]の読みは?,あき,ば,おや,ほし,1 -213,2年生の漢字[週]の読みは?,しゅう,いろ,ず,はれ,1 -214,2年生の漢字[春]の読みは?,はる,こころ,かず,せつ,1 -215,2年生の漢字[書]の読みは?,しょ,しょく,にし,ゆき,1 -216,2年生の漢字[少]の読みは?,しょう,しん,こえ,ふね,1 -217,2年生の漢字[場]の読みは?,ば,おや,ほし,せん,1 -218,2年生の漢字[色]の読みは?,いろ,ず,はれ,まえ,1 -219,2年生の漢字[心]の読みは?,こころ,かず,せつ,くみ,1 -220,2年生の漢字[食]の読みは?,しょく,にし,ゆき,そう,1 -221,2年生の漢字[新]の読みは?,しん,こえ,ふね,た,1 -222,2年生の漢字[親]の読みは?,おや,ほし,せん,た,1 -223,2年生の漢字[図]の読みは?,ず,はれ,まえ,たい,1 -224,2年生の漢字[数]の読みは?,かず,せつ,くみ,だい,1 -225,2年生の漢字[西]の読みは?,にし,ゆき,そう,ち,1 -226,2年生の漢字[声]の読みは?,こえ,ふね,た,いけ,1 -227,2年生の漢字[星]の読みは?,ほし,せん,た,ち,1 -228,2年生の漢字[晴]の読みは?,はれ,まえ,たい,ちゃ,1 -229,2年生の漢字[切]の読みは?,せつ,くみ,だい,ひる,1 -230,2年生の漢字[雪]の読みは?,ゆき,そう,ち,ちょう,1 -231,2年生の漢字[船]の読みは?,ふね,た,いけ,とり,1 -232,2年生の漢字[線]の読みは?,せん,た,ち,あさ,1 -233,2年生の漢字[前]の読みは?,まえ,たい,ちゃ,ちょく,1 -234,2年生の漢字[組]の読みは?,くみ,だい,ひる,つう,1 -235,2年生の漢字[走]の読みは?,そう,ち,ちょう,おとうと,1 -236,2年生の漢字[多]の読みは?,た,いけ,とり,みせ,1 -237,2年生の漢字[太]の読みは?,た,ち,あさ,てん,1 -238,2年生の漢字[体]の読みは?,たい,ちゃ,ちょく,でん,1 -239,2年生の漢字[台]の読みは?,だい,ひる,つう,かたな,1 -240,2年生の漢字[地]の読みは?,ち,ちょう,おとうと,ふゆ,1 -241,2年生の漢字[池]の読みは?,いけ,とり,みせ,とう,1 -242,2年生の漢字[知]の読みは?,ち,あさ,てん,ひがし,1 -243,2年生の漢字[茶]の読みは?,ちゃ,ちょく,でん,とう,1 -244,2年生の漢字[昼]の読みは?,ひる,つう,かたな,あたま,1 -245,2年生の漢字[長]の読みは?,ちょう,おとうと,ふゆ,どう,1 -246,2年生の漢字[鳥]の読みは?,とり,みせ,とう,みち,1 -247,2年生の漢字[朝]の読みは?,あさ,てん,ひがし,どく,1 -248,2年生の漢字[直]の読みは?,ちょく,でん,とう,うち,1 -249,2年生の漢字[通]の読みは?,つう,かたな,あたま,みなみ,1 -250,2年生の漢字[弟]の読みは?,おとうと,ふゆ,どう,にく,1 -251,2年生の漢字[店]の読みは?,みせ,とう,みち,うま,1 -252,2年生の漢字[点]の読みは?,てん,ひがし,どく,ばい,1 -253,2年生の漢字[電]の読みは?,でん,とう,うち,ばい,1 -254,2年生の漢字[刀]の読みは?,かたな,あたま,みなみ,むぎ,1 -255,2年生の漢字[冬]の読みは?,ふゆ,どう,にく,はん,1 -256,2年生の漢字[当]の読みは?,とう,みち,うま,ばん,1 -257,2年生の漢字[東]の読みは?,ひがし,どく,ばい,ちち,1 -258,2年生の漢字[答]の読みは?,とう,うち,ばい,かぜ,1 -259,2年生の漢字[頭]の読みは?,あたま,みなみ,むぎ,ぶん,1 -260,2年生の漢字[同]の読みは?,どう,にく,はん,ぶん,1 -261,2年生の漢字[道]の読みは?,みち,うま,ばん,こめ,1 -262,2年生の漢字[読]の読みは?,どく,ばい,ちち,ほ,1 -263,2年生の漢字[内]の読みは?,うち,ばい,かぜ,はは,1 -264,2年生の漢字[南]の読みは?,みなみ,むぎ,ぶん,ほう,1 -265,2年生の漢字[肉]の読みは?,にく,はん,ぶん,きた,1 -266,2年生の漢字[馬]の読みは?,うま,ばん,こめ,ごと,1 -267,2年生の漢字[売]の読みは?,ばい,ちち,ほ,いもうと,1 -268,2年生の漢字[買]の読みは?,ばい,かぜ,はは,まん,1 -269,2年生の漢字[麦]の読みは?,むぎ,ぶん,ほう,みょう,1 -270,2年生の漢字[半]の読みは?,はん,ぶん,きた,なる,1 -271,2年生の漢字[番]の読みは?,ばん,こめ,ごと,け,1 -272,2年生の漢字[父]の読みは?,ちち,ほ,いもうと,もん,1 -273,2年生の漢字[風]の読みは?,かぜ,はは,まん,よる,1 -274,2年生の漢字[分]の読みは?,ぶん,ほう,みょう,の,1 -275,2年生の漢字[聞]の読みは?,ぶん,きた,なる,とも,1 -276,2年生の漢字[米]の読みは?,こめ,ごと,け,よう,1 -277,2年生の漢字[歩]の読みは?,ほ,いもうと,もん,よう,1 -278,2年生の漢字[母]の読みは?,はは,まん,よる,らい,1 -279,2年生の漢字[方]の読みは?,ほう,みょう,の,さと,1 -280,2年生の漢字[北]の読みは?,きた,なる,とも,ことわり,1 -281,2年生の漢字[毎]の読みは?,ごと,け,よう,はなし,1 -282,2年生の漢字[妹]の読みは?,いもうと,もん,よう,あく,1 -283,2年生の漢字[万]の読みは?,まん,よる,らい,あん,1 -284,2年生の漢字[明]の読みは?,みょう,の,さと,あん,1 -285,2年生の漢字[鳴]の読みは?,なる,とも,ことわり,い,1 -286,2年生の漢字[毛]の読みは?,け,よう,はなし,い,1 -287,2年生の漢字[門]の読みは?,もん,よう,あく,い,1 -288,2年生の漢字[夜]の読みは?,よる,らい,あん,いく,1 -289,2年生の漢字[野]の読みは?,の,さと,あん,いん,1 -290,2年生の漢字[友]の読みは?,とも,ことわり,い,いん,1 -291,2年生の漢字[用]の読みは?,よう,はなし,い,いん,1 -292,2年生の漢字[曜]の読みは?,よう,あく,い,うん,1 -293,2年生の漢字[来]の読みは?,らい,あん,いく,えい,1 -294,2年生の漢字[里]の読みは?,さと,あん,いん,えき,1 -295,2年生の漢字[理]の読みは?,ことわり,い,いん,おう,1 -296,2年生の漢字[話]の読みは?,はなし,い,いん,よこ,1 -297,3年生の漢字[悪]の読みは?,あく,い,うん,おく,1 -298,3年生の漢字[安]の読みは?,あん,いく,えい,おん,1 -299,3年生の漢字[暗]の読みは?,あん,いん,えき,か,1 -300,3年生の漢字[医]の読みは?,い,いん,おう,に,1 -301,3年生の漢字[委]の読みは?,い,いん,よこ,かい,1 -302,3年生の漢字[意]の読みは?,い,うん,おく,かい,1 -303,3年生の漢字[育]の読みは?,いく,えい,おん,かい,1 -304,3年生の漢字[員]の読みは?,いん,えき,か,かん,1 -305,3年生の漢字[院]の読みは?,いん,おう,に,かん,1 -306,3年生の漢字[飲]の読みは?,いん,よこ,かい,かん,1 -307,3年生の漢字[運]の読みは?,うん,おく,かい,やかた,1 -308,3年生の漢字[泳]の読みは?,えい,おん,かい,きし,1 -309,3年生の漢字[駅]の読みは?,えき,か,かん,き,1 -310,3年生の漢字[央]の読みは?,おう,に,かん,き,1 -311,3年生の漢字[横]の読みは?,よこ,かい,かん,きゃく,1 -312,3年生の漢字[屋]の読みは?,おく,かい,やかた,きゅう,1 -313,3年生の漢字[温]の読みは?,おん,かい,きし,きゅう,1 -314,3年生の漢字[化]の読みは?,か,かん,き,きゅう,1 -315,3年生の漢字[荷]の読みは?,に,かん,き,みや,1 -316,3年生の漢字[界]の読みは?,かい,かん,きゃく,たま,1 -317,3年生の漢字[開]の読みは?,かい,やかた,きゅう,きょ,1 -318,3年生の漢字[階]の読みは?,かい,きし,きゅう,はし,1 -319,3年生の漢字[寒]の読みは?,かん,き,きゅう,わざ,1 -320,3年生の漢字[感]の読みは?,かん,き,みや,きょく,1 -321,3年生の漢字[漢]の読みは?,かん,きゃく,たま,きょく,1 -322,3年生の漢字[館]の読みは?,やかた,きゅう,きょ,ぎん,1 -323,3年生の漢字[岸]の読みは?,きし,きゅう,はし,く,1 -324,3年生の漢字[起]の読みは?,き,きゅう,わざ,く,1 -325,3年生の漢字[期]の読みは?,き,みや,きょく,ぐ,1 -326,3年生の漢字[客]の読みは?,きゃく,たま,きょく,きみ,1 -327,3年生の漢字[究]の読みは?,きゅう,きょ,ぎん,かかり,1 -328,3年生の漢字[急]の読みは?,きゅう,はし,く,けい,1 -329,3年生の漢字[級]の読みは?,きゅう,わざ,く,ち,1 -330,3年生の漢字[宮]の読みは?,みや,きょく,ぐ,けつ,1 -331,3年生の漢字[球]の読みは?,たま,きょく,きみ,けん,1 -332,3年生の漢字[去]の読みは?,きょ,ぎん,かかり,けん,1 -333,3年生の漢字[橋]の読みは?,はし,く,けい,こ,1 -334,3年生の漢字[業]の読みは?,わざ,く,ち,みずうみ,1 -335,3年生の漢字[曲]の読みは?,きょく,ぐ,けつ,むこう,1 -336,3年生の漢字[局]の読みは?,きょく,きみ,けん,さち,1 -337,3年生の漢字[銀]の読みは?,ぎん,かかり,けん,みなと,1 -338,3年生の漢字[区]の読みは?,く,けい,こ,ごう,1 -339,3年生の漢字[苦]の読みは?,く,ち,みずうみ,ね,1 -340,3年生の漢字[具]の読みは?,ぐ,けつ,むこう,まつり,1 -341,3年生の漢字[君]の読みは?,きみ,けん,さち,さら,1 -342,3年生の漢字[係]の読みは?,かかり,けん,みなと,し,1 -343,3年生の漢字[軽]の読みは?,けい,こ,ごう,し,1 -344,3年生の漢字[血]の読みは?,ち,みずうみ,ね,し,1 -345,3年生の漢字[決]の読みは?,けつ,むこう,まつり,し,1 -346,3年生の漢字[研]の読みは?,けん,さち,さら,ゆび,1 -347,3年生の漢字[県]の読みは?,けん,みなと,し,は,1 -348,3年生の漢字[庫]の読みは?,こ,ごう,し,し,1 -349,3年生の漢字[湖]の読みは?,みずうみ,ね,し,つぎ,1 -350,3年生の漢字[向]の読みは?,むこう,まつり,し,こと,1 -351,3年生の漢字[幸]の読みは?,さち,さら,ゆび,じ,1 -352,3年生の漢字[港]の読みは?,みなと,し,は,しき,1 -353,3年生の漢字[号]の読みは?,ごう,し,し,じつ,1 -354,3年生の漢字[根]の読みは?,ね,し,つぎ,しゃ,1 -355,3年生の漢字[祭]の読みは?,まつり,し,こと,しゃ,1 -356,3年生の漢字[皿]の読みは?,さら,ゆび,じ,しゅ,1 -357,3年生の漢字[仕]の読みは?,し,は,しき,しゅ,1 -358,3年生の漢字[死]の読みは?,し,し,じつ,しゅ,1 -359,3年生の漢字[使]の読みは?,し,つぎ,しゃ,しゅ,1 -360,3年生の漢字[始]の読みは?,し,こと,しゃ,じゅ,1 -361,3年生の漢字[指]の読みは?,ゆび,じ,しゅ,しゅう,1 -362,3年生の漢字[歯]の読みは?,は,しき,しゅ,しゅう,1 -363,3年生の漢字[詩]の読みは?,し,じつ,しゅ,しゅう,1 -364,3年生の漢字[次]の読みは?,つぎ,しゃ,しゅ,しゅう,1 -365,3年生の漢字[事]の読みは?,こと,しゃ,じゅ,しゅう,1 -366,3年生の漢字[持]の読みは?,じ,しゅ,しゅう,じゅう,1 -367,3年生の漢字[式]の読みは?,しき,しゅ,しゅう,じゅう,1 -368,3年生の漢字[実]の読みは?,じつ,しゅ,しゅう,やど,1 -369,3年生の漢字[写]の読みは?,しゃ,しゅ,しゅう,ところ,1 -370,3年生の漢字[者]の読みは?,しゃ,じゅ,しゅう,しょ,1 -371,3年生の漢字[主]の読みは?,しゅ,しゅう,じゅう,じょ,1 -372,3年生の漢字[守]の読みは?,しゅ,しゅう,じゅう,しょう,1 -373,3年生の漢字[取]の読みは?,しゅ,しゅう,やど,しょう,1 -374,3年生の漢字[酒]の読みは?,しゅ,しゅう,ところ,あきない,1 -375,3年生の漢字[受]の読みは?,じゅ,しゅう,しょ,しょう,1 -376,3年生の漢字[州]の読みは?,しゅう,じゅう,じょ,しょう,1 -377,3年生の漢字[拾]の読みは?,しゅう,じゅう,しょう,じょう,1 -378,3年生の漢字[終]の読みは?,しゅう,やど,しょう,しょく,1 -379,3年生の漢字[習]の読みは?,しゅう,ところ,あきない,しん,1 -380,3年生の漢字[集]の読みは?,しゅう,しょ,しょう,しん,1 -381,3年生の漢字[住]の読みは?,じゅう,じょ,しょう,かみ,1 -382,3年生の漢字[重]の読みは?,じゅう,しょう,じょう,しん,1 -383,3年生の漢字[宿]の読みは?,やど,しょう,しょく,しん,1 -384,3年生の漢字[所]の読みは?,ところ,あきない,しん,しん,1 -385,3年生の漢字[暑]の読みは?,しょ,しょう,しん,よ,1 -386,3年生の漢字[助]の読みは?,じょ,しょう,かみ,せい,1 -387,3年生の漢字[昭]の読みは?,しょう,じょう,しん,むかし,1 -388,3年生の漢字[消]の読みは?,しょう,しょく,しん,ぜん,1 -389,3年生の漢字[商]の読みは?,あきない,しん,しん,そう,1 -390,3年生の漢字[章]の読みは?,しょう,しん,よ,そう,1 -391,3年生の漢字[勝]の読みは?,しょう,かみ,せい,そう,1 -392,3年生の漢字[乗]の読みは?,じょう,しん,むかし,いき,1 -393,3年生の漢字[植]の読みは?,しょく,しん,ぜん,そく,1 -394,3年生の漢字[申]の読みは?,しん,しん,そう,ぞく,1 -395,3年生の漢字[身]の読みは?,しん,よ,そう,た,1 -396,3年生の漢字[神]の読みは?,かみ,せい,そう,だ,1 -397,3年生の漢字[真]の読みは?,しん,むかし,いき,たい,1 -398,3年生の漢字[深]の読みは?,しん,ぜん,そく,たい,1 -399,3年生の漢字[進]の読みは?,しん,そう,ぞく,だい,1 -400,3年生の漢字[世]の読みは?,よ,そう,た,だい,1 -401,3年生の漢字[整]の読みは?,せい,そう,だ,だい,1 -402,3年生の漢字[昔]の読みは?,むかし,いき,たい,たん,1 -403,3年生の漢字[全]の読みは?,ぜん,そく,たい,たん,1 -404,3年生の漢字[相]の読みは?,そう,ぞく,だい,だん,1 -405,3年生の漢字[送]の読みは?,そう,た,だい,ちゃく,1 -406,3年生の漢字[想]の読みは?,そう,だ,だい,ちゅう,1 -407,3年生の漢字[息]の読みは?,いき,たい,たん,はしら,1 -408,3年生の漢字[速]の読みは?,そく,たい,たん,ちょう,1 -409,3年生の漢字[族]の読みは?,ぞく,だい,だん,ちょう,1 -410,3年生の漢字[他]の読みは?,た,だい,ちゃく,ちょう,1 -411,3年生の漢字[打]の読みは?,だ,だい,ちゅう,つい,1 -412,3年生の漢字[対]の読みは?,たい,たん,はしら,じょう,1 -413,3年生の漢字[待]の読みは?,たい,たん,ちょう,にわ,1 -414,3年生の漢字[代]の読みは?,だい,だん,ちょう,ふえ,1 -415,3年生の漢字[第]の読みは?,だい,ちゃく,ちょう,てつ,1 -416,3年生の漢字[題]の読みは?,だい,ちゅう,つい,てん,1 -417,3年生の漢字[炭]の読みは?,たん,はしら,じょう,みやこ,1 -418,3年生の漢字[短]の読みは?,たん,ちょう,にわ,たび,1 -419,3年生の漢字[談]の読みは?,だん,ちょう,ふえ,とう,1 -420,3年生の漢字[着]の読みは?,ちゃく,ちょう,てつ,まめ,1 -421,3年生の漢字[注]の読みは?,ちゅう,つい,てん,しま,1 -422,3年生の漢字[柱]の読みは?,はしら,じょう,みやこ,ゆ,1 -423,3年生の漢字[丁]の読みは?,ちょう,にわ,たび,とう,1 -424,3年生の漢字[帳]の読みは?,ちょう,ふえ,とう,とう,1 -425,3年生の漢字[調]の読みは?,ちょう,てつ,まめ,どう,1 -426,3年生の漢字[追]の読みは?,つい,てん,しま,どう,1 -427,3年生の漢字[定]の読みは?,じょう,みやこ,ゆ,のう,1 -428,3年生の漢字[庭]の読みは?,にわ,たび,とう,なみ,1 -429,3年生の漢字[笛]の読みは?,ふえ,とう,とう,はい,1 -430,3年生の漢字[鉄]の読みは?,てつ,まめ,どう,ばい,1 -431,3年生の漢字[転]の読みは?,てん,しま,どう,はこ,1 -432,3年生の漢字[都]の読みは?,みやこ,ゆ,のう,はたけ,1 -433,3年生の漢字[度]の読みは?,たび,とう,なみ,はつ,1 -434,3年生の漢字[投]の読みは?,とう,とう,はい,はん,1 -435,3年生の漢字[豆]の読みは?,まめ,どう,ばい,さか,1 -436,3年生の漢字[島]の読みは?,しま,どう,はこ,いた,1 -437,3年生の漢字[湯]の読みは?,ゆ,のう,はたけ,かわ,1 -438,3年生の漢字[登]の読みは?,とう,なみ,はつ,ひ,1 -439,3年生の漢字[等]の読みは?,とう,はい,はん,び,1 -440,3年生の漢字[動]の読みは?,どう,ばい,さか,はな,1 -441,3年生の漢字[童]の読みは?,どう,はこ,いた,ふで,1 -442,3年生の漢字[農]の読みは?,のう,はたけ,かわ,こおり,1 -443,3年生の漢字[波]の読みは?,なみ,はつ,ひ,おもて,1 -444,3年生の漢字[配]の読みは?,はい,はん,び,びょう,1 -445,3年生の漢字[倍]の読みは?,ばい,さか,はな,やまい,1 -446,3年生の漢字[箱]の読みは?,はこ,いた,ふで,しな,1 -447,3年生の漢字[畑]の読みは?,はたけ,かわ,こおり,ふ,1 -448,3年生の漢字[発]の読みは?,はつ,ひ,おもて,ぶ,1 -449,3年生の漢字[反]の読みは?,はん,び,びょう,ふく,1 -450,3年生の漢字[坂]の読みは?,さか,はな,やまい,ふく,1 -451,3年生の漢字[板]の読みは?,いた,ふで,しな,ぶつ,1 -452,3年生の漢字[皮]の読みは?,かわ,こおり,ふ,ひら,1 -453,3年生の漢字[悲]の読みは?,ひ,おもて,ぶ,へん,1 -454,3年生の漢字[美]の読みは?,び,びょう,ふく,べん,1 -455,3年生の漢字[鼻]の読みは?,はな,やまい,ふく,ほう,1 -456,3年生の漢字[筆]の読みは?,ふで,しな,ぶつ,あじ,1 -457,3年生の漢字[氷]の読みは?,こおり,ふ,ひら,いのち,1 -458,3年生の漢字[表]の読みは?,おもて,ぶ,へん,めん,1 -459,3年生の漢字[秒]の読みは?,びょう,ふく,べん,もん,1 -460,3年生の漢字[病]の読みは?,やまい,ふく,ほう,やく,1 -461,3年生の漢字[品]の読みは?,しな,ぶつ,あじ,くすり,1 -462,3年生の漢字[負]の読みは?,ふ,ひら,いのち,ゆ,1 -463,3年生の漢字[部]の読みは?,ぶ,へん,めん,あぶら,1 -464,3年生の漢字[服]の読みは?,ふく,べん,もん,ゆう,1 -465,3年生の漢字[福]の読みは?,ふく,ほう,やく,ゆう,1 -466,3年生の漢字[物]の読みは?,ぶつ,あじ,くすり,よ,1 -467,3年生の漢字[平]の読みは?,ひら,いのち,ゆ,ひつじ,1 -468,3年生の漢字[返]の読みは?,へん,めん,あぶら,よう,1 -469,3年生の漢字[勉]の読みは?,べん,もん,ゆう,は,1 -470,3年生の漢字[放]の読みは?,ほう,やく,ゆう,よう,1 -471,3年生の漢字[味]の読みは?,あじ,くすり,よ,さま,1 -472,3年生の漢字[命]の読みは?,いのち,ゆ,ひつじ,らく,1 -473,3年生の漢字[面]の読みは?,めん,あぶら,よう,りゅう,1 -474,3年生の漢字[問]の読みは?,もん,ゆう,は,たび,1 -475,3年生の漢字[役]の読みは?,やく,ゆう,よう,りょう,1 -476,3年生の漢字[薬]の読みは?,くすり,よ,さま,みどり,1 -477,3年生の漢字[由]の読みは?,ゆ,ひつじ,らく,れい,1 -478,3年生の漢字[油]の読みは?,あぶら,よう,りゅう,れつ,1 -479,3年生の漢字[有]の読みは?,ゆう,は,たび,れん,1 -480,3年生の漢字[遊]の読みは?,ゆう,よう,りょう,ろ,1 -481,3年生の漢字[予]の読みは?,よ,さま,みどり,わ,1 -482,3年生の漢字[羊]の読みは?,ひつじ,らく,れい,あい,1 -483,3年生の漢字[洋]の読みは?,よう,りゅう,れつ,あん,1 -484,3年生の漢字[葉]の読みは?,は,たび,れん,い,1 -485,3年生の漢字[陽]の読みは?,よう,りょう,ろ,ころも,1 -486,3年生の漢字[様]の読みは?,さま,みどり,わ,くらい,1 -487,3年生の漢字[落]の読みは?,らく,れい,あい,い,1 -488,3年生の漢字[流]の読みは?,りゅう,れつ,あん,い,1 -489,3年生の漢字[旅]の読みは?,たび,れん,い,しるし,1 -490,3年生の漢字[両]の読みは?,りょう,ろ,ころも,えい,1 -491,3年生の漢字[緑]の読みは?,みどり,わ,くらい,えい,1 -492,3年生の漢字[礼]の読みは?,れい,あい,い,しお,1 -493,3年生の漢字[列]の読みは?,れつ,あん,い,おく,1 -494,3年生の漢字[練]の読みは?,れん,い,しるし,か,1 -495,3年生の漢字[路]の読みは?,ろ,ころも,えい,か,1 -496,3年生の漢字[和]の読みは?,わ,くらい,えい,か,1 -497,4年生の漢字[愛]の読みは?,あい,い,しお,か,1 -498,4年生の漢字[案]の読みは?,あん,い,おく,め,1 -499,4年生の漢字[以]の読みは?,い,しるし,か,かい,1 -500,4年生の漢字[衣]の読みは?,ころも,えい,か,かい,1 -501,4年生の漢字[位]の読みは?,くらい,えい,か,がい,1 -502,4年生の漢字[囲]の読みは?,い,しお,か,まち,1 -503,4年生の漢字[胃]の読みは?,い,おく,め,かく,1 -504,4年生の漢字[印]の読みは?,しるし,か,かい,かく,1 -505,4年生の漢字[英]の読みは?,えい,か,かい,かん,1 -506,4年生の漢字[栄]の読みは?,えい,か,がい,かん,1 -507,4年生の漢字[塩]の読みは?,しお,か,まち,かん,1 -508,4年生の漢字[億]の読みは?,おく,め,かく,かん,1 -509,4年生の漢字[加]の読みは?,か,かい,かく,かん,1 -510,4年生の漢字[果]の読みは?,か,かい,かん,がん,1 -511,4年生の漢字[貨]の読みは?,か,がい,かん,き,1 -512,4年生の漢字[課]の読みは?,か,まち,かん,き,1 -513,4年生の漢字[芽]の読みは?,め,かく,かん,き,1 -514,4年生の漢字[改]の読みは?,かい,かく,かん,き,1 -515,4年生の漢字[械]の読みは?,かい,かん,がん,はた,1 -516,4年生の漢字[害]の読みは?,がい,かん,き,うつわ,1 -517,4年生の漢字[街]の読みは?,まち,かん,き,き,1 -518,4年生の漢字[各]の読みは?,かく,かん,き,ぎ,1 -519,4年生の漢字[覚]の読みは?,かく,かん,き,きゅう,1 -520,4年生の漢字[完]の読みは?,かん,がん,はた,きゅう,1 -521,4年生の漢字[官]の読みは?,かん,き,うつわ,きゅう,1 -522,4年生の漢字[管]の読みは?,かん,き,き,きゅう,1 -523,4年生の漢字[関]の読みは?,かん,き,ぎ,きょ,1 -524,4年生の漢字[観]の読みは?,かん,き,きゅう,りょう,1 -525,4年生の漢字[願]の読みは?,がん,はた,きゅう,きょう,1 -526,4年生の漢字[希]の読みは?,き,うつわ,きゅう,きょう,1 -527,4年生の漢字[季]の読みは?,き,き,きゅう,きょう,1 -528,4年生の漢字[紀]の読みは?,き,ぎ,きょ,きょう,1 -529,4年生の漢字[喜]の読みは?,き,きゅう,りょう,きょく,1 -530,4年生の漢字[旗]の読みは?,はた,きゅう,きょう,くん,1 -531,4年生の漢字[器]の読みは?,うつわ,きゅう,きょう,ぐん,1 -532,4年生の漢字[機]の読みは?,き,きゅう,きょう,ぐん,1 -533,4年生の漢字[議]の読みは?,ぎ,きょ,きょう,けい,1 -534,4年生の漢字[求]の読みは?,きゅう,りょう,きょく,けい,1 -535,4年生の漢字[泣]の読みは?,きゅう,きょう,くん,けい,1 -536,4年生の漢字[救]の読みは?,きゅう,きょう,ぐん,げい,1 -537,4年生の漢字[給]の読みは?,きゅう,きょう,ぐん,けつ,1 -538,4年生の漢字[挙]の読みは?,きょ,きょう,けい,けつ,1 -539,4年生の漢字[漁]の読みは?,りょう,きょく,けい,けん,1 -540,4年生の漢字[共]の読みは?,きょう,くん,けい,けん,1 -541,4年生の漢字[協]の読みは?,きょう,ぐん,げい,けん,1 -542,4年生の漢字[鏡]の読みは?,きょう,ぐん,けつ,こ,1 -543,4年生の漢字[竸]の読みは?,きょう,けい,けつ,こう,1 -544,4年生の漢字[極]の読みは?,きょく,けい,けん,こう,1 -545,4年生の漢字[訓]の読みは?,くん,けい,けん,そうろう,1 -546,4年生の漢字[軍]の読みは?,ぐん,げい,けん,こう,1 -547,4年生の漢字[郡]の読みは?,ぐん,けつ,こ,こう,1 -548,4年生の漢字[径]の読みは?,けい,けつ,こう,こく,1 -549,4年生の漢字[型]の読みは?,けい,けん,こう,さ,1 -550,4年生の漢字[景]の読みは?,けい,けん,そうろう,さい,1 -551,4年生の漢字[芸]の読みは?,げい,けん,こう,さい,1 -552,4年生の漢字[欠]の読みは?,けつ,こ,こう,ざい,1 -553,4年生の漢字[結]の読みは?,けつ,こう,こく,さく,1 -554,4年生の漢字[建]の読みは?,けん,こう,さ,さつ,1 -555,4年生の漢字[健]の読みは?,けん,そうろう,さい,さつ,1 -556,4年生の漢字[験]の読みは?,けん,こう,さい,さつ,1 -557,4年生の漢字[固]の読みは?,こ,こう,ざい,さつ,1 -558,4年生の漢字[功]の読みは?,こう,こく,さく,さん,1 -559,4年生の漢字[好]の読みは?,こう,さ,さつ,さん,1 -560,4年生の漢字[候]の読みは?,そうろう,さい,さつ,さん,1 -561,4年生の漢字[航]の読みは?,こう,さい,さつ,ざん,1 -562,4年生の漢字[康]の読みは?,こう,ざい,さつ,し,1 -563,4年生の漢字[告]の読みは?,こく,さく,さん,し,1 -564,4年生の漢字[差]の読みは?,さ,さつ,さん,し,1 -565,4年生の漢字[菜]の読みは?,さい,さつ,さん,し,1 -566,4年生の漢字[最]の読みは?,さい,さつ,ざん,し,1 -567,4年生の漢字[材]の読みは?,ざい,さつ,し,じ,1 -568,4年生の漢字[昨]の読みは?,さく,さん,し,じ,1 -569,4年生の漢字[札]の読みは?,さつ,さん,し,じ,1 -570,4年生の漢字[刷]の読みは?,さつ,さん,し,しつ,1 -571,4年生の漢字[殺]の読みは?,さつ,ざん,し,しゃく,1 -572,4年生の漢字[察]の読みは?,さつ,し,じ,しゅ,1 -573,4年生の漢字[参]の読みは?,さん,し,じ,しゅう,1 -574,4年生の漢字[産]の読みは?,さん,し,じ,しゅく,1 -575,4年生の漢字[散]の読みは?,さん,し,しつ,じゅん,1 -576,4年生の漢字[残]の読みは?,ざん,し,しゃく,しょ,1 -577,4年生の漢字[士]の読みは?,し,じ,しゅ,まつ,1 -578,4年生の漢字[氏]の読みは?,し,じ,しゅう,しょう,1 -579,4年生の漢字[史]の読みは?,し,じ,しゅく,しょう,1 -580,4年生の漢字[司]の読みは?,し,しつ,じゅん,しょう,1 -581,4年生の漢字[試]の読みは?,し,しゃく,しょ,しょう,1 -582,4年生の漢字[児]の読みは?,じ,しゅ,まつ,しょう,1 -583,4年生の漢字[治]の読みは?,じ,しゅう,しょう,しょう,1 -584,4年生の漢字[辞]の読みは?,じ,しゅく,しょう,しん,1 -585,4年生の漢字[失]の読みは?,しつ,じゅん,しょう,しん,1 -586,4年生の漢字[借]の読みは?,しゃく,しょ,しょう,せい,1 -587,4年生の漢字[種]の読みは?,しゅ,まつ,しょう,しょう,1 -588,4年生の漢字[周]の読みは?,しゅう,しょう,しょう,せい,1 -589,4年生の漢字[祝]の読みは?,しゅく,しょう,しん,せい,1 -590,4年生の漢字[順]の読みは?,じゅん,しょう,しん,せき,1 -591,4年生の漢字[初]の読みは?,しょ,しょう,せい,せき,1 -592,4年生の漢字[松]の読みは?,まつ,しょう,しょう,せつ,1 -593,4年生の漢字[笑]の読みは?,しょう,しょう,せい,せつ,1 -594,4年生の漢字[唱]の読みは?,しょう,しん,せい,せつ,1 -595,4年生の漢字[焼]の読みは?,しょう,しん,せき,せん,1 -596,4年生の漢字[象]の読みは?,しょう,せい,せき,せん,1 -597,4年生の漢字[照]の読みは?,しょう,しょう,せつ,せん,1 -598,4年生の漢字[賞]の読みは?,しょう,せい,せつ,ねん,1 -599,4年生の漢字[臣]の読みは?,しん,せい,せつ,そう,1 -600,4年生の漢字[信]の読みは?,しん,せき,せん,そう,1 -601,4年生の漢字[成]の読みは?,せい,せき,せん,す,1 -602,4年生の漢字[省]の読みは?,しょう,せつ,せん,つか,1 -603,4年生の漢字[清]の読みは?,せい,せつ,ねん,がわ,1 -604,4年生の漢字[静]の読みは?,せい,せつ,そう,ぞく,1 -605,4年生の漢字[席]の読みは?,せき,せん,そう,そつ,1 -606,4年生の漢字[積]の読みは?,せき,せん,す,まご,1 -607,4年生の漢字[折]の読みは?,せつ,せん,つか,おび,1 -608,4年生の漢字[節]の読みは?,せつ,ねん,がわ,たい,1 -609,4年生の漢字[説]の読みは?,せつ,そう,ぞく,たち,1 -610,4年生の漢字[浅]の読みは?,せん,そう,そつ,たん,1 -611,4年生の漢字[戦]の読みは?,せん,す,まご,ち,1 -612,4年生の漢字[選]の読みは?,せん,つか,おび,ちゅう,1 -613,4年生の漢字[然]の読みは?,ねん,がわ,たい,ちょ,1 -614,4年生の漢字[争]の読みは?,そう,ぞく,たち,ちょう,1 -615,4年生の漢字[倉]の読みは?,そう,そつ,たん,ちょう,1 -616,4年生の漢字[巣]の読みは?,す,まご,ち,てい,1 -617,4年生の漢字[束]の読みは?,つか,おび,ちゅう,てい,1 -618,4年生の漢字[側]の読みは?,がわ,たい,ちょ,てい,1 -619,4年生の漢字[続]の読みは?,ぞく,たち,ちょう,まと,1 -620,4年生の漢字[卒]の読みは?,そつ,たん,ちょう,てん,1 -621,4年生の漢字[孫]の読みは?,まご,ち,てい,でん,1 -622,4年生の漢字[帯]の読みは?,おび,ちゅう,てい,と,1 -623,4年生の漢字[隊]の読みは?,たい,ちょ,てい,ど,1 -624,4年生の漢字[達]の読みは?,たち,ちょう,まと,とう,1 -625,4年生の漢字[単]の読みは?,たん,ちょう,てん,どう,1 -626,4年生の漢字[置]の読みは?,ち,てい,でん,どう,1 -627,4年生の漢字[仲]の読みは?,ちゅう,てい,と,とく,1 -628,4年生の漢字[貯]の読みは?,ちょ,てい,ど,とく,1 -629,4年生の漢字[兆]の読みは?,ちょう,まと,とう,どく,1 -630,4年生の漢字[腸]の読みは?,ちょう,てん,どう,ねつ,1 -631,4年生の漢字[低]の読みは?,てい,でん,どう,ねん,1 -632,4年生の漢字[底]の読みは?,てい,と,とく,はい,1 -633,4年生の漢字[停]の読みは?,てい,ど,とく,ばい,1 -634,4年生の漢字[的]の読みは?,まと,とう,どく,はく,1 -635,4年生の漢字[典]の読みは?,てん,どう,ねつ,めし,1 -636,4年生の漢字[伝]の読みは?,でん,どう,ねん,ひ,1 -637,4年生の漢字[徒]の読みは?,と,とく,はい,ひ,1 -638,4年生の漢字[努]の読みは?,ど,とく,ばい,ひつ,1 -639,4年生の漢字[灯]の読みは?,とう,どく,はく,ひょう,1 -640,4年生の漢字[堂]の読みは?,どう,ねつ,めし,ひょう,1 -641,4年生の漢字[働]の読みは?,どう,ねん,ひ,ふ,1 -642,4年生の漢字[特]の読みは?,とく,はい,ひ,ふ,1 -643,4年生の漢字[得]の読みは?,とく,ばい,ひつ,ふ,1 -644,4年生の漢字[毒]の読みは?,どく,はく,ひょう,ふ,1 -645,4年生の漢字[熱]の読みは?,ねつ,めし,ひょう,ふく,1 -646,4年生の漢字[念]の読みは?,ねん,ひ,ふ,ふん,1 -647,4年生の漢字[敗]の読みは?,はい,ひ,ふ,へい,1 -648,4年生の漢字[梅]の読みは?,ばい,ひつ,ふ,べつ,1 -649,4年生の漢字[博]の読みは?,はく,ひょう,ふ,へん,1 -650,4年生の漢字[飯]の読みは?,めし,ひょう,ふく,へん,1 -651,4年生の漢字[飛]の読みは?,ひ,ふ,ふん,べん,1 -652,4年生の漢字[費]の読みは?,ひ,ふ,へい,ほう,1 -653,4年生の漢字[必]の読みは?,ひつ,ふ,べつ,ほう,1 -654,4年生の漢字[票]の読みは?,ひょう,ふ,へん,ぼう,1 -655,4年生の漢字[標]の読みは?,ひょう,ふく,へん,ぼく,1 -656,4年生の漢字[不]の読みは?,ふ,ふん,べん,すえ,1 -657,4年生の漢字[夫]の読みは?,ふ,へい,ほう,みつ,1 -658,4年生の漢字[付]の読みは?,ふ,べつ,ほう,み,1 -659,4年生の漢字[府]の読みは?,ふ,へん,ぼう,みゃく,1 -660,4年生の漢字[副]の読みは?,ふく,へん,ぼく,みん,1 -661,4年生の漢字[粉]の読みは?,ふん,べん,すえ,む,1 -662,4年生の漢字[兵]の読みは?,へい,ほう,みつ,やく,1 -663,4年生の漢字[別]の読みは?,べつ,ほう,み,ゆう,1 -664,4年生の漢字[辺]の読みは?,へん,ぼう,みゃく,よう,1 -665,4年生の漢字[変]の読みは?,へん,ぼく,みん,よう,1 -666,4年生の漢字[便]の読みは?,べん,すえ,む,よく,1 -667,4年生の漢字[包]の読みは?,ほう,みつ,やく,り,1 -668,4年生の漢字[法]の読みは?,ほう,み,ゆう,りく,1 -669,4年生の漢字[望]の読みは?,ぼう,みゃく,よう,りょう,1 -670,4年生の漢字[牧]の読みは?,ぼく,みん,よう,りょう,1 -671,4年生の漢字[末]の読みは?,すえ,む,よく,りょう,1 -672,4年生の漢字[満]の読みは?,みつ,やく,り,りん,1 -673,4年生の漢字[未]の読みは?,み,ゆう,りく,るい,1 -674,4年生の漢字[脈]の読みは?,みゃく,よう,りょう,れい,1 -675,4年生の漢字[民]の読みは?,みん,よう,りょう,れい,1 -676,4年生の漢字[無]の読みは?,む,よく,りょう,れい,1 -677,4年生の漢字[約]の読みは?,やく,り,りん,れき,1 -678,4年生の漢字[勇]の読みは?,ゆう,りく,るい,れん,1 -679,4年生の漢字[要]の読みは?,よう,りょう,れい,ろう,1 -680,4年生の漢字[養]の読みは?,よう,りょう,れい,ろう,1 -681,4年生の漢字[浴]の読みは?,よく,りょう,れい,ろく,1 -682,4年生の漢字[利]の読みは?,り,りん,れき,あつ,1 -683,4年生の漢字[陸]の読みは?,りく,るい,れん,い,1 -684,4年生の漢字[良]の読みは?,りょう,れい,ろう,いん,1 -685,4年生の漢字[料]の読みは?,りょう,れい,ろう,えい,1 -686,4年生の漢字[量]の読みは?,りょう,れい,ろく,えい,1 -687,4年生の漢字[輪]の読みは?,りん,れき,あつ,えい,1 -688,4年生の漢字[類]の読みは?,るい,れん,い,えき,1 -689,4年生の漢字[令]の読みは?,れい,ろう,いん,えき,1 -690,4年生の漢字[冷]の読みは?,れい,ろう,えい,えき,1 -691,4年生の漢字[例]の読みは?,れい,ろく,えい,えん,1 -692,4年生の漢字[歴]の読みは?,れき,あつ,えい,おう,1 -693,4年生の漢字[連]の読みは?,れん,い,えき,おう,1 -694,4年生の漢字[老]の読みは?,ろう,いん,えき,さくら,1 -695,4年生の漢字[労]の読みは?,ろう,えい,えき,おん,1 -696,4年生の漢字[録]の読みは?,ろく,えい,えん,か,1 -697,5年生の漢字[圧]の読みは?,あつ,えい,おう,かり,1 -698,5年生の漢字[移]の読みは?,い,えき,おう,か,1 -699,5年生の漢字[因]の読みは?,いん,えき,さくら,かわ,1 -700,5年生の漢字[永]の読みは?,えい,えき,おん,か,1 -701,5年生の漢字[営]の読みは?,えい,えん,か,が,1 -702,5年生の漢字[衞]の読みは?,えい,おう,かり,かい,1 -703,5年生の漢字[易]の読みは?,えき,おう,か,かい,1 -704,5年生の漢字[益]の読みは?,えき,さくら,かわ,かく,1 -705,5年生の漢字[液]の読みは?,えき,おん,か,かく,1 -706,5年生の漢字[演]の読みは?,えん,か,が,がく,1 -707,5年生の漢字[応]の読みは?,おう,かり,かい,かん,1 -708,5年生の漢字[往]の読みは?,おう,か,かい,かん,1 -709,5年生の漢字[桜]の読みは?,さくら,かわ,かく,かん,1 -710,5年生の漢字[恩]の読みは?,おん,か,かく,がん,1 -711,5年生の漢字[可]の読みは?,か,が,がく,もと,1 -712,5年生の漢字[仮]の読みは?,かり,かい,かん,き,1 -713,5年生の漢字[価]の読みは?,か,かい,かん,き,1 -714,5年生の漢字[河]の読みは?,かわ,かく,かん,ぎ,1 -715,5年生の漢字[過]の読みは?,か,かく,がん,ぎ,1 -716,5年生の漢字[賀]の読みは?,が,がく,もと,ぎゃく,1 -717,5年生の漢字[快]の読みは?,かい,かん,き,きゅう,1 -718,5年生の漢字[解]の読みは?,かい,かん,き,きゅう,1 -719,5年生の漢字[格]の読みは?,かく,かん,ぎ,きょ,1 -720,5年生の漢字[確]の読みは?,かく,がん,ぎ,きょ,1 -721,5年生の漢字[額]の読みは?,がく,もと,ぎゃく,きょう,1 -722,5年生の漢字[刊]の読みは?,かん,き,きゅう,きん,1 -723,5年生の漢字[幹]の読みは?,かん,き,きゅう,きん,1 -724,5年生の漢字[慣]の読みは?,かん,ぎ,きょ,く,1 -725,5年生の漢字[眼]の読みは?,がん,ぎ,きょ,ぐん,1 -726,5年生の漢字[基]の読みは?,もと,ぎゃく,きょう,けい,1 -727,5年生の漢字[寄]の読みは?,き,きゅう,きん,けつ,1 -728,5年生の漢字[規]の読みは?,き,きゅう,きん,けん,1 -729,5年生の漢字[技]の読みは?,ぎ,きょ,く,けん,1 -730,5年生の漢字[義]の読みは?,ぎ,きょ,ぐん,けん,1 -731,5年生の漢字[逆]の読みは?,ぎゃく,きょう,けい,けん,1 -732,5年生の漢字[久]の読みは?,きゅう,きん,けつ,げん,1 -733,5年生の漢字[旧]の読みは?,きゅう,きん,けん,げん,1 -734,5年生の漢字[居]の読みは?,きょ,く,けん,げん,1 -735,5年生の漢字[許]の読みは?,きょ,ぐん,けん,ゆえ,1 -736,5年生の漢字[境]の読みは?,きょう,けい,けん,こ,1 -737,5年生の漢字[均]の読みは?,きん,けつ,げん,ご,1 -738,5年生の漢字[禁]の読みは?,きん,けん,げん,こう,1 -739,5年生の漢字[句]の読みは?,く,けん,げん,こう,1 -740,5年生の漢字[群]の読みは?,ぐん,けん,ゆえ,こう,1 -741,5年生の漢字[経]の読みは?,けい,けん,こ,こう,1 -742,5年生の漢字[潔]の読みは?,けつ,げん,ご,こう,1 -743,5年生の漢字[件]の読みは?,けん,げん,こう,こう,1 -744,5年生の漢字[券]の読みは?,けん,げん,こう,こう,1 -745,5年生の漢字[険]の読みは?,けん,ゆえ,こう,こん,1 -746,5年生の漢字[検]の読みは?,けん,こ,こう,さ,1 -747,5年生の漢字[限]の読みは?,げん,ご,こう,さい,1 -748,5年生の漢字[現]の読みは?,げん,こう,こう,さい,1 -749,5年生の漢字[減]の読みは?,げん,こう,こう,さい,1 -750,5年生の漢字[故]の読みは?,ゆえ,こう,こん,さい,1 -751,5年生の漢字[個]の読みは?,こ,こう,さ,ざい,1 -752,5年生の漢字[護]の読みは?,ご,こう,さい,ざい,1 -753,5年生の漢字[効]の読みは?,こう,こう,さい,ざい,1 -754,5年生の漢字[厚]の読みは?,こう,こう,さい,ざつ,1 -755,5年生の漢字[耕]の読みは?,こう,こん,さい,さん,1 -756,5年生の漢字[鉱]の読みは?,こう,さ,ざい,さん,1 -757,5年生の漢字[構]の読みは?,こう,さい,ざい,し,1 -758,5年生の漢字[興]の読みは?,こう,さい,ざい,えだ,1 -759,5年生の漢字[講]の読みは?,こう,さい,ざつ,し,1 -760,5年生の漢字[混]の読みは?,こん,さい,さん,し,1 -761,5年生の漢字[査]の読みは?,さ,ざい,さん,し,1 -762,5年生の漢字[再]の読みは?,さい,ざい,し,じ,1 -763,5年生の漢字[災]の読みは?,さい,ざい,えだ,じ,1 -764,5年生の漢字[妻]の読みは?,さい,ざつ,し,しき,1 -765,5年生の漢字[採]の読みは?,さい,さん,し,しつ,1 -766,5年生の漢字[在]の読みは?,ざい,さん,し,しゃ,1 -767,5年生の漢字[財]の読みは?,ざい,し,じ,しゃ,1 -768,5年生の漢字[罪]の読みは?,ざい,えだ,じ,じゅ,1 -769,5年生の漢字[雑]の読みは?,ざつ,し,しき,しゅう,1 -770,5年生の漢字[酸]の読みは?,さん,し,しつ,じゅつ,1 -771,5年生の漢字[賛]の読みは?,さん,し,しゃ,じゅつ,1 -772,5年生の漢字[志]の読みは?,し,じ,しゃ,じゅん,1 -773,5年生の漢字[枝]の読みは?,えだ,じ,じゅ,じょ,1 -774,5年生の漢字[師]の読みは?,し,しき,しゅう,しょう,1 -775,5年生の漢字[資]の読みは?,し,しつ,じゅつ,しょう,1 -776,5年生の漢字[飼]の読みは?,し,しゃ,じゅつ,しょう,1 -777,5年生の漢字[示]の読みは?,じ,しゃ,じゅん,じょう,1 -778,5年生の漢字[似]の読みは?,じ,じゅ,じょ,じょう,1 -779,5年生の漢字[識]の読みは?,しき,しゅう,しょう,じょう,1 -780,5年生の漢字[質]の読みは?,しつ,じゅつ,しょう,じょう,1 -781,5年生の漢字[舎]の読みは?,しゃ,じゅつ,しょう,しき,1 -782,5年生の漢字[謝]の読みは?,しゃ,じゅん,じょう,しょく,1 -783,5年生の漢字[授]の読みは?,じゅ,じょ,じょう,せい,1 -784,5年生の漢字[修]の読みは?,しゅう,しょう,じょう,せい,1 -785,5年生の漢字[述]の読みは?,じゅつ,しょう,じょう,せい,1 -786,5年生の漢字[術]の読みは?,じゅつ,しょう,しき,せい,1 -787,5年生の漢字[準]の読みは?,じゅん,じょう,しょく,せい,1 -788,5年生の漢字[序]の読みは?,じょ,じょう,せい,せい,1 -789,5年生の漢字[招]の読みは?,しょう,じょう,せい,ぜい,1 -790,5年生の漢字[承]の読みは?,しょう,じょう,せい,せき,1 -791,5年生の漢字[証]の読みは?,しょう,しき,せい,せき,1 -792,5年生の漢字[条]の読みは?,じょう,しょく,せい,せつ,1 -793,5年生の漢字[状]の読みは?,じょう,せい,せい,せつ,1 -794,5年生の漢字[常]の読みは?,じょう,せい,ぜい,ぜつ,1 -795,5年生の漢字[情]の読みは?,じょう,せい,せき,ぜつ,1 -796,5年生の漢字[織]の読みは?,しき,せい,せき,せん,1 -797,5年生の漢字[職]の読みは?,しょく,せい,せつ,そ,1 -798,5年生の漢字[制]の読みは?,せい,せい,せつ,そ,1 -799,5年生の漢字[性]の読みは?,せい,ぜい,ぜつ,そう,1 -800,5年生の漢字[政]の読みは?,せい,せき,ぜつ,ぞう,1 -801,5年生の漢字[勢]の読みは?,せい,せき,せん,ぞう,1 -802,5年生の漢字[精]の読みは?,せい,せつ,そ,ぞう,1 -803,5年生の漢字[製]の読みは?,せい,せつ,そ,そく,1 -804,5年生の漢字[税]の読みは?,ぜい,ぜつ,そう,そく,1 -805,5年生の漢字[責]の読みは?,せき,ぜつ,ぞう,ぞく,1 -806,5年生の漢字[績]の読みは?,せき,せん,ぞう,りつ,1 -807,5年生の漢字[接]の読みは?,せつ,そ,ぞう,そん,1 -808,5年生の漢字[設]の読みは?,せつ,そ,そく,たい,1 -809,5年生の漢字[舌]の読みは?,ぜつ,そう,そく,たい,1 -810,5年生の漢字[絶]の読みは?,ぜつ,ぞう,ぞく,たい,1 -811,5年生の漢字[銭]の読みは?,せん,ぞう,りつ,だん,1 -812,5年生の漢字[祖]の読みは?,そ,ぞう,そん,だん,1 -813,5年生の漢字[素]の読みは?,そ,そく,たい,ちく,1 -814,5年生の漢字[総]の読みは?,そう,そく,たい,ちょう,1 -815,5年生の漢字[造]の読みは?,ぞう,ぞく,たい,てい,1 -816,5年生の漢字[像]の読みは?,ぞう,りつ,だん,てい,1 -817,5年生の漢字[増]の読みは?,ぞう,そん,だん,てき,1 -818,5年生の漢字[則]の読みは?,そく,たい,ちく,てき,1 -819,5年生の漢字[測]の読みは?,そく,たい,ちょう,とう,1 -820,5年生の漢字[属]の読みは?,ぞく,たい,てい,どう,1 -821,5年生の漢字[率]の読みは?,りつ,だん,てい,どう,1 -822,5年生の漢字[損]の読みは?,そん,だん,てき,とく,1 -823,5年生の漢字[退]の読みは?,たい,ちく,てき,どく,1 -824,5年生の漢字[貸]の読みは?,たい,ちょう,とう,にん,1 -825,5年生の漢字[態]の読みは?,たい,てい,どう,ねん,1 -826,5年生の漢字[団]の読みは?,だん,てい,どう,のう,1 -827,5年生の漢字[断]の読みは?,だん,てき,とく,は,1 -828,5年生の漢字[築]の読みは?,ちく,てき,どく,はん,1 -829,5年生の漢字[張]の読みは?,ちょう,とう,にん,はん,1 -830,5年生の漢字[堤]の読みは?,てい,どう,ねん,はん,1 -831,5年生の漢字[程]の読みは?,てい,どう,のう,ひ,1 -832,5年生の漢字[適]の読みは?,てき,とく,は,ひ,1 -833,5年生の漢字[敵]の読みは?,てき,どく,はん,ひ,1 -834,5年生の漢字[統]の読みは?,とう,にん,はん,び,1 -835,5年生の漢字[銅]の読みは?,どう,ねん,はん,びょう,1 -836,5年生の漢字[導]の読みは?,どう,のう,ひ,ひょう,1 -837,5年生の漢字[徳]の読みは?,とく,は,ひ,ひん,1 -838,5年生の漢字[独]の読みは?,どく,はん,ひ,ふ,1 -839,5年生の漢字[任]の読みは?,にん,はん,び,ふ,1 -840,5年生の漢字[燃]の読みは?,ねん,はん,びょう,とみ,1 -841,5年生の漢字[能]の読みは?,のう,ひ,ひょう,ぶ,1 -842,5年生の漢字[破]の読みは?,は,ひ,ひん,ふく,1 -843,5年生の漢字[犯]の読みは?,はん,ひ,ふ,ふく,1 -844,5年生の漢字[判]の読みは?,はん,び,ふ,ぶつ,1 -845,5年生の漢字[版]の読みは?,はん,びょう,とみ,へん,1 -846,5年生の漢字[比]の読みは?,ひ,ひょう,ぶ,べん,1 -847,5年生の漢字[肥]の読みは?,ひ,ひん,ふく,ほ,1 -848,5年生の漢字[非]の読みは?,ひ,ふ,ふく,はか,1 -849,5年生の漢字[備]の読みは?,び,ふ,ぶつ,ほう,1 -850,5年生の漢字[俵]の読みは?,びょう,とみ,へん,ほう,1 -851,5年生の漢字[評]の読みは?,ひょう,ぶ,べん,ぼう,1 -852,5年生の漢字[貧]の読みは?,ひん,ふく,ほ,ぼう,1 -853,5年生の漢字[布]の読みは?,ふ,ふく,はか,ぼう,1 -854,5年生の漢字[婦]の読みは?,ふ,ぶつ,ほう,む,1 -855,5年生の漢字[富]の読みは?,とみ,へん,ほう,む,1 -856,5年生の漢字[武]の読みは?,ぶ,べん,ぼう,めい,1 -857,5年生の漢字[復]の読みは?,ふく,ほ,ぼう,めん,1 -858,5年生の漢字[複]の読みは?,ふく,はか,ぼう,ゆ,1 -859,5年生の漢字[仏]の読みは?,ぶつ,ほう,む,よ,1 -860,5年生の漢字[編]の読みは?,へん,ほう,む,よ,1 -861,5年生の漢字[弁]の読みは?,べん,ぼう,めい,よう,1 -862,5年生の漢字[保]の読みは?,ほ,ぼう,めん,りゃく,1 -863,5年生の漢字[墓]の読みは?,はか,ぼう,ゆ,りゅう,1 -864,5年生の漢字[報]の読みは?,ほう,む,よ,りょう,1 -865,5年生の漢字[豊]の読みは?,ほう,む,よ,い,1 -866,5年生の漢字[防]の読みは?,ぼう,めい,よう,い,1 -867,5年生の漢字[貿]の読みは?,ぼう,めん,りゃく,いき,1 -868,5年生の漢字[暴]の読みは?,ぼう,ゆ,りゅう,う,1 -869,5年生の漢字[務]の読みは?,む,よ,りょう,えい,1 -870,5年生の漢字[夢]の読みは?,む,よ,い,えん,1 -871,5年生の漢字[迷]の読みは?,めい,よう,い,えん,1 -872,5年生の漢字[綿]の読みは?,めん,りゃく,いき,が,1 -873,5年生の漢字[輸]の読みは?,ゆ,りゅう,う,はい,1 -874,5年生の漢字[余]の読みは?,よ,りょう,えい,かく,1 -875,5年生の漢字[預]の読みは?,よ,い,えん,かく,1 -876,5年生の漢字[容]の読みは?,よう,い,えん,かく,1 -877,5年生の漢字[略]の読みは?,りゃく,いき,が,かつ,1 -878,5年生の漢字[留]の読みは?,りゅう,う,はい,かぶ,1 -879,5年生の漢字[領]の読みは?,りょう,えい,かく,かん,1 -880,6年生の漢字[異]の読みは?,い,えん,かく,かん,1 -881,6年生の漢字[遺]の読みは?,い,えん,かく,かん,1 -882,6年生の漢字[域]の読みは?,いき,が,かつ,かん,1 -883,6年生の漢字[宇]の読みは?,う,はい,かぶ,き,1 -884,6年生の漢字[映]の読みは?,えい,かく,かん,き,1 -885,6年生の漢字[延]の読みは?,えん,かく,かん,き,1 -886,6年生の漢字[沿]の読みは?,えん,かく,かん,き,1 -887,6年生の漢字[我]の読みは?,が,かつ,かん,ぎ,1 -888,6年生の漢字[灰]の読みは?,はい,かぶ,き,きゅう,1 -889,6年生の漢字[拡]の読みは?,かく,かん,き,きょう,1 -890,6年生の漢字[革]の読みは?,かく,かん,き,きょう,1 -891,6年生の漢字[閣]の読みは?,かく,かん,き,きょう,1 -892,6年生の漢字[割]の読みは?,かつ,かん,ぎ,きん,1 -893,6年生の漢字[株]の読みは?,かぶ,き,きゅう,きん,1 -894,6年生の漢字[干]の読みは?,かん,き,きょう,けい,1 -895,6年生の漢字[巻]の読みは?,かん,き,きょう,けい,1 -896,6年生の漢字[看]の読みは?,かん,き,きょう,けい,1 -897,6年生の漢字[簡]の読みは?,かん,ぎ,きん,げき,1 -898,6年生の漢字[危]の読みは?,き,きゅう,きん,げき,1 -899,6年生の漢字[机]の読みは?,き,きょう,けい,あな,1 -900,6年生の漢字[揮]の読みは?,き,きょう,けい,きぬ,1 -901,6年生の漢字[貴]の読みは?,き,きょう,けい,けん,1 -902,6年生の漢字[疑]の読みは?,ぎ,きん,げき,けん,1 -903,6年生の漢字[吸]の読みは?,きゅう,きん,げき,げん,1 -904,6年生の漢字[供]の読みは?,きょう,けい,あな,げん,1 -905,6年生の漢字[胸]の読みは?,きょう,けい,きぬ,こ,1 -906,6年生の漢字[郷]の読みは?,きょう,けい,けん,こ,1 -907,6年生の漢字[勤]の読みは?,きん,げき,けん,ご,1 -908,6年生の漢字[筋]の読みは?,きん,げき,げん,ごう,1 -909,6年生の漢字[系]の読みは?,けい,あな,げん,こう,1 -910,6年生の漢字[敬]の読みは?,けい,きぬ,こ,こう,1 -911,6年生の漢字[警]の読みは?,けい,けん,こ,こう,1 -912,6年生の漢字[劇]の読みは?,げき,けん,ご,こう,1 -913,6年生の漢字[激]の読みは?,げき,げん,ごう,こう,1 -914,6年生の漢字[穴]の読みは?,あな,げん,こう,こく,1 -915,6年生の漢字[絹]の読みは?,きぬ,こ,こう,こく,1 -916,6年生の漢字[権]の読みは?,けん,こ,こう,こつ,1 -917,6年生の漢字[憲]の読みは?,けん,ご,こう,こん,1 -918,6年生の漢字[源]の読みは?,げん,ごう,こう,さ,1 -919,6年生の漢字[厳]の読みは?,げん,こう,こく,ざ,1 -920,6年生の漢字[己]の読みは?,こ,こう,こく,さい,1 -921,6年生の漢字[呼]の読みは?,こ,こう,こつ,さい,1 -922,6年生の漢字[誤]の読みは?,ご,こう,こん,さく,1 -923,6年生の漢字[后]の読みは?,ごう,こう,さ,さつ,1 -924,6年生の漢字[考]の読みは?,こう,こく,ざ,かいこ,1 -925,6年生の漢字[皇]の読みは?,こう,こく,さい,し,1 -926,6年生の漢字[紅]の読みは?,こう,こつ,さい,し,1 -927,6年生の漢字[降]の読みは?,こう,こん,さく,し,1 -928,6年生の漢字[鋼]の読みは?,こう,さ,さつ,し,1 -929,6年生の漢字[刻]の読みは?,こく,ざ,かいこ,し,1 -930,6年生の漢字[穀]の読みは?,こく,さい,し,し,1 -931,6年生の漢字[骨]の読みは?,こつ,さい,し,じ,1 -932,6年生の漢字[困]の読みは?,こん,さく,し,しゃ,1 -933,6年生の漢字[砂]の読みは?,さ,さつ,し,しゃ,1 -934,6年生の漢字[座]の読みは?,ざ,かいこ,し,しゃく,1 -935,6年生の漢字[済]の読みは?,さい,し,し,じゃく,1 -936,6年生の漢字[裁]の読みは?,さい,し,じ,じゅ,1 -937,6年生の漢字[策]の読みは?,さく,し,しゃ,しゅう,1 -938,6年生の漢字[冊]の読みは?,さつ,し,しゃ,しゅう,1 -939,6年生の漢字[蚕]の読みは?,かいこ,し,しゃく,しゅう,1 -940,6年生の漢字[至]の読みは?,し,し,じゃく,しゅう,1 -941,6年生の漢字[私]の読みは?,し,じ,じゅ,じゅう,1 -942,6年生の漢字[姿]の読みは?,し,しゃ,しゅう,じゅう,1 -943,6年生の漢字[視]の読みは?,し,しゃ,しゅう,しゅく,1 -944,6年生の漢字[詞]の読みは?,し,しゃく,しゅう,じゅく,1 -945,6年生の漢字[誌]の読みは?,し,じゃく,しゅう,じゅん,1 -946,6年生の漢字[磁]の読みは?,じ,じゅ,じゅう,ところ,1 -947,6年生の漢字[射]の読みは?,しゃ,しゅう,じゅう,しょ,1 -948,6年生の漢字[捨]の読みは?,しゃ,しゅう,しゅく,しょ,1 -949,6年生の漢字[尺]の読みは?,しゃく,しゅう,じゅく,じょ,1 -950,6年生の漢字[若]の読みは?,じゃく,しゅう,じゅん,しょう,1 -951,6年生の漢字[樹]の読みは?,じゅ,じゅう,ところ,しょう,1 -952,6年生の漢字[収]の読みは?,しゅう,じゅう,しょ,しょう,1 -953,6年生の漢字[宗]の読みは?,しゅう,しゅく,しょ,じょう,1 -954,6年生の漢字[就]の読みは?,しゅう,じゅく,じょ,じょう,1 -955,6年生の漢字[衆]の読みは?,しゅう,じゅん,しょう,しん,1 -956,6年生の漢字[従]の読みは?,じゅう,ところ,しょう,じん,1 -957,6年生の漢字[縦]の読みは?,じゅう,しょ,しょう,すい,1 -958,6年生の漢字[縮]の読みは?,しゅく,しょ,じょう,すい,1 -959,6年生の漢字[熟]の読みは?,じゅく,じょ,じょう,すん,1 -960,6年生の漢字[純]の読みは?,じゅん,しょう,しん,せい,1 -961,6年生の漢字[処]の読みは?,ところ,しょう,じん,せい,1 -962,6年生の漢字[署]の読みは?,しょ,しょう,すい,せい,1 -963,6年生の漢字[諸]の読みは?,しょ,じょう,すい,せん,1 -964,6年生の漢字[除]の読みは?,じょ,じょう,すん,せん,1 -965,6年生の漢字[将]の読みは?,しょう,しん,せい,せん,1 -966,6年生の漢字[傷]の読みは?,しょう,じん,せい,せん,1 -967,6年生の漢字[障]の読みは?,しょう,すい,せい,せん,1 -968,6年生の漢字[城]の読みは?,じょう,すい,せん,ぜん,1 -969,6年生の漢字[蒸]の読みは?,じょう,すん,せん,そう,1 -970,6年生の漢字[針]の読みは?,しん,せい,せん,まど,1 -971,6年生の漢字[仁]の読みは?,じん,せい,せん,そう,1 -972,6年生の漢字[垂]の読みは?,すい,せい,せん,そう,1 -973,6年生の漢字[推]の読みは?,すい,せん,ぜん,そう,1 -974,6年生の漢字[寸]の読みは?,すん,せん,そう,そう,1 -975,6年生の漢字[盛]の読みは?,せい,せん,まど,ぞう,1 -976,6年生の漢字[聖]の読みは?,せい,せん,そう,ぞう,1 -977,6年生の漢字[誠]の読みは?,せい,せん,そう,ぞん,1 -978,6年生の漢字[宣]の読みは?,せん,ぜん,そう,そん,1 -979,6年生の漢字[専]の読みは?,せん,そう,そう,たく,1 -980,6年生の漢字[泉]の読みは?,せん,まど,ぞう,たん,1 -981,6年生の漢字[洗]の読みは?,せん,そう,ぞう,たん,1 -982,6年生の漢字[染]の読みは?,せん,そう,ぞん,たん,1 -983,6年生の漢字[善]の読みは?,ぜん,そう,そん,だん,1 -984,6年生の漢字[奏]の読みは?,そう,そう,たく,だん,1 -985,6年生の漢字[窓]の読みは?,まど,ぞう,たん,ち,1 -986,6年生の漢字[創]の読みは?,そう,ぞう,たん,ちゅう,1 -987,6年生の漢字[装]の読みは?,そう,ぞん,たん,ちゅう,1 -988,6年生の漢字[層]の読みは?,そう,そん,だん,ちょ,1 -989,6年生の漢字[操]の読みは?,そう,たく,だん,ちょう,1 -990,6年生の漢字[蔵]の読みは?,ぞう,たん,ち,ちょう,1 -991,6年生の漢字[臓]の読みは?,ぞう,たん,ちゅう,しお,1 -992,6年生の漢字[存]の読みは?,ぞん,たん,ちゅう,ちん,1 -993,6年生の漢字[尊]の読みは?,そん,だん,ちょ,つう,1 -994,6年生の漢字[宅]の読みは?,たく,だん,ちょう,てん,1 -995,6年生の漢字[担]の読みは?,たん,ち,ちょう,とう,1 -996,6年生の漢字[探]の読みは?,たん,ちゅう,しお,とう,1 -997,6年生の漢字[誕]の読みは?,たん,ちゅう,ちん,とう,1 -998,6年生の漢字[段]の読みは?,だん,ちょ,つう,かい,1 -999,6年生の漢字[暖]の読みは?,だん,ちょう,てん,なん,1 -1000,6年生の漢字[値]の読みは?,ち,ちょう,とう,にゅう,1 -1001,6年生の漢字[宙]の読みは?,ちゅう,しお,とう,にん,1 -1002,6年生の漢字[忠]の読みは?,ちゅう,ちん,とう,のう,1 -1003,6年生の漢字[著]の読みは?,ちょ,つう,かい,のう,1 -1004,6年生の漢字[庁]の読みは?,ちょう,てん,なん,は,1 -1005,6年生の漢字[頂]の読みは?,ちょう,とう,にゅう,はい,1 -1006,6年生の漢字[潮]の読みは?,しお,とう,にん,はい,1 -1007,6年生の漢字[賃]の読みは?,ちん,とう,のう,はい,1 -1008,6年生の漢字[痛]の読みは?,つう,かい,のう,はい,1 -1009,6年生の漢字[展]の読みは?,てん,なん,は,はん,1 -1010,6年生の漢字[討]の読みは?,とう,にゅう,はい,ばん,1 -1011,6年生の漢字[党]の読みは?,とう,にん,はい,いな,1 -1012,6年生の漢字[糖]の読みは?,とう,のう,はい,ひ,1 -1013,6年生の漢字[届]の読みは?,かい,のう,はい,ひ,1 -1014,6年生の漢字[難]の読みは?,なん,は,はん,ふく,1 -1015,6年生の漢字[乳]の読みは?,にゅう,はい,ばん,ふん,1 -1016,6年生の漢字[認]の読みは?,にん,はい,いな,なみ,1 -1017,6年生の漢字[納]の読みは?,のう,はい,ひ,へい,1 -1018,6年生の漢字[脳]の読みは?,のう,はい,ひ,へい,1 -1019,6年生の漢字[派]の読みは?,は,はん,ふく,へん,1 -1020,6年生の漢字[拝]の読みは?,はい,ばん,ふん,ほ,1 -1021,6年生の漢字[背]の読みは?,はい,いな,なみ,ぼ,1 -1022,6年生の漢字[肺]の読みは?,はい,ひ,へい,ほう,1 -1023,6年生の漢字[俳]の読みは?,はい,ひ,へい,ほう,1 -1024,6年生の漢字[班]の読みは?,はん,ふく,へん,ぼう,1 -1025,6年生の漢字[晩]の読みは?,ばん,ふん,ほ,ぼう,1 -1026,6年生の漢字[否]の読みは?,いな,なみ,ぼ,ぼう,1 -1027,6年生の漢字[批]の読みは?,ひ,へい,ほう,まい,1 -1028,6年生の漢字[秘]の読みは?,ひ,へい,ほう,まく,1 -1029,6年生の漢字[腹]の読みは?,ふく,へん,ぼう,みつ,1 -1030,6年生の漢字[奮]の読みは?,ふん,はい,にゅう,とう,1 -1031,6年生の漢字[並]の読みは?,なみ,はい,にん,とう,1 -1032,6年生の漢字[陛]の読みは?,へい,はい,のう,とう,1 -1033,6年生の漢字[閉]の読みは?,へい,はい,のう,かい,1 -1034,6年生の漢字[片]の読みは?,へん,はん,は,なん,1 -1035,6年生の漢字[補]の読みは?,ほ,ばん,はい,にゅう,1 -1036,6年生の漢字[暮]の読みは?,ぼ,いな,はい,にん,1 -1037,6年生の漢字[宝]の読みは?,ほう,ひ,はい,のう,1 -1038,6年生の漢字[訪]の読みは?,ほう,ひ,はい,のう,1 -1039,6年生の漢字[亡]の読みは?,ぼう,ふく,はん,は,1 -1040,6年生の漢字[忘]の読みは?,ぼう,ふん,ばん,はい,1 -1041,6年生の漢字[棒]の読みは?,ぼう,なみ,いな,はい,1 -1042,6年生の漢字[枚]の読みは?,まい,へい,ひ,はい,1 -1043,6年生の漢字[幕]の読みは?,まく,へい,ひ,はい,1 -1044,6年生の漢字[密]の読みは?,みつ,へん,ふく,はん,1 -1045,6年生の漢字[盟]の読みは?,めい,ほ,ふん,ばん,1 -1046,6年生の漢字[模]の読みは?,も,ぼ,なみ,いな,1 -1047,6年生の漢字[訳]の読みは?,やく,ほう,へい,ひ,1 -1048,6年生の漢字[郵]の読みは?,ゆう,ほう,へい,ひ,1 -1049,6年生の漢字[優]の読みは?,ゆう,ぼう,へん,ふく,1 -1050,6年生の漢字[幼]の読みは?,よう,ぼう,ほ,ふん,1 -1051,6年生の漢字[欲]の読みは?,よく,ぼう,ぼ,なみ,1 -1052,6年生の漢字[翌]の読みは?,よく,まい,ほう,へい,1 -1053,6年生の漢字[乱]の読みは?,らん,まく,ほう,へい,1 -1054,6年生の漢字[卵]の読みは?,らん,みつ,ぼう,へん,1 -1055,6年生の漢字[覧]の読みは?,らん,めい,ぼう,ほ,1 -1056,6年生の漢字[裏]の読みは?,うら,も,ぼう,ぼ,1 -1057,6年生の漢字[律]の読みは?,りつ,やく,まい,ほう,1 -1058,6年生の漢字[臨]の読みは?,りん,ゆう,まく,ほう,1 -1059,6年生の漢字[朗]の読みは?,ろう,ゆう,みつ,ぼう,1 -1060,6年生の漢字[論]の読みは?,ろん,よう,めい,ぼう,1 -1061,1年生の漢字で[こ]と読むのは?,子,王,気,空,1 -1062,1年生の漢字で[いち]と読むのは?,一,音,九,月,1 -1063,1年生の漢字で[みぎ]と読むのは?,右,下,休,犬,1 -1064,1年生の漢字で[あめ]と読むのは?,雨,花,玉,見,1 -1065,1年生の漢字で[えん]と読むのは?,円,学,金,五,1 -1066,1年生の漢字で[おう]と読むのは?,王,気,空,口,1 -1067,1年生の漢字で[おと]と読むのは?,音,九,月,校,1 -1068,1年生の漢字で[した]と読むのは?,下,休,犬,左,1 -1069,1年生の漢字で[はな]と読むのは?,花,玉,見,三,1 -1070,1年生の漢字で[がく]と読むのは?,学,金,五,山,1 -1071,1年生の漢字で[き]と読むのは?,気,空,口,四,1 -1072,1年生の漢字で[きゅう]と読むのは?,九,月,校,糸,1 -1073,1年生の漢字で[きゅう]と読むのは?,休,犬,左,字,1 -1074,1年生の漢字で[たま]と読むのは?,玉,見,三,耳,1 -1075,1年生の漢字で[きん]と読むのは?,金,五,山,七,1 -1076,1年生の漢字で[そら]と読むのは?,空,口,四,車,1 -1077,1年生の漢字で[つき]と読むのは?,月,校,糸,手,1 -1078,1年生の漢字で[いぬ]と読むのは?,犬,左,字,十,1 -1079,1年生の漢字で[けん]と読むのは?,見,三,耳,出,1 -1080,1年生の漢字で[ご]と読むのは?,五,山,七,女,1 -1081,1年生の漢字で[くち]と読むのは?,口,四,車,小,1 -1082,1年生の漢字で[こう]と読むのは?,校,糸,手,上,1 -1083,1年生の漢字で[ひだり]と読むのは?,左,字,十,森,1 -1084,1年生の漢字で[さん]と読むのは?,三,耳,出,人,1 -1085,1年生の漢字で[やま]と読むのは?,山,七,女,水,1 -1086,1年生の漢字で[よん]と読むのは?,四,車,小,正,1 -1087,1年生の漢字で[いと]と読むのは?,糸,手,上,生,1 -1088,1年生の漢字で[じ]と読むのは?,字,十,森,青,1 -1089,1年生の漢字で[みみ]と読むのは?,耳,出,人,夕,1 -1090,1年生の漢字で[なな]と読むのは?,七,女,水,石,1 -1091,1年生の漢字で[くるま]と読むのは?,車,小,正,赤,1 -1092,1年生の漢字で[て]と読むのは?,手,上,生,千,1 -1093,1年生の漢字で[じゅう]と読むのは?,十,森,青,川,1 -1094,1年生の漢字で[しゅつ]と読むのは?,出,人,夕,先,1 -1095,1年生の漢字で[おんな]と読むのは?,女,水,石,早,1 -1096,1年生の漢字で[しょう]と読むのは?,小,正,赤,草,1 -1097,1年生の漢字で[うえ]と読むのは?,上,生,千,足,1 -1098,1年生の漢字で[もり]と読むのは?,森,青,川,村,1 -1099,1年生の漢字で[ひと]と読むのは?,人,夕,先,大,1 -1100,1年生の漢字で[みず]と読むのは?,水,石,早,男,1 -1101,1年生の漢字で[しょう]と読むのは?,正,赤,草,竹,1 -1102,1年生の漢字で[しょう]と読むのは?,生,千,足,中,1 -1103,1年生の漢字で[あお]と読むのは?,青,川,村,虫,1 -1104,1年生の漢字で[ゆう]と読むのは?,夕,先,大,町,1 -1105,1年生の漢字で[いし]と読むのは?,石,早,男,天,1 -1106,1年生の漢字で[あか]と読むのは?,赤,草,竹,田,1 -1107,1年生の漢字で[せん]と読むのは?,千,足,中,土,1 -1108,1年生の漢字で[かわ]と読むのは?,川,村,虫,二,1 -1109,1年生の漢字で[さき]と読むのは?,先,大,町,日,1 -1110,1年生の漢字で[そう]と読むのは?,早,男,天,入,1 -1111,1年生の漢字で[そう]と読むのは?,草,竹,田,年,1 -1112,1年生の漢字で[あし]と読むのは?,足,中,土,白,1 -1113,1年生の漢字で[むら]と読むのは?,村,虫,二,八,1 -1114,1年生の漢字で[だい]と読むのは?,大,町,日,百,1 -1115,1年生の漢字で[おとこ]と読むのは?,男,天,入,文,1 -1116,1年生の漢字で[たけ]と読むのは?,竹,田,年,木,1 -1117,1年生の漢字で[ちゅう]と読むのは?,中,土,白,本,1 -1118,1年生の漢字で[むし]と読むのは?,虫,二,八,名,1 -1119,1年生の漢字で[まち]と読むのは?,町,日,百,目,1 -1120,1年生の漢字で[てん]と読むのは?,天,入,文,立,1 -1121,1年生の漢字で[た]と読むのは?,田,年,木,力,1 -1122,1年生の漢字で[つち]と読むのは?,土,白,本,林,1 -1123,1年生の漢字で[に]と読むのは?,二,八,名,六,1 -1124,1年生の漢字で[にち]と読むのは?,日,百,目,引,1 -1125,1年生の漢字で[にゅう]と読むのは?,入,文,立,羽,1 -1126,1年生の漢字で[とし]と読むのは?,年,木,力,雲,1 -1127,1年生の漢字で[しろ]と読むのは?,白,本,林,園,1 -1128,1年生の漢字で[はち]と読むのは?,八,名,六,遠,1 -1129,1年生の漢字で[ひゃく]と読むのは?,百,目,引,何,1 -1130,1年生の漢字で[ぶん]と読むのは?,文,立,羽,科,1 -1131,1年生の漢字で[き]と読むのは?,木,力,雲,夏,1 -1132,1年生の漢字で[ほん]と読むのは?,本,林,園,家,1 -1133,1年生の漢字で[めい]と読むのは?,名,六,遠,歌,1 -1134,1年生の漢字で[め]と読むのは?,目,引,何,画,1 -1135,1年生の漢字で[りつ]と読むのは?,立,羽,科,回,1 -1136,1年生の漢字で[ちから]と読むのは?,力,雲,夏,会,1 -1137,1年生の漢字で[はやし]と読むのは?,林,園,家,海,1 -1138,1年生の漢字で[ろく]と読むのは?,六,遠,歌,絵,1 -1139,2年生の漢字で[いん]と読むのは?,引,何,画,外,1 -1140,2年生の漢字で[はね]と読むのは?,羽,科,回,角,1 -1141,2年生の漢字で[くも]と読むのは?,雲,夏,会,楽,1 -1142,2年生の漢字で[えん]と読むのは?,園,家,海,活,1 -1143,2年生の漢字で[えん]と読むのは?,遠,歌,絵,間,1 -1144,2年生の漢字で[なに]と読むのは?,何,画,外,岩,1 -1145,2年生の漢字で[か]と読むのは?,科,回,角,顔,1 -1146,2年生の漢字で[なつ]と読むのは?,夏,会,楽,汽,1 -1147,2年生の漢字で[いえ]と読むのは?,家,海,活,記,1 -1148,2年生の漢字で[うた]と読むのは?,歌,絵,間,帰,1 -1149,2年生の漢字で[が]と読むのは?,画,外,岩,弓,1 -1150,2年生の漢字で[かい]と読むのは?,回,角,顔,牛,1 -1151,2年生の漢字で[かい]と読むのは?,会,楽,汽,魚,1 -1152,2年生の漢字で[うみ]と読むのは?,海,活,記,京,1 -1153,2年生の漢字で[え]と読むのは?,絵,間,帰,強,1 -1154,2年生の漢字で[そと]と読むのは?,外,岩,弓,教,1 -1155,2年生の漢字で[かく]と読むのは?,角,顔,牛,近,1 -1156,2年生の漢字で[らく]と読むのは?,楽,汽,魚,兄,1 -1157,2年生の漢字で[かつ]と読むのは?,活,記,京,形,1 -1158,2年生の漢字で[あいだ]と読むのは?,間,帰,強,計,1 -1159,2年生の漢字で[いわ]と読むのは?,岩,弓,教,元,1 -1160,2年生の漢字で[かお]と読むのは?,顔,牛,近,言,1 -1161,2年生の漢字で[き]と読むのは?,汽,魚,兄,原,1 -1162,2年生の漢字で[き]と読むのは?,記,京,形,戸,1 -1163,2年生の漢字で[き]と読むのは?,帰,強,計,古,1 -1164,2年生の漢字で[ゆみ]と読むのは?,弓,教,元,牛,1 -1165,2年生の漢字で[うし]と読むのは?,牛,近,言,後,1 -1166,2年生の漢字で[さかな]と読むのは?,魚,兄,原,語,1 -1167,2年生の漢字で[けい]と読むのは?,京,形,戸,工,1 -1168,2年生の漢字で[きょう]と読むのは?,強,計,古,公,1 -1169,2年生の漢字で[きょう]と読むのは?,教,元,牛,広,1 -1170,2年生の漢字で[きん]と読むのは?,近,言,後,交,1 -1171,2年生の漢字で[あに]と読むのは?,兄,原,語,光,1 -1172,2年生の漢字で[かたち]と読むのは?,形,戸,工,考,1 -1173,2年生の漢字で[けい]と読むのは?,計,古,公,行,1 -1174,2年生の漢字で[もと]と読むのは?,元,牛,広,高,1 -1175,2年生の漢字で[げん]と読むのは?,言,後,交,黄,1 -1176,2年生の漢字で[げん]と読むのは?,原,語,光,合,1 -1177,2年生の漢字で[と]と読むのは?,戸,工,考,谷,1 -1178,2年生の漢字で[こ]と読むのは?,古,公,行,国,1 -1179,2年生の漢字で[うし]と読むのは?,牛,広,高,黒,1 -1180,2年生の漢字で[あと]と読むのは?,後,交,黄,今,1 -1181,2年生の漢字で[ご]と読むのは?,語,光,合,才,1 -1182,2年生の漢字で[こう]と読むのは?,工,考,谷,細,1 -1183,2年生の漢字で[こう]と読むのは?,公,行,国,作,1 -1184,2年生の漢字で[こう]と読むのは?,広,高,黒,算,1 -1185,2年生の漢字で[こう]と読むのは?,交,黄,今,止,1 -1186,2年生の漢字で[ひかり]と読むのは?,光,合,才,市,1 -1187,2年生の漢字で[こう]と読むのは?,考,谷,細,矢,1 -1188,2年生の漢字で[ぎょう]と読むのは?,行,国,作,姉,1 -1189,2年生の漢字で[こう]と読むのは?,高,黒,算,思,1 -1190,2年生の漢字で[き]と読むのは?,黄,今,止,紙,1 -1191,2年生の漢字で[ごう]と読むのは?,合,才,市,寺,1 -1192,2年生の漢字で[たに]と読むのは?,谷,細,矢,自,1 -1193,2年生の漢字で[くに]と読むのは?,国,作,姉,時,1 -1194,2年生の漢字で[くろ]と読むのは?,黒,算,思,室,1 -1195,2年生の漢字で[いま]と読むのは?,今,止,紙,社,1 -1196,2年生の漢字で[さい]と読むのは?,才,市,寺,弱,1 -1197,2年生の漢字で[さい]と読むのは?,細,矢,自,首,1 -1198,2年生の漢字で[さく]と読むのは?,作,姉,時,秋,1 -1199,2年生の漢字で[さん]と読むのは?,算,思,室,週,1 -1200,2年生の漢字で[し]と読むのは?,止,紙,社,春,1 -1201,2年生の漢字で[し]と読むのは?,市,寺,弱,書,1 -1202,2年生の漢字で[や]と読むのは?,矢,自,首,少,1 -1203,2年生の漢字で[あね]と読むのは?,姉,時,秋,場,1 -1204,2年生の漢字で[し]と読むのは?,思,室,週,色,1 -1205,2年生の漢字で[かみ]と読むのは?,紙,社,春,心,1 -1206,2年生の漢字で[てら]と読むのは?,寺,弱,書,食,1 -1207,2年生の漢字で[じ]と読むのは?,自,首,少,新,1 -1208,2年生の漢字で[じ]と読むのは?,時,秋,場,親,1 -1209,2年生の漢字で[しつ]と読むのは?,室,週,色,図,1 -1210,2年生の漢字で[しゃ]と読むのは?,社,春,心,数,1 -1211,2年生の漢字で[じゃく]と読むのは?,弱,書,食,西,1 -1212,2年生の漢字で[くび]と読むのは?,首,少,新,声,1 -1213,2年生の漢字で[あき]と読むのは?,秋,場,親,星,1 -1214,2年生の漢字で[しゅう]と読むのは?,週,色,図,晴,1 -1215,2年生の漢字で[はる]と読むのは?,春,心,数,切,1 -1216,2年生の漢字で[しょ]と読むのは?,書,食,西,雪,1 -1217,2年生の漢字で[しょう]と読むのは?,少,新,声,船,1 -1218,2年生の漢字で[ば]と読むのは?,場,親,星,線,1 -1219,2年生の漢字で[いろ]と読むのは?,色,図,晴,前,1 -1220,2年生の漢字で[こころ]と読むのは?,心,数,切,組,1 -1221,2年生の漢字で[しょく]と読むのは?,食,西,雪,走,1 -1222,2年生の漢字で[しん]と読むのは?,新,声,船,多,1 -1223,2年生の漢字で[おや]と読むのは?,親,星,線,太,1 -1224,2年生の漢字で[ず]と読むのは?,図,晴,前,体,1 -1225,2年生の漢字で[かず]と読むのは?,数,切,組,台,1 -1226,2年生の漢字で[にし]と読むのは?,西,雪,走,地,1 -1227,2年生の漢字で[こえ]と読むのは?,声,船,多,池,1 -1228,2年生の漢字で[ほし]と読むのは?,星,線,太,知,1 -1229,2年生の漢字で[はれ]と読むのは?,晴,前,体,茶,1 -1230,2年生の漢字で[せつ]と読むのは?,切,組,台,昼,1 -1231,2年生の漢字で[ゆき]と読むのは?,雪,走,地,長,1 -1232,2年生の漢字で[ふね]と読むのは?,船,多,池,鳥,1 -1233,2年生の漢字で[せん]と読むのは?,線,太,知,朝,1 -1234,2年生の漢字で[まえ]と読むのは?,前,体,茶,直,1 -1235,2年生の漢字で[くみ]と読むのは?,組,台,昼,通,1 -1236,2年生の漢字で[そう]と読むのは?,走,地,長,弟,1 -1237,2年生の漢字で[た]と読むのは?,多,池,鳥,店,1 -1238,2年生の漢字で[た]と読むのは?,太,知,朝,点,1 -1239,2年生の漢字で[たい]と読むのは?,体,茶,直,電,1 -1240,2年生の漢字で[だい]と読むのは?,台,昼,通,刀,1 -1241,2年生の漢字で[ち]と読むのは?,地,長,弟,冬,1 -1242,2年生の漢字で[いけ]と読むのは?,池,鳥,店,当,1 -1243,2年生の漢字で[ち]と読むのは?,知,朝,点,東,1 -1244,2年生の漢字で[ちゃ]と読むのは?,茶,直,電,答,1 -1245,2年生の漢字で[ひる]と読むのは?,昼,通,刀,頭,1 -1246,2年生の漢字で[ちょう]と読むのは?,長,弟,冬,同,1 -1247,2年生の漢字で[とり]と読むのは?,鳥,店,当,道,1 -1248,2年生の漢字で[あさ]と読むのは?,朝,点,東,読,1 -1249,2年生の漢字で[ちょく]と読むのは?,直,電,答,内,1 -1250,2年生の漢字で[つう]と読むのは?,通,刀,頭,南,1 -1251,2年生の漢字で[おとうと]と読むのは?,弟,冬,同,肉,1 -1252,2年生の漢字で[みせ]と読むのは?,店,当,道,馬,1 -1253,2年生の漢字で[てん]と読むのは?,点,東,読,売,1 -1254,2年生の漢字で[でん]と読むのは?,電,答,内,買,1 -1255,2年生の漢字で[かたな]と読むのは?,刀,頭,南,麦,1 -1256,2年生の漢字で[ふゆ]と読むのは?,冬,同,肉,半,1 -1257,2年生の漢字で[とう]と読むのは?,当,道,馬,番,1 -1258,2年生の漢字で[ひがし]と読むのは?,東,読,売,父,1 -1259,2年生の漢字で[とう]と読むのは?,答,内,買,風,1 -1260,2年生の漢字で[あたま]と読むのは?,頭,南,麦,分,1 -1261,2年生の漢字で[どう]と読むのは?,同,肉,半,聞,1 -1262,2年生の漢字で[みち]と読むのは?,道,馬,番,米,1 -1263,2年生の漢字で[どく]と読むのは?,読,売,父,歩,1 -1264,2年生の漢字で[うち]と読むのは?,内,買,風,母,1 -1265,2年生の漢字で[みなみ]と読むのは?,南,麦,分,方,1 -1266,2年生の漢字で[にく]と読むのは?,肉,半,聞,北,1 -1267,2年生の漢字で[うま]と読むのは?,馬,番,米,毎,1 -1268,2年生の漢字で[ばい]と読むのは?,売,父,歩,妹,1 -1269,2年生の漢字で[ばい]と読むのは?,買,風,母,万,1 -1270,2年生の漢字で[むぎ]と読むのは?,麦,分,方,明,1 -1271,2年生の漢字で[はん]と読むのは?,半,聞,北,鳴,1 -1272,2年生の漢字で[ばん]と読むのは?,番,米,毎,毛,1 -1273,2年生の漢字で[ちち]と読むのは?,父,歩,妹,門,1 -1274,2年生の漢字で[かぜ]と読むのは?,風,母,万,夜,1 -1275,2年生の漢字で[ぶん]と読むのは?,分,方,明,野,1 -1276,2年生の漢字で[ぶん]と読むのは?,聞,北,鳴,友,1 -1277,2年生の漢字で[こめ]と読むのは?,米,毎,毛,用,1 -1278,2年生の漢字で[ほ]と読むのは?,歩,妹,門,曜,1 -1279,2年生の漢字で[はは]と読むのは?,母,万,夜,来,1 -1280,2年生の漢字で[ほう]と読むのは?,方,明,野,里,1 -1281,2年生の漢字で[きた]と読むのは?,北,鳴,友,理,1 -1282,2年生の漢字で[ごと]と読むのは?,毎,毛,用,話,1 -1283,2年生の漢字で[いもうと]と読むのは?,妹,門,曜,悪,1 -1284,2年生の漢字で[まん]と読むのは?,万,夜,来,安,1 -1285,2年生の漢字で[みょう]と読むのは?,明,野,里,暗,1 -1286,2年生の漢字で[なる]と読むのは?,鳴,友,理,医,1 -1287,2年生の漢字で[け]と読むのは?,毛,用,話,委,1 -1288,2年生の漢字で[もん]と読むのは?,門,曜,悪,意,1 -1289,2年生の漢字で[よる]と読むのは?,夜,来,安,育,1 -1290,2年生の漢字で[の]と読むのは?,野,里,暗,員,1 -1291,2年生の漢字で[とも]と読むのは?,友,理,医,院,1 -1292,2年生の漢字で[よう]と読むのは?,用,話,委,飲,1 -1293,2年生の漢字で[よう]と読むのは?,曜,悪,意,運,1 -1294,2年生の漢字で[らい]と読むのは?,来,安,育,泳,1 -1295,2年生の漢字で[さと]と読むのは?,里,暗,員,駅,1 -1296,2年生の漢字で[ことわり]と読むのは?,理,医,院,央,1 -1297,2年生の漢字で[はなし]と読むのは?,話,委,飲,横,1 -1298,3年生の漢字で[あく]と読むのは?,悪,意,運,屋,1 -1299,3年生の漢字で[あん]と読むのは?,安,育,泳,温,1 -1300,3年生の漢字で[あん]と読むのは?,暗,員,駅,化,1 -1301,3年生の漢字で[い]と読むのは?,医,院,央,荷,1 -1302,3年生の漢字で[い]と読むのは?,委,飲,横,界,1 -1303,3年生の漢字で[い]と読むのは?,意,運,屋,開,1 -1304,3年生の漢字で[いく]と読むのは?,育,泳,温,階,1 -1305,3年生の漢字で[いん]と読むのは?,員,駅,化,寒,1 -1306,3年生の漢字で[いん]と読むのは?,院,央,荷,感,1 -1307,3年生の漢字で[いん]と読むのは?,飲,横,界,漢,1 -1308,3年生の漢字で[うん]と読むのは?,運,屋,開,館,1 -1309,3年生の漢字で[えい]と読むのは?,泳,温,階,岸,1 -1310,3年生の漢字で[えき]と読むのは?,駅,化,寒,起,1 -1311,3年生の漢字で[おう]と読むのは?,央,荷,感,期,1 -1312,3年生の漢字で[よこ]と読むのは?,横,界,漢,客,1 -1313,3年生の漢字で[おく]と読むのは?,屋,開,館,究,1 -1314,3年生の漢字で[おん]と読むのは?,温,階,岸,急,1 -1315,3年生の漢字で[か]と読むのは?,化,寒,起,級,1 -1316,3年生の漢字で[に]と読むのは?,荷,感,期,宮,1 -1317,3年生の漢字で[かい]と読むのは?,界,漢,客,球,1 -1318,3年生の漢字で[かい]と読むのは?,開,館,究,去,1 -1319,3年生の漢字で[かい]と読むのは?,階,岸,急,橋,1 -1320,3年生の漢字で[かん]と読むのは?,寒,起,級,業,1 -1321,3年生の漢字で[かん]と読むのは?,感,期,宮,曲,1 -1322,3年生の漢字で[かん]と読むのは?,漢,客,球,局,1 -1323,3年生の漢字で[やかた]と読むのは?,館,究,去,銀,1 -1324,3年生の漢字で[きし]と読むのは?,岸,急,橋,区,1 -1325,3年生の漢字で[き]と読むのは?,起,級,業,苦,1 -1326,3年生の漢字で[き]と読むのは?,期,宮,曲,具,1 -1327,3年生の漢字で[きゃく]と読むのは?,客,球,局,君,1 -1328,3年生の漢字で[きゅう]と読むのは?,究,去,銀,係,1 -1329,3年生の漢字で[きゅう]と読むのは?,急,橋,区,軽,1 -1330,3年生の漢字で[きゅう]と読むのは?,級,業,苦,血,1 -1331,3年生の漢字で[みや]と読むのは?,宮,曲,具,決,1 -1332,3年生の漢字で[たま]と読むのは?,球,局,君,研,1 -1333,3年生の漢字で[きょ]と読むのは?,去,銀,係,県,1 -1334,3年生の漢字で[はし]と読むのは?,橋,区,軽,庫,1 -1335,3年生の漢字で[わざ]と読むのは?,業,苦,血,湖,1 -1336,3年生の漢字で[きょく]と読むのは?,曲,具,決,向,1 -1337,3年生の漢字で[きょく]と読むのは?,局,君,研,幸,1 -1338,3年生の漢字で[ぎん]と読むのは?,銀,係,県,港,1 -1339,3年生の漢字で[く]と読むのは?,区,軽,庫,号,1 -1340,3年生の漢字で[く]と読むのは?,苦,血,湖,根,1 -1341,3年生の漢字で[ぐ]と読むのは?,具,決,向,祭,1 -1342,3年生の漢字で[きみ]と読むのは?,君,研,幸,皿,1 -1343,3年生の漢字で[かかり]と読むのは?,係,県,港,仕,1 -1344,3年生の漢字で[けい]と読むのは?,軽,庫,号,死,1 -1345,3年生の漢字で[ち]と読むのは?,血,湖,根,使,1 -1346,3年生の漢字で[けつ]と読むのは?,決,向,祭,始,1 -1347,3年生の漢字で[けん]と読むのは?,研,幸,皿,指,1 -1348,3年生の漢字で[けん]と読むのは?,県,港,仕,歯,1 -1349,3年生の漢字で[こ]と読むのは?,庫,号,死,詩,1 -1350,3年生の漢字で[みずうみ]と読むのは?,湖,根,使,次,1 -1351,3年生の漢字で[むこう]と読むのは?,向,祭,始,事,1 -1352,3年生の漢字で[さち]と読むのは?,幸,皿,指,持,1 -1353,3年生の漢字で[みなと]と読むのは?,港,仕,歯,式,1 -1354,3年生の漢字で[ごう]と読むのは?,号,死,詩,実,1 -1355,3年生の漢字で[ね]と読むのは?,根,使,次,写,1 -1356,3年生の漢字で[まつり]と読むのは?,祭,始,事,者,1 -1357,3年生の漢字で[さら]と読むのは?,皿,指,持,主,1 -1358,3年生の漢字で[し]と読むのは?,仕,歯,式,守,1 -1359,3年生の漢字で[し]と読むのは?,死,詩,実,取,1 -1360,3年生の漢字で[し]と読むのは?,使,次,写,酒,1 -1361,3年生の漢字で[し]と読むのは?,始,事,者,受,1 -1362,3年生の漢字で[ゆび]と読むのは?,指,持,主,州,1 -1363,3年生の漢字で[は]と読むのは?,歯,式,守,拾,1 -1364,3年生の漢字で[し]と読むのは?,詩,実,取,終,1 -1365,3年生の漢字で[つぎ]と読むのは?,次,写,酒,習,1 -1366,3年生の漢字で[こと]と読むのは?,事,者,受,集,1 -1367,3年生の漢字で[じ]と読むのは?,持,主,州,住,1 -1368,3年生の漢字で[しき]と読むのは?,式,守,拾,重,1 -1369,3年生の漢字で[じつ]と読むのは?,実,取,終,宿,1 -1370,3年生の漢字で[しゃ]と読むのは?,写,酒,習,所,1 -1371,3年生の漢字で[しゃ]と読むのは?,者,受,集,暑,1 -1372,3年生の漢字で[しゅ]と読むのは?,主,州,住,助,1 -1373,3年生の漢字で[しゅ]と読むのは?,守,拾,重,昭,1 -1374,3年生の漢字で[しゅ]と読むのは?,取,終,宿,消,1 -1375,3年生の漢字で[しゅ]と読むのは?,酒,習,所,商,1 -1376,3年生の漢字で[じゅ]と読むのは?,受,集,暑,章,1 -1377,3年生の漢字で[しゅう]と読むのは?,州,住,助,勝,1 -1378,3年生の漢字で[しゅう]と読むのは?,拾,重,昭,乗,1 -1379,3年生の漢字で[しゅう]と読むのは?,終,宿,消,植,1 -1380,3年生の漢字で[しゅう]と読むのは?,習,所,商,申,1 -1381,3年生の漢字で[しゅう]と読むのは?,集,暑,章,身,1 -1382,3年生の漢字で[じゅう]と読むのは?,住,助,勝,神,1 -1383,3年生の漢字で[じゅう]と読むのは?,重,昭,乗,真,1 -1384,3年生の漢字で[やど]と読むのは?,宿,消,植,深,1 -1385,3年生の漢字で[ところ]と読むのは?,所,商,申,進,1 -1386,3年生の漢字で[しょ]と読むのは?,暑,章,身,世,1 -1387,3年生の漢字で[じょ]と読むのは?,助,勝,神,整,1 -1388,3年生の漢字で[しょう]と読むのは?,昭,乗,真,昔,1 -1389,3年生の漢字で[しょう]と読むのは?,消,植,深,全,1 -1390,3年生の漢字で[あきない]と読むのは?,商,申,進,相,1 -1391,3年生の漢字で[しょう]と読むのは?,章,身,世,送,1 -1392,3年生の漢字で[しょう]と読むのは?,勝,神,整,想,1 -1393,3年生の漢字で[じょう]と読むのは?,乗,真,昔,息,1 -1394,3年生の漢字で[しょく]と読むのは?,植,深,全,速,1 -1395,3年生の漢字で[しん]と読むのは?,申,進,相,族,1 -1396,3年生の漢字で[しん]と読むのは?,身,世,送,他,1 -1397,3年生の漢字で[かみ]と読むのは?,神,整,想,打,1 -1398,3年生の漢字で[しん]と読むのは?,真,昔,息,対,1 -1399,3年生の漢字で[しん]と読むのは?,深,全,速,待,1 -1400,3年生の漢字で[しん]と読むのは?,進,相,族,代,1 -1401,3年生の漢字で[よ]と読むのは?,世,送,他,第,1 -1402,3年生の漢字で[せい]と読むのは?,整,想,打,題,1 -1403,3年生の漢字で[むかし]と読むのは?,昔,息,対,炭,1 -1404,3年生の漢字で[ぜん]と読むのは?,全,速,待,短,1 -1405,3年生の漢字で[そう]と読むのは?,相,族,代,談,1 -1406,3年生の漢字で[そう]と読むのは?,送,他,第,着,1 -1407,3年生の漢字で[そう]と読むのは?,想,打,題,注,1 -1408,3年生の漢字で[いき]と読むのは?,息,対,炭,柱,1 -1409,3年生の漢字で[そく]と読むのは?,速,待,短,丁,1 -1410,3年生の漢字で[ぞく]と読むのは?,族,代,談,帳,1 -1411,3年生の漢字で[た]と読むのは?,他,第,着,調,1 -1412,3年生の漢字で[だ]と読むのは?,打,題,注,追,1 -1413,3年生の漢字で[たい]と読むのは?,対,炭,柱,定,1 -1414,3年生の漢字で[たい]と読むのは?,待,短,丁,庭,1 -1415,3年生の漢字で[だい]と読むのは?,代,談,帳,笛,1 -1416,3年生の漢字で[だい]と読むのは?,第,着,調,鉄,1 -1417,3年生の漢字で[だい]と読むのは?,題,注,追,転,1 -1418,3年生の漢字で[たん]と読むのは?,炭,柱,定,都,1 -1419,3年生の漢字で[たん]と読むのは?,短,丁,庭,度,1 -1420,3年生の漢字で[だん]と読むのは?,談,帳,笛,投,1 -1421,3年生の漢字で[ちゃく]と読むのは?,着,調,鉄,豆,1 -1422,3年生の漢字で[ちゅう]と読むのは?,注,追,転,島,1 -1423,3年生の漢字で[はしら]と読むのは?,柱,定,都,湯,1 -1424,3年生の漢字で[ちょう]と読むのは?,丁,庭,度,登,1 -1425,3年生の漢字で[ちょう]と読むのは?,帳,笛,投,等,1 -1426,3年生の漢字で[ちょう]と読むのは?,調,鉄,豆,動,1 -1427,3年生の漢字で[つい]と読むのは?,追,転,島,童,1 -1428,3年生の漢字で[じょう]と読むのは?,定,都,湯,農,1 -1429,3年生の漢字で[にわ]と読むのは?,庭,度,登,波,1 -1430,3年生の漢字で[ふえ]と読むのは?,笛,投,等,配,1 -1431,3年生の漢字で[てつ]と読むのは?,鉄,豆,動,倍,1 -1432,3年生の漢字で[てん]と読むのは?,転,島,童,箱,1 -1433,3年生の漢字で[みやこ]と読むのは?,都,湯,農,畑,1 -1434,3年生の漢字で[たび]と読むのは?,度,登,波,発,1 -1435,3年生の漢字で[とう]と読むのは?,投,等,配,反,1 -1436,3年生の漢字で[まめ]と読むのは?,豆,動,倍,坂,1 -1437,3年生の漢字で[しま]と読むのは?,島,童,箱,板,1 -1438,3年生の漢字で[ゆ]と読むのは?,湯,農,畑,皮,1 -1439,3年生の漢字で[とう]と読むのは?,登,波,発,悲,1 -1440,3年生の漢字で[とう]と読むのは?,等,配,反,美,1 -1441,3年生の漢字で[どう]と読むのは?,動,倍,坂,鼻,1 -1442,3年生の漢字で[どう]と読むのは?,童,箱,板,筆,1 -1443,3年生の漢字で[のう]と読むのは?,農,畑,皮,氷,1 -1444,3年生の漢字で[なみ]と読むのは?,波,発,悲,表,1 -1445,3年生の漢字で[はい]と読むのは?,配,反,美,秒,1 -1446,3年生の漢字で[ばい]と読むのは?,倍,坂,鼻,病,1 -1447,3年生の漢字で[はこ]と読むのは?,箱,板,筆,品,1 -1448,3年生の漢字で[はたけ]と読むのは?,畑,皮,氷,負,1 -1449,3年生の漢字で[はつ]と読むのは?,発,悲,表,部,1 -1450,3年生の漢字で[はん]と読むのは?,反,美,秒,服,1 -1451,3年生の漢字で[さか]と読むのは?,坂,鼻,病,福,1 -1452,3年生の漢字で[いた]と読むのは?,板,筆,品,物,1 -1453,3年生の漢字で[かわ]と読むのは?,皮,氷,負,平,1 -1454,3年生の漢字で[ひ]と読むのは?,悲,表,部,返,1 -1455,3年生の漢字で[び]と読むのは?,美,秒,服,勉,1 -1456,3年生の漢字で[はな]と読むのは?,鼻,病,福,放,1 -1457,3年生の漢字で[ふで]と読むのは?,筆,品,物,味,1 -1458,3年生の漢字で[こおり]と読むのは?,氷,負,平,命,1 -1459,3年生の漢字で[おもて]と読むのは?,表,部,返,面,1 -1460,3年生の漢字で[びょう]と読むのは?,秒,服,勉,問,1 -1461,3年生の漢字で[やまい]と読むのは?,病,福,放,役,1 -1462,3年生の漢字で[しな]と読むのは?,品,物,味,薬,1 -1463,3年生の漢字で[ふ]と読むのは?,負,平,命,由,1 -1464,3年生の漢字で[ぶ]と読むのは?,部,返,面,油,1 -1465,3年生の漢字で[ふく]と読むのは?,服,勉,問,有,1 -1466,3年生の漢字で[ふく]と読むのは?,福,放,役,遊,1 -1467,3年生の漢字で[ぶつ]と読むのは?,物,味,薬,予,1 -1468,3年生の漢字で[ひら]と読むのは?,平,命,由,羊,1 -1469,3年生の漢字で[へん]と読むのは?,返,面,油,洋,1 -1470,3年生の漢字で[べん]と読むのは?,勉,問,有,葉,1 -1471,3年生の漢字で[ほう]と読むのは?,放,役,遊,陽,1 -1472,3年生の漢字で[あじ]と読むのは?,味,薬,予,様,1 -1473,3年生の漢字で[いのち]と読むのは?,命,由,羊,落,1 -1474,3年生の漢字で[めん]と読むのは?,面,油,洋,流,1 -1475,3年生の漢字で[もん]と読むのは?,問,有,葉,旅,1 -1476,3年生の漢字で[やく]と読むのは?,役,遊,陽,両,1 -1477,3年生の漢字で[くすり]と読むのは?,薬,予,様,緑,1 -1478,3年生の漢字で[ゆ]と読むのは?,由,羊,落,礼,1 -1479,3年生の漢字で[あぶら]と読むのは?,油,洋,流,列,1 -1480,3年生の漢字で[ゆう]と読むのは?,有,葉,旅,練,1 -1481,3年生の漢字で[ゆう]と読むのは?,遊,陽,両,路,1 -1482,3年生の漢字で[よ]と読むのは?,予,様,緑,和,1 -1483,3年生の漢字で[ひつじ]と読むのは?,羊,落,礼,愛,1 -1484,3年生の漢字で[よう]と読むのは?,洋,流,列,案,1 -1485,3年生の漢字で[は]と読むのは?,葉,旅,練,以,1 -1486,3年生の漢字で[よう]と読むのは?,陽,両,路,衣,1 -1487,3年生の漢字で[さま]と読むのは?,様,緑,和,位,1 -1488,3年生の漢字で[らく]と読むのは?,落,礼,愛,囲,1 -1489,3年生の漢字で[りゅう]と読むのは?,流,列,案,胃,1 -1490,3年生の漢字で[たび]と読むのは?,旅,練,以,印,1 -1491,3年生の漢字で[りょう]と読むのは?,両,路,衣,英,1 -1492,3年生の漢字で[みどり]と読むのは?,緑,和,位,栄,1 -1493,3年生の漢字で[れい]と読むのは?,礼,愛,囲,塩,1 -1494,3年生の漢字で[れつ]と読むのは?,列,案,胃,億,1 -1495,3年生の漢字で[れん]と読むのは?,練,以,印,加,1 -1496,3年生の漢字で[ろ]と読むのは?,路,衣,英,果,1 -1497,3年生の漢字で[わ]と読むのは?,和,位,栄,貨,1 -1498,4年生の漢字で[あい]と読むのは?,愛,囲,塩,課,1 -1499,4年生の漢字で[あん]と読むのは?,案,胃,億,芽,1 -1500,4年生の漢字で[い]と読むのは?,以,印,加,改,1 -1501,4年生の漢字で[ころも]と読むのは?,衣,英,果,械,1 -1502,4年生の漢字で[くらい]と読むのは?,位,栄,貨,害,1 -1503,4年生の漢字で[い]と読むのは?,囲,塩,課,街,1 -1504,4年生の漢字で[い]と読むのは?,胃,億,芽,各,1 -1505,4年生の漢字で[しるし]と読むのは?,印,加,改,覚,1 -1506,4年生の漢字で[えい]と読むのは?,英,果,械,完,1 -1507,4年生の漢字で[えい]と読むのは?,栄,貨,害,官,1 -1508,4年生の漢字で[しお]と読むのは?,塩,課,街,管,1 -1509,4年生の漢字で[おく]と読むのは?,億,芽,各,関,1 -1510,4年生の漢字で[か]と読むのは?,加,改,覚,観,1 -1511,4年生の漢字で[か]と読むのは?,果,械,完,願,1 -1512,4年生の漢字で[か]と読むのは?,貨,害,官,希,1 -1513,4年生の漢字で[か]と読むのは?,課,街,管,季,1 -1514,4年生の漢字で[め]と読むのは?,芽,各,関,紀,1 -1515,4年生の漢字で[かい]と読むのは?,改,覚,観,喜,1 -1516,4年生の漢字で[かい]と読むのは?,械,完,願,旗,1 -1517,4年生の漢字で[がい]と読むのは?,害,官,希,器,1 -1518,4年生の漢字で[まち]と読むのは?,街,管,季,機,1 -1519,4年生の漢字で[かく]と読むのは?,各,関,紀,議,1 -1520,4年生の漢字で[かく]と読むのは?,覚,観,喜,求,1 -1521,4年生の漢字で[かん]と読むのは?,完,願,旗,泣,1 -1522,4年生の漢字で[かん]と読むのは?,官,希,器,救,1 -1523,4年生の漢字で[かん]と読むのは?,管,季,機,給,1 -1524,4年生の漢字で[かん]と読むのは?,関,紀,議,挙,1 -1525,4年生の漢字で[かん]と読むのは?,観,喜,求,漁,1 -1526,4年生の漢字で[がん]と読むのは?,願,旗,泣,共,1 -1527,4年生の漢字で[き]と読むのは?,希,器,救,協,1 -1528,4年生の漢字で[き]と読むのは?,季,機,給,鏡,1 -1529,4年生の漢字で[き]と読むのは?,紀,議,挙,竸,1 -1530,4年生の漢字で[き]と読むのは?,喜,求,漁,極,1 -1531,4年生の漢字で[はた]と読むのは?,旗,泣,共,訓,1 -1532,4年生の漢字で[うつわ]と読むのは?,器,救,協,軍,1 -1533,4年生の漢字で[き]と読むのは?,機,給,鏡,郡,1 -1534,4年生の漢字で[ぎ]と読むのは?,議,挙,竸,径,1 -1535,4年生の漢字で[きゅう]と読むのは?,求,漁,極,型,1 -1536,4年生の漢字で[きゅう]と読むのは?,泣,共,訓,景,1 -1537,4年生の漢字で[きゅう]と読むのは?,救,協,軍,芸,1 -1538,4年生の漢字で[きゅう]と読むのは?,給,鏡,郡,欠,1 -1539,4年生の漢字で[きょ]と読むのは?,挙,竸,径,結,1 -1540,4年生の漢字で[りょう]と読むのは?,漁,極,型,建,1 -1541,4年生の漢字で[きょう]と読むのは?,共,訓,景,健,1 -1542,4年生の漢字で[きょう]と読むのは?,協,軍,芸,験,1 -1543,4年生の漢字で[きょう]と読むのは?,鏡,郡,欠,固,1 -1544,4年生の漢字で[きょう]と読むのは?,竸,径,結,功,1 -1545,4年生の漢字で[きょく]と読むのは?,極,型,建,好,1 -1546,4年生の漢字で[くん]と読むのは?,訓,景,健,候,1 -1547,4年生の漢字で[ぐん]と読むのは?,軍,芸,験,航,1 -1548,4年生の漢字で[ぐん]と読むのは?,郡,欠,固,康,1 -1549,4年生の漢字で[けい]と読むのは?,径,結,功,告,1 -1550,4年生の漢字で[けい]と読むのは?,型,建,好,差,1 -1551,4年生の漢字で[けい]と読むのは?,景,健,候,菜,1 -1552,4年生の漢字で[げい]と読むのは?,芸,験,航,最,1 -1553,4年生の漢字で[けつ]と読むのは?,欠,固,康,材,1 -1554,4年生の漢字で[けつ]と読むのは?,結,功,告,昨,1 -1555,4年生の漢字で[けん]と読むのは?,建,好,差,札,1 -1556,4年生の漢字で[けん]と読むのは?,健,候,菜,刷,1 -1557,4年生の漢字で[けん]と読むのは?,験,航,最,殺,1 -1558,4年生の漢字で[こ]と読むのは?,固,康,材,察,1 -1559,4年生の漢字で[こう]と読むのは?,功,告,昨,参,1 -1560,4年生の漢字で[こう]と読むのは?,好,差,札,産,1 -1561,4年生の漢字で[そうろう]と読むのは?,候,菜,刷,散,1 -1562,4年生の漢字で[こう]と読むのは?,航,最,殺,残,1 -1563,4年生の漢字で[こう]と読むのは?,康,材,察,士,1 -1564,4年生の漢字で[こく]と読むのは?,告,昨,参,氏,1 -1565,4年生の漢字で[さ]と読むのは?,差,札,産,史,1 -1566,4年生の漢字で[さい]と読むのは?,菜,刷,散,司,1 -1567,4年生の漢字で[さい]と読むのは?,最,殺,残,試,1 -1568,4年生の漢字で[ざい]と読むのは?,材,察,士,児,1 -1569,4年生の漢字で[さく]と読むのは?,昨,参,氏,治,1 -1570,4年生の漢字で[さつ]と読むのは?,札,産,史,辞,1 -1571,4年生の漢字で[さつ]と読むのは?,刷,散,司,失,1 -1572,4年生の漢字で[さつ]と読むのは?,殺,残,試,借,1 -1573,4年生の漢字で[さつ]と読むのは?,察,士,児,種,1 -1574,4年生の漢字で[さん]と読むのは?,参,氏,治,周,1 -1575,4年生の漢字で[さん]と読むのは?,産,史,辞,祝,1 -1576,4年生の漢字で[さん]と読むのは?,散,司,失,順,1 -1577,4年生の漢字で[ざん]と読むのは?,残,試,借,初,1 -1578,4年生の漢字で[し]と読むのは?,士,児,種,松,1 -1579,4年生の漢字で[し]と読むのは?,氏,治,周,笑,1 -1580,4年生の漢字で[し]と読むのは?,史,辞,祝,唱,1 -1581,4年生の漢字で[し]と読むのは?,司,失,順,焼,1 -1582,4年生の漢字で[し]と読むのは?,試,借,初,象,1 -1583,4年生の漢字で[じ]と読むのは?,児,種,松,照,1 -1584,4年生の漢字で[じ]と読むのは?,治,周,笑,賞,1 -1585,4年生の漢字で[じ]と読むのは?,辞,祝,唱,臣,1 -1586,4年生の漢字で[しつ]と読むのは?,失,順,焼,信,1 -1587,4年生の漢字で[しゃく]と読むのは?,借,初,象,成,1 -1588,4年生の漢字で[しゅ]と読むのは?,種,松,照,省,1 -1589,4年生の漢字で[しゅう]と読むのは?,周,笑,賞,清,1 -1590,4年生の漢字で[しゅく]と読むのは?,祝,唱,臣,静,1 -1591,4年生の漢字で[じゅん]と読むのは?,順,焼,信,席,1 -1592,4年生の漢字で[しょ]と読むのは?,初,象,成,積,1 -1593,4年生の漢字で[まつ]と読むのは?,松,照,省,折,1 -1594,4年生の漢字で[しょう]と読むのは?,笑,賞,清,節,1 -1595,4年生の漢字で[しょう]と読むのは?,唱,臣,静,説,1 -1596,4年生の漢字で[しょう]と読むのは?,焼,信,席,浅,1 -1597,4年生の漢字で[しょう]と読むのは?,象,成,積,戦,1 -1598,4年生の漢字で[しょう]と読むのは?,照,省,折,選,1 -1599,4年生の漢字で[しょう]と読むのは?,賞,清,節,然,1 -1600,4年生の漢字で[しん]と読むのは?,臣,静,説,争,1 -1601,4年生の漢字で[しん]と読むのは?,信,席,浅,倉,1 -1602,4年生の漢字で[せい]と読むのは?,成,積,戦,巣,1 -1603,4年生の漢字で[しょう]と読むのは?,省,折,選,束,1 -1604,4年生の漢字で[せい]と読むのは?,清,節,然,側,1 -1605,4年生の漢字で[せい]と読むのは?,静,説,争,続,1 -1606,4年生の漢字で[せき]と読むのは?,席,浅,倉,卒,1 -1607,4年生の漢字で[せき]と読むのは?,積,戦,巣,孫,1 -1608,4年生の漢字で[せつ]と読むのは?,折,選,束,帯,1 -1609,4年生の漢字で[せつ]と読むのは?,節,然,側,隊,1 -1610,4年生の漢字で[せつ]と読むのは?,説,争,続,達,1 -1611,4年生の漢字で[せん]と読むのは?,浅,倉,卒,単,1 -1612,4年生の漢字で[せん]と読むのは?,戦,巣,孫,置,1 -1613,4年生の漢字で[せん]と読むのは?,選,束,帯,仲,1 -1614,4年生の漢字で[ねん]と読むのは?,然,側,隊,貯,1 -1615,4年生の漢字で[そう]と読むのは?,争,続,達,兆,1 -1616,4年生の漢字で[そう]と読むのは?,倉,卒,単,腸,1 -1617,4年生の漢字で[す]と読むのは?,巣,孫,置,低,1 -1618,4年生の漢字で[つか]と読むのは?,束,帯,仲,底,1 -1619,4年生の漢字で[がわ]と読むのは?,側,隊,貯,停,1 -1620,4年生の漢字で[ぞく]と読むのは?,続,達,兆,的,1 -1621,4年生の漢字で[そつ]と読むのは?,卒,単,腸,典,1 -1622,4年生の漢字で[まご]と読むのは?,孫,置,低,伝,1 -1623,4年生の漢字で[おび]と読むのは?,帯,仲,底,徒,1 -1624,4年生の漢字で[たい]と読むのは?,隊,貯,停,努,1 -1625,4年生の漢字で[たち]と読むのは?,達,兆,的,灯,1 -1626,4年生の漢字で[たん]と読むのは?,単,腸,典,堂,1 -1627,4年生の漢字で[ち]と読むのは?,置,低,伝,働,1 -1628,4年生の漢字で[ちゅう]と読むのは?,仲,底,徒,特,1 -1629,4年生の漢字で[ちょ]と読むのは?,貯,停,努,得,1 -1630,4年生の漢字で[ちょう]と読むのは?,兆,的,灯,毒,1 -1631,4年生の漢字で[ちょう]と読むのは?,腸,典,堂,熱,1 -1632,4年生の漢字で[てい]と読むのは?,低,伝,働,念,1 -1633,4年生の漢字で[てい]と読むのは?,底,徒,特,敗,1 -1634,4年生の漢字で[てい]と読むのは?,停,努,得,梅,1 -1635,4年生の漢字で[まと]と読むのは?,的,灯,毒,博,1 -1636,4年生の漢字で[てん]と読むのは?,典,堂,熱,飯,1 -1637,4年生の漢字で[でん]と読むのは?,伝,働,念,飛,1 -1638,4年生の漢字で[と]と読むのは?,徒,特,敗,費,1 -1639,4年生の漢字で[ど]と読むのは?,努,得,梅,必,1 -1640,4年生の漢字で[とう]と読むのは?,灯,毒,博,票,1 -1641,4年生の漢字で[どう]と読むのは?,堂,熱,飯,標,1 -1642,4年生の漢字で[どう]と読むのは?,働,念,飛,不,1 -1643,4年生の漢字で[とく]と読むのは?,特,敗,費,夫,1 -1644,4年生の漢字で[とく]と読むのは?,得,梅,必,付,1 -1645,4年生の漢字で[どく]と読むのは?,毒,博,票,府,1 -1646,4年生の漢字で[ねつ]と読むのは?,熱,飯,標,副,1 -1647,4年生の漢字で[ねん]と読むのは?,念,飛,不,粉,1 -1648,4年生の漢字で[はい]と読むのは?,敗,費,夫,兵,1 -1649,4年生の漢字で[ばい]と読むのは?,梅,必,付,別,1 -1650,4年生の漢字で[はく]と読むのは?,博,票,府,辺,1 -1651,4年生の漢字で[めし]と読むのは?,飯,標,副,変,1 -1652,4年生の漢字で[ひ]と読むのは?,飛,不,粉,便,1 -1653,4年生の漢字で[ひ]と読むのは?,費,夫,兵,包,1 -1654,4年生の漢字で[ひつ]と読むのは?,必,付,別,法,1 -1655,4年生の漢字で[ひょう]と読むのは?,票,府,辺,望,1 -1656,4年生の漢字で[ひょう]と読むのは?,標,副,変,牧,1 -1657,4年生の漢字で[ふ]と読むのは?,不,粉,便,末,1 -1658,4年生の漢字で[ふ]と読むのは?,夫,兵,包,満,1 -1659,4年生の漢字で[ふ]と読むのは?,付,別,法,未,1 -1660,4年生の漢字で[ふ]と読むのは?,府,辺,望,脈,1 -1661,4年生の漢字で[ふく]と読むのは?,副,変,牧,民,1 -1662,4年生の漢字で[ふん]と読むのは?,粉,便,末,無,1 -1663,4年生の漢字で[へい]と読むのは?,兵,包,満,約,1 -1664,4年生の漢字で[べつ]と読むのは?,別,法,未,勇,1 -1665,4年生の漢字で[へん]と読むのは?,辺,望,脈,要,1 -1666,4年生の漢字で[へん]と読むのは?,変,牧,民,養,1 -1667,4年生の漢字で[べん]と読むのは?,便,末,無,浴,1 -1668,4年生の漢字で[ほう]と読むのは?,包,満,約,利,1 -1669,4年生の漢字で[ほう]と読むのは?,法,未,勇,陸,1 -1670,4年生の漢字で[ぼう]と読むのは?,望,脈,要,良,1 -1671,4年生の漢字で[ぼく]と読むのは?,牧,民,養,料,1 -1672,4年生の漢字で[すえ]と読むのは?,末,無,浴,量,1 -1673,4年生の漢字で[みつ]と読むのは?,満,約,利,輪,1 -1674,4年生の漢字で[み]と読むのは?,未,勇,陸,類,1 -1675,4年生の漢字で[みゃく]と読むのは?,脈,要,良,令,1 -1676,4年生の漢字で[みん]と読むのは?,民,養,料,冷,1 -1677,4年生の漢字で[む]と読むのは?,無,浴,量,例,1 -1678,4年生の漢字で[やく]と読むのは?,約,利,輪,歴,1 -1679,4年生の漢字で[ゆう]と読むのは?,勇,陸,類,連,1 -1680,4年生の漢字で[よう]と読むのは?,要,良,令,老,1 -1681,4年生の漢字で[よう]と読むのは?,養,料,冷,労,1 -1682,4年生の漢字で[よく]と読むのは?,浴,量,例,録,1 -1683,4年生の漢字で[り]と読むのは?,利,輪,歴,圧,1 -1684,4年生の漢字で[りく]と読むのは?,陸,類,連,移,1 -1685,4年生の漢字で[りょう]と読むのは?,良,令,老,因,1 -1686,4年生の漢字で[りょう]と読むのは?,料,冷,労,永,1 -1687,4年生の漢字で[りょう]と読むのは?,量,例,録,営,1 -1688,4年生の漢字で[りん]と読むのは?,輪,歴,圧,衞,1 -1689,4年生の漢字で[るい]と読むのは?,類,連,移,易,1 -1690,4年生の漢字で[れい]と読むのは?,令,老,因,益,1 -1691,4年生の漢字で[れい]と読むのは?,冷,労,永,液,1 -1692,4年生の漢字で[れい]と読むのは?,例,録,営,演,1 -1693,4年生の漢字で[れき]と読むのは?,歴,圧,衞,応,1 -1694,4年生の漢字で[れん]と読むのは?,連,移,易,往,1 -1695,4年生の漢字で[ろう]と読むのは?,老,因,益,桜,1 -1696,4年生の漢字で[ろう]と読むのは?,労,永,液,恩,1 -1697,4年生の漢字で[ろく]と読むのは?,録,営,演,可,1 -1698,5年生の漢字で[あつ]と読むのは?,圧,衞,応,仮,1 -1699,5年生の漢字で[い]と読むのは?,移,易,往,価,1 -1700,5年生の漢字で[いん]と読むのは?,因,益,桜,河,1 -1701,5年生の漢字で[えい]と読むのは?,永,液,恩,過,1 -1702,5年生の漢字で[えい]と読むのは?,営,演,可,賀,1 -1703,5年生の漢字で[えい]と読むのは?,衞,応,仮,快,1 -1704,5年生の漢字で[えき]と読むのは?,易,往,価,解,1 -1705,5年生の漢字で[えき]と読むのは?,益,桜,河,格,1 -1706,5年生の漢字で[えき]と読むのは?,液,恩,過,確,1 -1707,5年生の漢字で[えん]と読むのは?,演,可,賀,額,1 -1708,5年生の漢字で[おう]と読むのは?,応,仮,快,刊,1 -1709,5年生の漢字で[おう]と読むのは?,往,価,解,幹,1 -1710,5年生の漢字で[さくら]と読むのは?,桜,河,格,慣,1 -1711,5年生の漢字で[おん]と読むのは?,恩,過,確,眼,1 -1712,5年生の漢字で[か]と読むのは?,可,賀,額,基,1 -1713,5年生の漢字で[かり]と読むのは?,仮,快,刊,寄,1 -1714,5年生の漢字で[か]と読むのは?,価,解,幹,規,1 -1715,5年生の漢字で[かわ]と読むのは?,河,格,慣,技,1 -1716,5年生の漢字で[か]と読むのは?,過,確,眼,義,1 -1717,5年生の漢字で[が]と読むのは?,賀,額,基,逆,1 -1718,5年生の漢字で[かい]と読むのは?,快,刊,寄,久,1 -1719,5年生の漢字で[かい]と読むのは?,解,幹,規,旧,1 -1720,5年生の漢字で[かく]と読むのは?,格,慣,技,居,1 -1721,5年生の漢字で[かく]と読むのは?,確,眼,義,許,1 -1722,5年生の漢字で[がく]と読むのは?,額,基,逆,境,1 -1723,5年生の漢字で[かん]と読むのは?,刊,寄,久,均,1 -1724,5年生の漢字で[かん]と読むのは?,幹,規,旧,禁,1 -1725,5年生の漢字で[かん]と読むのは?,慣,技,居,句,1 -1726,5年生の漢字で[がん]と読むのは?,眼,義,許,群,1 -1727,5年生の漢字で[もと]と読むのは?,基,逆,境,経,1 -1728,5年生の漢字で[き]と読むのは?,寄,久,均,潔,1 -1729,5年生の漢字で[き]と読むのは?,規,旧,禁,件,1 -1730,5年生の漢字で[ぎ]と読むのは?,技,居,句,券,1 -1731,5年生の漢字で[ぎ]と読むのは?,義,許,群,険,1 -1732,5年生の漢字で[ぎゃく]と読むのは?,逆,境,経,検,1 -1733,5年生の漢字で[きゅう]と読むのは?,久,均,潔,限,1 -1734,5年生の漢字で[きゅう]と読むのは?,旧,禁,件,現,1 -1735,5年生の漢字で[きょ]と読むのは?,居,句,券,減,1 -1736,5年生の漢字で[きょ]と読むのは?,許,群,険,故,1 -1737,5年生の漢字で[きょう]と読むのは?,境,経,検,個,1 -1738,5年生の漢字で[きん]と読むのは?,均,潔,限,護,1 -1739,5年生の漢字で[きん]と読むのは?,禁,件,現,効,1 -1740,5年生の漢字で[く]と読むのは?,句,券,減,厚,1 -1741,5年生の漢字で[ぐん]と読むのは?,群,険,故,耕,1 -1742,5年生の漢字で[けい]と読むのは?,経,検,個,鉱,1 -1743,5年生の漢字で[けつ]と読むのは?,潔,限,護,構,1 -1744,5年生の漢字で[けん]と読むのは?,件,現,効,興,1 -1745,5年生の漢字で[けん]と読むのは?,券,減,厚,講,1 -1746,5年生の漢字で[けん]と読むのは?,険,故,耕,混,1 -1747,5年生の漢字で[けん]と読むのは?,検,個,鉱,査,1 -1748,5年生の漢字で[げん]と読むのは?,限,護,構,再,1 -1749,5年生の漢字で[げん]と読むのは?,現,効,興,災,1 -1750,5年生の漢字で[げん]と読むのは?,減,厚,講,妻,1 -1751,5年生の漢字で[ゆえ]と読むのは?,故,耕,混,採,1 -1752,5年生の漢字で[こ]と読むのは?,個,鉱,査,在,1 -1753,5年生の漢字で[ご]と読むのは?,護,構,再,財,1 -1754,5年生の漢字で[こう]と読むのは?,効,興,災,罪,1 -1755,5年生の漢字で[こう]と読むのは?,厚,講,妻,雑,1 -1756,5年生の漢字で[こう]と読むのは?,耕,混,採,酸,1 -1757,5年生の漢字で[こう]と読むのは?,鉱,査,在,賛,1 -1758,5年生の漢字で[こう]と読むのは?,構,再,財,志,1 -1759,5年生の漢字で[こう]と読むのは?,興,災,罪,枝,1 -1760,5年生の漢字で[こう]と読むのは?,講,妻,雑,師,1 -1761,5年生の漢字で[こん]と読むのは?,混,採,酸,資,1 -1762,5年生の漢字で[さ]と読むのは?,査,在,賛,飼,1 -1763,5年生の漢字で[さい]と読むのは?,再,財,志,示,1 -1764,5年生の漢字で[さい]と読むのは?,災,罪,枝,似,1 -1765,5年生の漢字で[さい]と読むのは?,妻,雑,師,識,1 -1766,5年生の漢字で[さい]と読むのは?,採,酸,資,質,1 -1767,5年生の漢字で[ざい]と読むのは?,在,賛,飼,舎,1 -1768,5年生の漢字で[ざい]と読むのは?,財,志,示,謝,1 -1769,5年生の漢字で[ざい]と読むのは?,罪,枝,似,授,1 -1770,5年生の漢字で[ざつ]と読むのは?,雑,師,識,修,1 -1771,5年生の漢字で[さん]と読むのは?,酸,資,質,述,1 -1772,5年生の漢字で[さん]と読むのは?,賛,飼,舎,術,1 -1773,5年生の漢字で[し]と読むのは?,志,示,謝,準,1 -1774,5年生の漢字で[えだ]と読むのは?,枝,似,授,序,1 -1775,5年生の漢字で[し]と読むのは?,師,識,修,招,1 -1776,5年生の漢字で[し]と読むのは?,資,質,述,承,1 -1777,5年生の漢字で[し]と読むのは?,飼,舎,術,証,1 -1778,5年生の漢字で[じ]と読むのは?,示,謝,準,条,1 -1779,5年生の漢字で[じ]と読むのは?,似,授,序,状,1 -1780,5年生の漢字で[しき]と読むのは?,識,修,招,常,1 -1781,5年生の漢字で[しつ]と読むのは?,質,述,承,情,1 -1782,5年生の漢字で[しゃ]と読むのは?,舎,術,証,織,1 -1783,5年生の漢字で[しゃ]と読むのは?,謝,準,条,職,1 -1784,5年生の漢字で[じゅ]と読むのは?,授,序,状,制,1 -1785,5年生の漢字で[しゅう]と読むのは?,修,招,常,性,1 -1786,5年生の漢字で[じゅつ]と読むのは?,述,承,情,政,1 -1787,5年生の漢字で[じゅつ]と読むのは?,術,証,織,勢,1 -1788,5年生の漢字で[じゅん]と読むのは?,準,条,職,精,1 -1789,5年生の漢字で[じょ]と読むのは?,序,状,制,製,1 -1790,5年生の漢字で[しょう]と読むのは?,招,常,性,税,1 -1791,5年生の漢字で[しょう]と読むのは?,承,情,政,責,1 -1792,5年生の漢字で[しょう]と読むのは?,証,織,勢,績,1 -1793,5年生の漢字で[じょう]と読むのは?,条,職,精,接,1 -1794,5年生の漢字で[じょう]と読むのは?,状,制,製,設,1 -1795,5年生の漢字で[じょう]と読むのは?,常,性,税,舌,1 -1796,5年生の漢字で[じょう]と読むのは?,情,政,責,絶,1 -1797,5年生の漢字で[しき]と読むのは?,織,勢,績,銭,1 -1798,5年生の漢字で[しょく]と読むのは?,職,精,接,祖,1 -1799,5年生の漢字で[せい]と読むのは?,制,製,設,素,1 -1800,5年生の漢字で[せい]と読むのは?,性,税,舌,総,1 -1801,5年生の漢字で[せい]と読むのは?,政,責,絶,造,1 -1802,5年生の漢字で[せい]と読むのは?,勢,績,銭,像,1 -1803,5年生の漢字で[せい]と読むのは?,精,接,祖,増,1 -1804,5年生の漢字で[せい]と読むのは?,製,設,素,則,1 -1805,5年生の漢字で[ぜい]と読むのは?,税,舌,総,測,1 -1806,5年生の漢字で[せき]と読むのは?,責,絶,造,属,1 -1807,5年生の漢字で[せき]と読むのは?,績,銭,像,率,1 -1808,5年生の漢字で[せつ]と読むのは?,接,祖,増,損,1 -1809,5年生の漢字で[せつ]と読むのは?,設,素,則,退,1 -1810,5年生の漢字で[ぜつ]と読むのは?,舌,総,測,貸,1 -1811,5年生の漢字で[ぜつ]と読むのは?,絶,造,属,態,1 -1812,5年生の漢字で[せん]と読むのは?,銭,像,率,団,1 -1813,5年生の漢字で[そ]と読むのは?,祖,増,損,断,1 -1814,5年生の漢字で[そ]と読むのは?,素,則,退,築,1 -1815,5年生の漢字で[そう]と読むのは?,総,測,貸,張,1 -1816,5年生の漢字で[ぞう]と読むのは?,造,属,態,堤,1 -1817,5年生の漢字で[ぞう]と読むのは?,像,率,団,程,1 -1818,5年生の漢字で[ぞう]と読むのは?,増,損,断,適,1 -1819,5年生の漢字で[そく]と読むのは?,則,退,築,敵,1 -1820,5年生の漢字で[そく]と読むのは?,測,貸,張,統,1 -1821,5年生の漢字で[ぞく]と読むのは?,属,態,堤,銅,1 -1822,5年生の漢字で[りつ]と読むのは?,率,団,程,導,1 -1823,5年生の漢字で[そん]と読むのは?,損,断,適,徳,1 -1824,5年生の漢字で[たい]と読むのは?,退,築,敵,独,1 -1825,5年生の漢字で[たい]と読むのは?,貸,張,統,任,1 -1826,5年生の漢字で[たい]と読むのは?,態,堤,銅,燃,1 -1827,5年生の漢字で[だん]と読むのは?,団,程,導,能,1 -1828,5年生の漢字で[だん]と読むのは?,断,適,徳,破,1 -1829,5年生の漢字で[ちく]と読むのは?,築,敵,独,犯,1 -1830,5年生の漢字で[ちょう]と読むのは?,張,統,任,判,1 -1831,5年生の漢字で[てい]と読むのは?,堤,銅,燃,版,1 -1832,5年生の漢字で[てい]と読むのは?,程,導,能,比,1 -1833,5年生の漢字で[てき]と読むのは?,適,徳,破,肥,1 -1834,5年生の漢字で[てき]と読むのは?,敵,独,犯,非,1 -1835,5年生の漢字で[とう]と読むのは?,統,任,判,備,1 -1836,5年生の漢字で[どう]と読むのは?,銅,燃,版,俵,1 -1837,5年生の漢字で[どう]と読むのは?,導,能,比,評,1 -1838,5年生の漢字で[とく]と読むのは?,徳,破,肥,貧,1 -1839,5年生の漢字で[どく]と読むのは?,独,犯,非,布,1 -1840,5年生の漢字で[にん]と読むのは?,任,判,備,婦,1 -1841,5年生の漢字で[ねん]と読むのは?,燃,版,俵,富,1 -1842,5年生の漢字で[のう]と読むのは?,能,比,評,武,1 -1843,5年生の漢字で[は]と読むのは?,破,肥,貧,復,1 -1844,5年生の漢字で[はん]と読むのは?,犯,非,布,複,1 -1845,5年生の漢字で[はん]と読むのは?,判,備,婦,仏,1 -1846,5年生の漢字で[はん]と読むのは?,版,俵,富,編,1 -1847,5年生の漢字で[ひ]と読むのは?,比,評,武,弁,1 -1848,5年生の漢字で[ひ]と読むのは?,肥,貧,復,保,1 -1849,5年生の漢字で[ひ]と読むのは?,非,布,複,墓,1 -1850,5年生の漢字で[び]と読むのは?,備,婦,仏,報,1 -1851,5年生の漢字で[びょう]と読むのは?,俵,富,編,豊,1 -1852,5年生の漢字で[ひょう]と読むのは?,評,武,弁,防,1 -1853,5年生の漢字で[ひん]と読むのは?,貧,復,保,貿,1 -1854,5年生の漢字で[ふ]と読むのは?,布,複,墓,暴,1 -1855,5年生の漢字で[ふ]と読むのは?,婦,仏,報,務,1 -1856,5年生の漢字で[とみ]と読むのは?,富,編,豊,夢,1 -1857,5年生の漢字で[ぶ]と読むのは?,武,弁,防,迷,1 -1858,5年生の漢字で[ふく]と読むのは?,復,保,貿,綿,1 -1859,5年生の漢字で[ふく]と読むのは?,複,墓,暴,輸,1 -1860,5年生の漢字で[ぶつ]と読むのは?,仏,報,務,余,1 -1861,5年生の漢字で[へん]と読むのは?,編,豊,夢,預,1 -1862,5年生の漢字で[べん]と読むのは?,弁,防,迷,容,1 -1863,5年生の漢字で[ほ]と読むのは?,保,貿,綿,略,1 -1864,5年生の漢字で[はか]と読むのは?,墓,暴,輸,留,1 -1865,5年生の漢字で[ほう]と読むのは?,報,務,余,領,1 -1866,5年生の漢字で[ほう]と読むのは?,豊,夢,預,異,1 -1867,5年生の漢字で[ぼう]と読むのは?,防,迷,容,遺,1 -1868,5年生の漢字で[ぼう]と読むのは?,貿,綿,略,域,1 -1869,5年生の漢字で[ぼう]と読むのは?,暴,輸,留,宇,1 -1870,5年生の漢字で[む]と読むのは?,務,余,領,映,1 -1871,5年生の漢字で[む]と読むのは?,夢,預,異,延,1 -1872,5年生の漢字で[めい]と読むのは?,迷,容,遺,沿,1 -1873,5年生の漢字で[めん]と読むのは?,綿,略,域,我,1 -1874,5年生の漢字で[ゆ]と読むのは?,輸,留,宇,灰,1 -1875,5年生の漢字で[よ]と読むのは?,余,領,映,拡,1 -1876,5年生の漢字で[よ]と読むのは?,預,異,延,革,1 -1877,5年生の漢字で[よう]と読むのは?,容,遺,沿,閣,1 -1878,5年生の漢字で[りゃく]と読むのは?,略,域,我,割,1 -1879,5年生の漢字で[りゅう]と読むのは?,留,宇,灰,株,1 -1880,5年生の漢字で[りょう]と読むのは?,領,映,拡,干,1 -1881,6年生の漢字で[い]と読むのは?,異,延,革,巻,1 -1882,6年生の漢字で[い]と読むのは?,遺,沿,閣,看,1 -1883,6年生の漢字で[いき]と読むのは?,域,我,割,簡,1 -1884,6年生の漢字で[う]と読むのは?,宇,灰,株,危,1 -1885,6年生の漢字で[えい]と読むのは?,映,拡,干,机,1 -1886,6年生の漢字で[えん]と読むのは?,延,革,巻,揮,1 -1887,6年生の漢字で[えん]と読むのは?,沿,閣,看,貴,1 -1888,6年生の漢字で[が]と読むのは?,我,割,簡,疑,1 -1889,6年生の漢字で[はい]と読むのは?,灰,株,危,吸,1 -1890,6年生の漢字で[かく]と読むのは?,拡,干,机,供,1 -1891,6年生の漢字で[かく]と読むのは?,革,巻,揮,胸,1 -1892,6年生の漢字で[かく]と読むのは?,閣,看,貴,郷,1 -1893,6年生の漢字で[かつ]と読むのは?,割,簡,疑,勤,1 -1894,6年生の漢字で[かぶ]と読むのは?,株,危,吸,筋,1 -1895,6年生の漢字で[かん]と読むのは?,干,机,供,系,1 -1896,6年生の漢字で[かん]と読むのは?,巻,揮,胸,敬,1 -1897,6年生の漢字で[かん]と読むのは?,看,貴,郷,警,1 -1898,6年生の漢字で[かん]と読むのは?,簡,疑,勤,劇,1 -1899,6年生の漢字で[き]と読むのは?,危,吸,筋,激,1 -1900,6年生の漢字で[き]と読むのは?,机,供,系,穴,1 -1901,6年生の漢字で[き]と読むのは?,揮,胸,敬,絹,1 -1902,6年生の漢字で[き]と読むのは?,貴,郷,警,権,1 -1903,6年生の漢字で[ぎ]と読むのは?,疑,勤,劇,憲,1 -1904,6年生の漢字で[きゅう]と読むのは?,吸,筋,激,源,1 -1905,6年生の漢字で[きょう]と読むのは?,供,系,穴,厳,1 -1906,6年生の漢字で[きょう]と読むのは?,胸,敬,絹,己,1 -1907,6年生の漢字で[きょう]と読むのは?,郷,警,権,呼,1 -1908,6年生の漢字で[きん]と読むのは?,勤,劇,憲,誤,1 -1909,6年生の漢字で[きん]と読むのは?,筋,激,源,后,1 -1910,6年生の漢字で[けい]と読むのは?,系,穴,厳,考,1 -1911,6年生の漢字で[けい]と読むのは?,敬,絹,己,皇,1 -1912,6年生の漢字で[けい]と読むのは?,警,権,呼,紅,1 -1913,6年生の漢字で[げき]と読むのは?,劇,憲,誤,降,1 -1914,6年生の漢字で[げき]と読むのは?,激,源,后,鋼,1 -1915,6年生の漢字で[あな]と読むのは?,穴,厳,考,刻,1 -1916,6年生の漢字で[きぬ]と読むのは?,絹,己,皇,穀,1 -1917,6年生の漢字で[けん]と読むのは?,権,呼,紅,骨,1 -1918,6年生の漢字で[けん]と読むのは?,憲,誤,降,困,1 -1919,6年生の漢字で[げん]と読むのは?,源,后,鋼,砂,1 -1920,6年生の漢字で[げん]と読むのは?,厳,考,刻,座,1 -1921,6年生の漢字で[こ]と読むのは?,己,皇,穀,済,1 -1922,6年生の漢字で[こ]と読むのは?,呼,紅,骨,裁,1 -1923,6年生の漢字で[ご]と読むのは?,誤,降,困,策,1 -1924,6年生の漢字で[ごう]と読むのは?,后,鋼,砂,冊,1 -1925,6年生の漢字で[こう]と読むのは?,考,刻,座,蚕,1 -1926,6年生の漢字で[こう]と読むのは?,皇,穀,済,至,1 -1927,6年生の漢字で[こう]と読むのは?,紅,骨,裁,私,1 -1928,6年生の漢字で[こう]と読むのは?,降,困,策,姿,1 -1929,6年生の漢字で[こう]と読むのは?,鋼,砂,冊,視,1 -1930,6年生の漢字で[こく]と読むのは?,刻,座,蚕,詞,1 -1931,6年生の漢字で[こく]と読むのは?,穀,済,至,誌,1 -1932,6年生の漢字で[こつ]と読むのは?,骨,裁,私,磁,1 -1933,6年生の漢字で[こん]と読むのは?,困,策,姿,射,1 -1934,6年生の漢字で[さ]と読むのは?,砂,冊,視,捨,1 -1935,6年生の漢字で[ざ]と読むのは?,座,蚕,詞,尺,1 -1936,6年生の漢字で[さい]と読むのは?,済,至,誌,若,1 -1937,6年生の漢字で[さい]と読むのは?,裁,私,磁,樹,1 -1938,6年生の漢字で[さく]と読むのは?,策,姿,射,収,1 -1939,6年生の漢字で[さつ]と読むのは?,冊,視,捨,宗,1 -1940,6年生の漢字で[かいこ]と読むのは?,蚕,詞,尺,就,1 -1941,6年生の漢字で[し]と読むのは?,至,誌,若,衆,1 -1942,6年生の漢字で[し]と読むのは?,私,磁,樹,従,1 -1943,6年生の漢字で[し]と読むのは?,姿,射,収,縦,1 -1944,6年生の漢字で[し]と読むのは?,視,捨,宗,縮,1 -1945,6年生の漢字で[し]と読むのは?,詞,尺,就,熟,1 -1946,6年生の漢字で[し]と読むのは?,誌,若,衆,純,1 -1947,6年生の漢字で[じ]と読むのは?,磁,樹,従,処,1 -1948,6年生の漢字で[しゃ]と読むのは?,射,収,縦,署,1 -1949,6年生の漢字で[しゃ]と読むのは?,捨,宗,縮,諸,1 -1950,6年生の漢字で[しゃく]と読むのは?,尺,就,熟,除,1 -1951,6年生の漢字で[じゃく]と読むのは?,若,衆,純,将,1 -1952,6年生の漢字で[じゅ]と読むのは?,樹,従,処,傷,1 -1953,6年生の漢字で[しゅう]と読むのは?,収,縦,署,障,1 -1954,6年生の漢字で[しゅう]と読むのは?,宗,縮,諸,城,1 -1955,6年生の漢字で[しゅう]と読むのは?,就,熟,除,蒸,1 -1956,6年生の漢字で[しゅう]と読むのは?,衆,純,将,針,1 -1957,6年生の漢字で[じゅう]と読むのは?,従,処,傷,仁,1 -1958,6年生の漢字で[じゅう]と読むのは?,縦,署,障,垂,1 -1959,6年生の漢字で[しゅく]と読むのは?,縮,諸,城,推,1 -1960,6年生の漢字で[じゅく]と読むのは?,熟,除,蒸,寸,1 -1961,6年生の漢字で[じゅん]と読むのは?,純,将,針,盛,1 -1962,6年生の漢字で[ところ]と読むのは?,処,傷,仁,聖,1 -1963,6年生の漢字で[しょ]と読むのは?,署,障,垂,誠,1 -1964,6年生の漢字で[しょ]と読むのは?,諸,城,推,宣,1 -1965,6年生の漢字で[じょ]と読むのは?,除,蒸,寸,専,1 -1966,6年生の漢字で[しょう]と読むのは?,将,針,盛,泉,1 -1967,6年生の漢字で[しょう]と読むのは?,傷,仁,聖,洗,1 -1968,6年生の漢字で[しょう]と読むのは?,障,垂,誠,染,1 -1969,6年生の漢字で[じょう]と読むのは?,城,推,宣,善,1 -1970,6年生の漢字で[じょう]と読むのは?,蒸,寸,専,奏,1 -1971,6年生の漢字で[しん]と読むのは?,針,盛,泉,窓,1 -1972,6年生の漢字で[じん]と読むのは?,仁,聖,洗,創,1 -1973,6年生の漢字で[すい]と読むのは?,垂,誠,染,装,1 -1974,6年生の漢字で[すい]と読むのは?,推,宣,善,層,1 -1975,6年生の漢字で[すん]と読むのは?,寸,専,奏,操,1 -1976,6年生の漢字で[せい]と読むのは?,盛,泉,窓,蔵,1 -1977,6年生の漢字で[せい]と読むのは?,聖,洗,創,臓,1 -1978,6年生の漢字で[せい]と読むのは?,誠,染,装,存,1 -1979,6年生の漢字で[せん]と読むのは?,宣,善,層,尊,1 -1980,6年生の漢字で[せん]と読むのは?,専,奏,操,宅,1 -1981,6年生の漢字で[せん]と読むのは?,泉,窓,蔵,担,1 -1982,6年生の漢字で[せん]と読むのは?,洗,創,臓,探,1 -1983,6年生の漢字で[せん]と読むのは?,染,装,存,誕,1 -1984,6年生の漢字で[ぜん]と読むのは?,善,層,尊,段,1 -1985,6年生の漢字で[そう]と読むのは?,奏,操,宅,暖,1 -1986,6年生の漢字で[まど]と読むのは?,窓,蔵,担,値,1 -1987,6年生の漢字で[そう]と読むのは?,創,臓,探,宙,1 -1988,6年生の漢字で[そう]と読むのは?,装,存,誕,忠,1 -1989,6年生の漢字で[そう]と読むのは?,層,尊,段,著,1 -1990,6年生の漢字で[そう]と読むのは?,操,宅,暖,庁,1 -1991,6年生の漢字で[ぞう]と読むのは?,蔵,担,値,頂,1 -1992,6年生の漢字で[ぞう]と読むのは?,臓,探,宙,潮,1 -1993,6年生の漢字で[ぞん]と読むのは?,存,誕,忠,賃,1 -1994,6年生の漢字で[そん]と読むのは?,尊,段,著,痛,1 -1995,6年生の漢字で[たく]と読むのは?,宅,暖,庁,展,1 -1996,6年生の漢字で[たん]と読むのは?,担,値,頂,討,1 -1997,6年生の漢字で[たん]と読むのは?,探,宙,潮,党,1 -1998,6年生の漢字で[たん]と読むのは?,誕,忠,賃,糖,1 -1999,6年生の漢字で[だん]と読むのは?,段,著,痛,届,1 -2000,6年生の漢字で[だん]と読むのは?,暖,庁,展,難,1 -2001,6年生の漢字で[ち]と読むのは?,値,頂,討,乳,1 -2002,6年生の漢字で[ちゅう]と読むのは?,宙,潮,党,認,1 -2003,6年生の漢字で[ちゅう]と読むのは?,忠,賃,糖,納,1 -2004,6年生の漢字で[ちょ]と読むのは?,著,痛,届,脳,1 -2005,6年生の漢字で[ちょう]と読むのは?,庁,展,難,派,1 -2006,6年生の漢字で[ちょう]と読むのは?,頂,討,乳,拝,1 -2007,6年生の漢字で[しお]と読むのは?,潮,党,認,背,1 -2008,6年生の漢字で[ちん]と読むのは?,賃,糖,納,肺,1 -2009,6年生の漢字で[つう]と読むのは?,痛,届,脳,俳,1 -2010,6年生の漢字で[てん]と読むのは?,展,難,派,班,1 -2011,6年生の漢字で[とう]と読むのは?,討,乳,拝,晩,1 -2012,6年生の漢字で[とう]と読むのは?,党,認,背,否,1 -2013,6年生の漢字で[とう]と読むのは?,糖,納,肺,批,1 -2014,6年生の漢字で[かい]と読むのは?,届,脳,俳,秘,1 -2015,6年生の漢字で[なん]と読むのは?,難,派,班,腹,1 -2016,6年生の漢字で[にゅう]と読むのは?,乳,拝,晩,奮,1 -2017,6年生の漢字で[にん]と読むのは?,認,背,否,並,1 -2018,6年生の漢字で[のう]と読むのは?,納,肺,批,陛,1 -2019,6年生の漢字で[のう]と読むのは?,脳,俳,秘,閉,1 -2020,6年生の漢字で[は]と読むのは?,派,班,腹,片,1 -2021,6年生の漢字で[はい]と読むのは?,拝,晩,奮,補,1 -2022,6年生の漢字で[はい]と読むのは?,背,否,並,暮,1 -2023,6年生の漢字で[はい]と読むのは?,肺,批,陛,宝,1 -2024,6年生の漢字で[はい]と読むのは?,俳,秘,閉,訪,1 -2025,6年生の漢字で[はん]と読むのは?,班,腹,片,亡,1 -2026,6年生の漢字で[ばん]と読むのは?,晩,奮,補,忘,1 -2027,6年生の漢字で[いな]と読むのは?,否,並,暮,棒,1 -2028,6年生の漢字で[ひ]と読むのは?,批,陛,宝,枚,1 -2029,6年生の漢字で[ひ]と読むのは?,秘,閉,訪,幕,1 -2030,6年生の漢字で[ふく]と読むのは?,腹,片,亡,密,1 -2031,6年生の漢字で[ふん]と読むのは?,奮,拝,乳,討,1 -2032,6年生の漢字で[なみ]と読むのは?,並,背,認,党,1 -2033,6年生の漢字で[へい]と読むのは?,陛,肺,納,糖,1 -2034,6年生の漢字で[へい]と読むのは?,閉,俳,脳,届,1 -2035,6年生の漢字で[へん]と読むのは?,片,班,派,難,1 -2036,6年生の漢字で[ほ]と読むのは?,補,晩,拝,乳,1 -2037,6年生の漢字で[ぼ]と読むのは?,暮,否,背,認,1 -2038,6年生の漢字で[ほう]と読むのは?,宝,批,肺,納,1 -2039,6年生の漢字で[ほう]と読むのは?,訪,秘,俳,脳,1 -2040,6年生の漢字で[ぼう]と読むのは?,亡,腹,班,派,1 -2041,6年生の漢字で[ぼう]と読むのは?,忘,奮,晩,拝,1 -2042,6年生の漢字で[ぼう]と読むのは?,棒,並,否,背,1 -2043,6年生の漢字で[まい]と読むのは?,枚,陛,批,肺,1 -2044,6年生の漢字で[まく]と読むのは?,幕,閉,秘,俳,1 -2045,6年生の漢字で[みつ]と読むのは?,密,片,腹,班,1 -2046,6年生の漢字で[めい]と読むのは?,盟,補,奮,晩,1 -2047,6年生の漢字で[も]と読むのは?,模,暮,並,否,1 -2048,6年生の漢字で[やく]と読むのは?,訳,宝,陛,批,1 -2049,6年生の漢字で[ゆう]と読むのは?,郵,訪,閉,秘,1 -2050,6年生の漢字で[ゆう]と読むのは?,優,亡,片,腹,1 -2051,6年生の漢字で[よう]と読むのは?,幼,忘,補,奮,1 -2052,6年生の漢字で[よく]と読むのは?,欲,棒,暮,並,1 -2053,6年生の漢字で[よく]と読むのは?,翌,枚,宝,陛,1 -2054,6年生の漢字で[らん]と読むのは?,乱,幕,訪,閉,1 -2055,6年生の漢字で[らん]と読むのは?,卵,密,亡,片,1 -2056,6年生の漢字で[らん]と読むのは?,覧,盟,忘,補,1 -2057,6年生の漢字で[うら]と読むのは?,裏,模,棒,暮,1 -2058,6年生の漢字で[りつ]と読むのは?,律,訳,枚,宝,1 -2059,6年生の漢字で[りん]と読むのは?,臨,郵,幕,訪,1 -2060,6年生の漢字で[ろう]と読むのは?,朗,優,密,亡,1 -2061,6年生の漢字で[ろん]と読むのは?,論,幼,盟,忘,1
--- a/mackey/academy/db.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 - -require"rubygems" -require"pg" - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - res.each do |row| - puts row["question"].to_s + ":" + row["word1"].to_s + ":" + row["word2"].to_s + ":" + row["word3"].to_s + ":" + row["word4"].to_s - end -ensure - conn.close if conn -end
--- a/mackey/academy/db.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 - -require"rubygems" -require"pg" - -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - q = "select question, word1, word2, word3, word4 from quiz" - res = conn.exec(q) - p res - res.each do |row| - puts row["question"].to_s + ":" + row["wordone"].to_s + ":" + row["wordtwo"].to_s + ":" + row["wordthi"].to_s + ":" + row["wordfou"].to_s - end -ensure - conn.close if conn -end
--- a/mackey/academy/hantei.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 -def hantei(a, b, c, d) - if
--- a/mackey/academy/index.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> -<title>Mackey Academy</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> -<body> -<p>Ver.0.8</p> -<div class="center01"> -<img src="ma.png" width="480" height="140"> -<img src="boss.jpg" width="480" height="320" alt="" title""> -<h2>ȳ桪</h2> -<a href="login.html"> -<button class="css3button"></button> -</a> -<p>ϤƤ<a href="add.html"></a></p> -<p><a href="read.html"></a></p> -</div> -</body> -</html>
--- a/mackey/academy/index.html~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>教育ソフトウェア</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> -<body> -<h1>test mode</h1> -<div class="center01"> -<h1>テストモード</h1> -<img src="boss.jpg" width="480" height="320" alt="スタート" title"スタート"> -<h2>テストクエスト開催中!</h2> -<a href="login.html"> -<button class="css3button">ログイン</button> -</a> -</div> -</body> -</html>
--- a/mackey/academy/intro.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> -<title>Mackey Academy</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> -<body> -<div class="center01"> -<img src="ma.png" width="480" height="140"> -</div> -<h1>´ʸֳؽٱ祷ƥMackey Academyγȯ</h1> -<p>ǯɤ⤿ΥͥåȤ䥲ʤɤѻ֤ӤƤǡͥ -Ȥ䥲λ֤ṳ̂ۤʿ⤤ˤ뤳Ȥ狼äǡͥåȤ䥲λ֤ΤޤٶˤƤ뤳ȤǤʤ顢뤳ȤǤΤǤϤʤȤΩƤäơǤʤRPGڤळȤMackey Academyפȯ롣ܸʸǤApachePosgreSQLRubyʤɤδĶΤȡCGIǤΥץꥱȯԤä</p> -<p>ʸ<a href="puti.pdf"></a></p> -<br><br><br> -<p>Mackey AcademyǥǤ<a href="index.html"></a></p> -</body> -</html>
--- a/mackey/academy/login.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> -<title></title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1></h1> -<div class="center01"> -<div> -<form method="POST" action="login.rb"> -<p> -<span>ID:</span><input type="text" name="id"><br><br> -<span>PASS:</span><input type="password" name="pass"><br><br> -<button class="css3button" type="submit" name="Battle" value="0"></button> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/login.html~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>ログイン</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1>ログイン</h1> -<div class="center01"> -<div> -<form method="POST" action="login.rb"> -<p> -<span>ID:</span><input type="text" name="id"><br><br> -<span>PASS:</span><input type="password" name="pass"><br><br> -<button class="css3button" type="submit" name="Battle" value="0">ログイン</button> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/login.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -#!/usr/bin/env ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "euc-jp") -print"Content-type: text/html; charset=euc-jp\n\n" - -number = c["id"] -pswd = c["pass"] -log = c["Battle"] -check = 0 -lvl = 0 -ep = 0 -qu = 0 -namae = "" -myhp = 0 -begin - conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') - a = "select id, password, name, level, exp, quest from userdata" - ip = conn.exec(a) - ip.each do |row| - if number == row["id"] && pswd == row["password"] - lvl = row["level"] - ep = row["exp"] - qu = row["quest"] - namae = row["name"] - myhp = lvl.to_i * 100 - check = 1 - end - if number == row["id"] && log == "1" - lvl = row["level"] - ep = row["exp"] - qu = row["quest"] - namae = row["name"] - myhp = lvl.to_i * 100 - check = 1 - end - end -end -print"<html> -<head> -<meta http-equiv=\"Content-Type\" content=\"text/html; charset=euc-jp\"> -<title>桼Ͽ</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body>\n" -if check == 0 - print"<h1>Error</h1><p>⤦پǧƤƤ!</p> -<a href=\"login.html\"> -<button class=\"css3button\"></button></a>\n" -elsif check == 1 - print"<h1>λ</h1> -<p><span>Name:</span>#{namae}<br> -<span>Level:</span>#{lvl}<br> -<span>exp:</span>#{ep}</p> -<div class=\"center01\"> -<h1>ȥơ1</h1> -<h2>Ϥޤο</h2> -<img src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"\" title=\"\"> -<form method=\"POST\" action=\"battle.rb\"> -<h1>Ϥޤο</h1> -<p>Ф줷ͦ#{namae}Τ<br> -ͦԤˤμͦϤɬפ<br> -ݤͦԤǤ뤳ȤƤ졪</p> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"100\"></button>\n" - if qu > "0" - print"<h1>¤ο</h1> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"300\"></button>\n" - end - if qu > "1" - print"<h1></h1> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"500\"></button>\n" - end - if qu > "2" - print"<h1>濴--</h1> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"1000\"></button>\n" - end - print"<input type=\"hidden\" name=\"hp\" value=\"#{myhp}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{myhp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{namae}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{number}\"> -<input type=\"hidden\" name=\"count\" value=\"1\">\n" - -end - -print"</form></body> -</html>\n"
--- a/mackey/academy/login.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -#!/usr/bin/ruby -# coding: euc-jp -require 'rubygems' -require 'pg' -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print"Content-type: text/html; charset=utf-8\n\n" - -number = c["id"] -pswd = c["pass"] -log = c["Battle"] -check = 0 -lvl = 0 -ep = 0 -qu = 0 -namae = "" -myhp = 0 -begin - conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') - a = "select id, password, name, level, exp, quest from userdata" - ip = conn.exec(a) - ip.each do |row| - if number == row["id"] && pswd == row["password"] - lvl = row["level"] - ep = row["exp"] - qu = row["quest"] - namae = row["name"] - myhp = lvl.to_i * 100 - check = 1 - end - if number == row["id"] && log == "1" - lvl = row["level"] - ep = row["exp"] - qu = row["quest"] - namae = row["name"] - myhp = lvl.to_i * 100 - check = 1 - end - end -end -print"<html> -<head> -<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> -<title>桼Ͽ</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body>\n" -if check == 0 - print"<h1>Error</h1><p>⤦پǧƤƤ!</p> -<a href=\"login.html\"> -<button class=\"css3button\"></button></a>\n" -elsif check == 1 - print"<h1>λ</h1> -<p><span>Name:</span>#{namae}<br> -<span>Level:</span>#{lvl}<br> -<span>exp:</span>#{ep}</p> -<div class=\"center01\"> -<h1>ƥȥȥơ1</h1> -<h2>Ϥޤο</h2> -<img src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"\" title=\"\"> -<form method=\"POST\" action=\"battle.rb\"> -<h1>Ϥޤο</h1> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"100\"></button>\n" - if qu > "0" - print"<h1>¤ο</h1> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"300\"></button>\n" - end - if qu > "1" - print"<h1></h1> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"500\"></button>\n" - end - if qu > "2" - print"<h1>濴--</h1> -<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"1000\"></button>\n" - end - print"<input type=\"hidden\" name=\"hp\" value=\"#{myhp}\"> -<input type=\"hidden\" name=\"defohp\" value=\"#{myhp}\"> -<input type=\"hidden\" name=\"namae\" value=\"#{namae}\"> -<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> -<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> -<input type=\"hidden\" name=\"id\" value=\"#{number}\"> -<input type=\"hidden\" name=\"count\" value=\"1\">\n" - -end - -print"</form></body> -</html>\n"
--- a/mackey/academy/quest.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>テストクエスト</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1>テストクエスト</h1> -<div class="center01"> -<div> -<img border="1" src="forest.jpg" width="480" height="320" -alt="背景" title="背景"> -<h2>探索しよう!</h2> -<form method="POST" action="battle.rb"> -<button class="css3button" type="submit" name="Battle" value="1">Start</button> -<input type="hidden" name="hp" value="999"> -<input type="hidden" name="thp" value="300"> -<input type="hidden" name="count" value="1"> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/quest.html~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>テストクエスト</title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> - -<body> -<h1>テストクエスト</h1> -<div class="center01"> -<div> -<img border="1" src="forest.jpg" width="480" height="320" -alt="背景" title="背景"> -<h2>探索しよう!</h2> -<form method="POST" action="battle.rb"> -<button class="css3button" type="submit" name="Battle" value="1">Start</button> -<input type="hidden" name="hp" value="999"> -<input type="hidden" name="thp" value="300"> -</form> -</div> -</div> -</body> -</html>
--- a/mackey/academy/read.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> -<title></title> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> -<body> -<div class="center01"> -<img src="ma.png" width="320" height="80"> -<h1>Ϥ</h1> -<p>ΥǤϷηäϤˤʤޤ<br> -Фۤɥ˹Ǥ衪<br> -⤹зμƤ<br> -⥭饯٥륢åפƤɤɤʤƤ<br> -<br> -Υץ쥤гعٶǤ㤦⡩</p> -<a href="index.html"><button class="css3button">BACK</button></a> -</div> -</body> -</html>
--- a/mackey/academy/readme.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,378 +0,0 @@ - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> - <!-- - Modified from the Debian original for Ubuntu - Last updated: 2014-03-19 - See: https://launchpad.net/bugs/1288690 - --> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <title>Apache2 Ubuntu Default Page: It works</title> - <style type="text/css" media="screen"> - * { - margin: 0px 0px 0px 0px; - padding: 0px 0px 0px 0px; - } - - body, html { - padding: 3px 3px 3px 3px; - - background-color: #D8DBE2; - - font-family: Verdana, sans-serif; - font-size: 11pt; - text-align: center; - } - - div.main_page { - position: relative; - display: table; - - width: 800px; - - margin-bottom: 3px; - margin-left: auto; - margin-right: auto; - padding: 0px 0px 0px 0px; - - border-width: 2px; - border-color: #212738; - border-style: solid; - - background-color: #FFFFFF; - - text-align: center; - } - - div.page_header { - height: 99px; - width: 100%; - - background-color: #F5F6F7; - } - - div.page_header span { - margin: 15px 0px 0px 50px; - - font-size: 180%; - font-weight: bold; - } - - div.page_header img { - margin: 3px 0px 0px 40px; - - border: 0px 0px 0px; - } - - div.table_of_contents { - clear: left; - - min-width: 200px; - - margin: 3px 3px 3px 3px; - - background-color: #FFFFFF; - - text-align: left; - } - - div.table_of_contents_item { - clear: left; - - width: 100%; - - margin: 4px 0px 0px 0px; - - background-color: #FFFFFF; - - color: #000000; - text-align: left; - } - - div.table_of_contents_item a { - margin: 6px 0px 0px 6px; - } - - div.content_section { - margin: 3px 3px 3px 3px; - - background-color: #FFFFFF; - - text-align: left; - } - - div.content_section_text { - padding: 4px 8px 4px 8px; - - color: #000000; - font-size: 100%; - } - - div.content_section_text pre { - margin: 8px 0px 8px 0px; - padding: 8px 8px 8px 8px; - - border-width: 1px; - border-style: dotted; - border-color: #000000; - - background-color: #F5F6F7; - - font-style: italic; - } - - div.content_section_text p { - margin-bottom: 6px; - } - - div.content_section_text ul, div.content_section_text li { - padding: 4px 8px 4px 16px; - } - - div.section_header { - padding: 3px 6px 3px 6px; - - background-color: #8E9CB2; - - color: #FFFFFF; - font-weight: bold; - font-size: 112%; - text-align: center; - } - - div.section_header_red { - background-color: #CD214F; - } - - div.section_header_grey { - background-color: #9F9386; - } - - .floating_element { - position: relative; - float: left; - } - - div.table_of_contents_item a, - div.content_section_text a { - text-decoration: none; - font-weight: bold; - } - - div.table_of_contents_item a:link, - div.table_of_contents_item a:visited, - div.table_of_contents_item a:active { - color: #000000; - } - - div.table_of_contents_item a:hover { - background-color: #000000; - - color: #FFFFFF; - } - - div.content_section_text a:link, - div.content_section_text a:visited, - div.content_section_text a:active { - background-color: #DCDFE6; - - color: #000000; - } - - div.content_section_text a:hover { - background-color: #000000; - - color: #DCDFE6; - } - - div.validator { - } - </style> - </head> - <body> - <div class="main_page"> - <div class="page_header floating_element"> - <img src="/icons/ubuntu-logo.png" alt="Ubuntu Logo" class="floating_element"/> - <span class="floating_element"> - Apache2 Ubuntu Default Page - </span> - </div> -<!-- <div class="table_of_contents floating_element"> - <div class="section_header section_header_grey"> - TABLE OF CONTENTS - </div> - <div class="table_of_contents_item floating_element"> - <a href="#about">About</a> - </div> - <div class="table_of_contents_item floating_element"> - <a href="#changes">Changes</a> - </div> - <div class="table_of_contents_item floating_element"> - <a href="#scope">Scope</a> - </div> - <div class="table_of_contents_item floating_element"> - <a href="#files">Config files</a> - </div> - </div> ---> - <div class="content_section floating_element"> - - - <div class="section_header section_header_red"> - <div id="about"></div> - It works! - </div> - <div class="content_section_text"> - <p> - This is the default welcome page used to test the correct - operation of the Apache2 server after installation on Ubuntu systems. - It is based on the equivalent page on Debian, from which the Ubuntu Apache - packaging is derived. - If you can read this page, it means that the Apache HTTP server installed at - this site is working properly. You should <b>replace this file</b> (located at - <tt>/var/www/html/index.html</tt>) before continuing to operate your HTTP server. - </p> - - - <p> - If you are a normal user of this web site and don't know what this page is - about, this probably means that the site is currently unavailable due to - maintenance. - If the problem persists, please contact the site's administrator. - </p> - - </div> - <div class="section_header"> - <div id="changes"></div> - Configuration Overview - </div> - <div class="content_section_text"> - <p> - Ubuntu's Apache2 default configuration is different from the - upstream default configuration, and split into several files optimized for - interaction with Ubuntu tools. The configuration system is - <b>fully documented in - /usr/share/doc/apache2/README.Debian.gz</b>. Refer to this for the full - documentation. Documentation for the web server itself can be - found by accessing the <a href="/manual">manual</a> if the <tt>apache2-doc</tt> - package was installed on this server. - - </p> - <p> - The configuration layout for an Apache2 web server installation on Ubuntu systems is as follows: - </p> - <pre> -/etc/apache2/ -|-- apache2.conf -| `-- ports.conf -|-- mods-enabled -| |-- *.load -| `-- *.conf -|-- conf-enabled -| `-- *.conf -|-- sites-enabled -| `-- *.conf - </pre> - <ul> - <li> - <tt>apache2.conf</tt> is the main configuration - file. It puts the pieces together by including all remaining configuration - files when starting up the web server. - </li> - - <li> - <tt>ports.conf</tt> is always included from the - main configuration file. It is used to determine the listening ports for - incoming connections, and this file can be customized anytime. - </li> - - <li> - Configuration files in the <tt>mods-enabled/</tt>, - <tt>conf-enabled/</tt> and <tt>sites-enabled/</tt> directories contain - particular configuration snippets which manage modules, global configuration - fragments, or virtual host configurations, respectively. - </li> - - <li> - They are activated by symlinking available - configuration files from their respective - *-available/ counterparts. These should be managed - by using our helpers - <tt> - <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2enmod">a2enmod</a>, - <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2dismod">a2dismod</a>, - </tt> - <tt> - <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2ensite">a2ensite</a>, - <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2dissite">a2dissite</a>, - </tt> - and - <tt> - <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2enconf">a2enconf</a>, - <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2disconf">a2disconf</a> - </tt>. See their respective man pages for detailed information. - </li> - - <li> - The binary is called apache2. Due to the use of - environment variables, in the default configuration, apache2 needs to be - started/stopped with <tt>/etc/init.d/apache2</tt> or <tt>apache2ctl</tt>. - <b>Calling <tt>/usr/bin/apache2</tt> directly will not work</b> with the - default configuration. - </li> - </ul> - </div> - - <div class="section_header"> - <div id="docroot"></div> - Document Roots - </div> - - <div class="content_section_text"> - <p> - By default, Ubuntu does not allow access through the web browser to - <em>any</em> file apart of those located in <tt>/var/www</tt>, - <a href="http://httpd.apache.org/docs/2.4/mod/mod_userdir.html">public_html</a> - directories (when enabled) and <tt>/usr/share</tt> (for web - applications). If your site is using a web document root - located elsewhere (such as in <tt>/srv</tt>) you may need to whitelist your - document root directory in <tt>/etc/apache2/apache2.conf</tt>. - </p> - <p> - The default Ubuntu document root is <tt>/var/www/html</tt>. You - can make your own virtual hosts under /var/www. This is different - to previous releases which provides better security out of the box. - </p> - </div> - - <div class="section_header"> - <div id="bugs"></div> - Reporting Problems - </div> - <div class="content_section_text"> - <p> - Please use the <tt>ubuntu-bug</tt> tool to report bugs in the - Apache2 package with Ubuntu. However, check <a - href="https://bugs.launchpad.net/ubuntu/+source/apache2">existing - bug reports</a> before reporting a new bug. - </p> - <p> - Please report bugs specific to modules (such as PHP and others) - to respective packages, not to the web server itself. - </p> - </div> - - - - - </div> - </div> - <div class="validator"> - <p> - <a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" /></a> - </p> - </div> - </body> -</html> -
--- a/mackey/academy/style.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -.main { - width: 100%; - border: 1px solid #000; -} -.main div { - width: 80%; - border: 1px solid #FF0000; - margin: 0 auto; -} -button.css3button{ - font-family: Arial, Helvetica, sans-serif; - font-size: 14px; - color: #ffffff; - padding: 10px 20px; - background: -moz-linear-gradient( - top, - #a3a3a3 0%, - #3b3b3b 50%, - #242424 50%, - #000000); - background: -webkit-gradient( - linear, left top, left bottom, - from(#a3a3a3), - color-stop(0.50, #3b3b3b), - color-stop(0.50, #242424), - to(#000000)); - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - border-radius: 10px; - border: 1px solid #000000; - -moz-box-shadow: - 0px 1px 3px rgba(000,000,000,0.5), - inset 0px 0px 1px rgba(255,255,255,0.6); - -webkit-box-shadow: - 0px 1px 3px rgba(000,000,000,0.5), - inset 0px 0px 1px rgba(255,255,255,0.6); - box-shadow: - 0px 1px 3px rgba(000,000,000,0.5), - inset 0px 0px 1px rgba(255,255,255,0.6); - text-shadow: - 0px -1px 0px rgba(000,000,000,1), - 0px 1px 0px rgba(255,255,255,0.2); -} -.center01 { - max-width:600px; - margin:0 auto; -} -span { -display: inline-block; -width: 7em; -} \ No newline at end of file
--- a/mackey/academy/style.css~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -.main { - width: 100%; - border: 1px solid #000; -} -.main div { - width: 80%; - border: 1px solid #FF0000; - margin: 0 auto; -} -button.css3button{ - font-family: Arial, Helvetica, sans-serif; - font-size: 14px; - color: #ffffff; - padding: 10px 20px; - background: -moz-linear-gradient( - top, - #a3a3a3 0%, - #3b3b3b 50%, - #242424 50%, - #000000); - background: -webkit-gradient( - linear, left top, left bottom, - from(#a3a3a3), - color-stop(0.50, #3b3b3b), - color-stop(0.50, #242424), - to(#000000)); - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - border-radius: 10px; - border: 1px solid #000000; - -moz-box-shadow: - 0px 1px 3px rgba(000,000,000,0.5), - inset 0px 0px 1px rgba(255,255,255,0.6); - -webkit-box-shadow: - 0px 1px 3px rgba(000,000,000,0.5), - inset 0px 0px 1px rgba(255,255,255,0.6); - box-shadow: - 0px 1px 3px rgba(000,000,000,0.5), - inset 0px 0px 1px rgba(255,255,255,0.6); - text-shadow: - 0px -1px 0px rgba(000,000,000,1), - 0px 1px 0px rgba(255,255,255,0.2); -} -.center01 { - max-width:600px; - margin:0 auto; -} \ No newline at end of file
--- a/mackey/academy/test.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 - -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print "Content-type: text/html; charset=utf-8\n\n" - -check = c["answer"] -quiznum = c["dat"] - -srand -number=rand(1060) -num = 0 -damage = "" -quiz = "" -ansone = "" -anstwo = "" -ansthi = "" -ansfou = "" -anstrue = "" -open("data.txt", "r:utf-8") do |list| - while line = list.gets - if /(\d+),(\S+),(\S+),(\S+),(\S+),(\S+),(\d)/ =~ line - if quiznum.to_i == $1.to_i - if check.to_i == $7.to_i - damage = "攻撃成功!" - else - damage = "攻撃失敗!" - end - end - if number.to_i == $1.to_i - num = $1.to_i - quiz = $2.to_s - ansone = $3.to_s - anstwo = $4.to_s - ansthi = $5.to_s - ansfou = $6.to_s - anstrue = $7.to_i - end - end - end -end - - - -printf("<html> -<head> -<title>きみのこうげきだよ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>きみのこうげきだよ</h1> -<h2>#{damage}</h2> -<p>No.#{number}</p> -<div class=\"main\"> -<div> -<img border=\"1\" src=\"maou.png\" width=\"480\" height=\"320\" -alt=\"まおうのがぞうっぽいよ\" title=\"まおう\"> - -<h2>問題</h2> -<p>%s</p> - -<form method=\"POST\" action=\"ans.rb\"> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"1\">%s</bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"2\">%s</bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"3\">%s<br></bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"4\">%s<br></bu\ -tton> -<input type=\"hidden\" name=\"dat\" value=\"%d\"> -</form> -</div> -</div> -</body> -</html>", quiz, ansone, anstwo, ansthi, ansfou, num)
--- a/mackey/academy/test.rb~ Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -#!/usr/bin/ruby -# coding: utf-8 - -require 'cgi' -c = CGI.new(:accept_charset => "utf-8") -print "Content-type: text/html; charset=utf-8\n\n" - -check = c["answer"] -quiznum = c["dat"] - -srand -number=rand(1060) -num = 0 -damage = "" -quiz = "" -ansone = "" -anstwo = "" -ansthi = "" -ansfou = "" -anstrue = "" -open("data.txt", "r:utf-8") do |list| - while line = list.gets - if /(\d+),(\S+),(\S+),(\S+),(\S+),(\S+),(\d)/ =~ line - if quiznum.to_i == $1.to_i - if check.to_i == $7.to_i - damage = "攻撃成功!" - else - damage = "攻撃失敗!" - end - end - if number.to_i == $1.to_i - num = $1.to_i - quiz = $2.to_s - ansone = $3.to_s - anstwo = $4.to_s - ansthi = $5.to_s - ansfou = $6.to_s - anstrue = $7.to_i - end - end - end -end - - - -printf("<html> -<head> -<title>きみのこうげきだよ!</title> -<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> -</head> -<body> -<h1>きみのこうげきだよ</h1> -<h2>#{damage}</h2> -<p>No.#{number}</p> -<div class=\"main\"> -<div> -<img border=\"1\" src=\"maou.png\" width=\"480\" height=\"320\" -alt=\"まおうのがぞうっぽいよ\" title=\"まおう\"> - -<h2>問題</h2> -<p>%s</p> - -<form method=\"POST\" action=\"ans.rb\"> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"1\">%s</bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"2\">%s</bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"3\">%s<br></bu\ -tton> -<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"4\">%s<br></bu\ -tton> -<input type=\"hidden\" name=\"dat\" value=\"%d\"> -</form> -</div> -</div> -</body> -</html>", quiz, ansone, anstwo, ansthi, ansfou, num)
--- a/oasis2015/#gets.rb# Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding:utf-8 -*- - -require 'sqlite3' -require 'cgi' - -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("sql/main.sq3") - -id = c.cookies["id"][0] -person = id.to_i - -data = "select * from test where id = ?" -cook = db.execute(data, person) -upd = "update test set pt = ? where id = ?" -goods = "update goods set g1 = ?, g2 = ?, g3 = ?, g4 = ?, g5 = ?, g6 = ? where id = ?" - - -name = cook[0][1] -pt = cook[0][7] -lv = cook[0][8] - -ticket = "select * from goods where id = ?" -have = db.execute(ticket, person) -g1 = have[0][1] -g2 = have[0][2] -g3 = have[0][3] -g4 = have[0][4] -g5 = have[0][5] -g6 = have[0][6] - -gets = c["sho"] -c1 = 10 #商品それぞれに対して消費するポイント -c2 = 6 -c3 = 8 -c4 = 2 -c5 = 5 -c6 = 100 -n1 = "オランダせんべい" #商品それぞれの名前 -n2 = "温ビール" -n3 = "ハンドクリーム" -n4 = "" - -h1 = "チケットを発行したよ!<br>海洋センター3階でスタッフの人と商品をこうかんしてね!" -if lv < 3 - h1 = "チケット発行できません!" - kekka = "レベル が たりないよ!" -elsif gets == "s1" && pt >= c1 - g1 += 1 - pt -= c1 - kekka = "#{n1}交換券をゲット!" -elsif gets == "s2" && pt >= c2 - g2 += 1 - pt -= c2 - kekka = "#{n2}交換券をゲット!" -elsif gets == "s3" && pt >= c3 - g3 += 1 - pt -= c3 - kekka = "#{n3}交換券をゲット!" -elsif gets == "s4" && pt >= c4 - g4 += 1 - pt -= c4 - kekka = "あめ交換券をゲット!" -elsif gets == "s5" && pt >= c5 - g5 += 1 - pt -= c5 - kekka = "10円金券をゲット!" -elsif gets == "s6" && pt >= c6 - g6 += 1 - pt -= c6 - kekka = "まぐろ交換券をゲット!" -else - h1 = "チケット発行できません!!" - kekka = "ポイントとかたりません!" -end - -trade = c["trade"] -if trade == n1 && g1 > 0 - g1 -= 1 - kekka = "#{n1} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" - h1 = "#{n1}と交換します!<br>こぼさないで たべてね!" -elsif trade == n2 && g2 > 0 - g2 -= 1 - kekka = "#{n2} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、年齢を確認してから交換してください!" - h1 = "#{n2} と交換します!<br>ひやしてから おうち で のんでね!" -elsif trade == n3 && g3 > 0 -g3 -= 1 -kekka = "#{n3} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" - h1 = "#{n3}と交換します!" -elsif trade == n4 && g4 > 0 -g4 -= 1 -kekka = "あめ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" -h1 = "あめと交換します!" -elsif trade == "10えん金券" && g5 > 0 -g5 -= 1 -kekka = " 10えん と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" -h1 = "10えんと交換します!" -elsif trade == "まぐろ" && g6 > 0 -g6 -= 1 -kekka = "まぐろ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" -h1 = "まぐろと交換します!" -end - - - - - -db.execute(goods, g1, g2, g3, g4, g5, g6, person) -db.execute(upd, pt, person) - - -pre = "%" -printf(<<_EOS_, h1, name, pt, kekka, g1, g2, g4) - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" -content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" -type="text/css" rel="stylesheet" /> - -<link rel="shortcut icon" href="./img/tsuya.png"/> -<title>こうかん!</title> -<style type="text/css"> -<!-- ---> -</style> - -</head> - -<body> -<header></header> -<h1>さかたっち</h1> -<h2>%s</h2> -<p> -%sさん<br> -さかたポイント:%dp<br> -%s -</p> -<table> -<title>もっているチケット</title> -<tr><td> -オランダせんべい</td><td>:%d</td></tr><tr><td> -温ビール</td><td>:%d</td></tr><tr><td> -secret[3~/td><td>:%d</td></tr><tr><td> -</td><td></td></tr><tr><td> -</td><td></td></tr> -</table> -<br><br> -<div class="f1"><a href="prof.rb"><div class="lets"><span>もどる!</span></div></a></div> -<br><br> -<form method="POST" action="gets.rb"> -<input type="text" name="trade" placeholder="ここは スタッフ の 人 が つかうよ!"> -<input type="submit" value="スタッフ ぼたん"><br>スタッフじゃない人はおさないでね! -</form> - -<footer></footer> -</body> -</html> - - -_EOS_
--- a/oasis2015/.htaccess Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -AddHandler cgi-script .rb -AddType "text/html; charset=UTF-8" .rb -AddType "text/html; charset=UTF-8" .html -Options +ExecCGI
--- a/oasis2015/accountcheck.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding: utf-8 -*- - -require 'sqlite3' -require 'kconv' -require 'cgi' - -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("sql/main.sq3") - - -sql = "insert into test values(?, ?, ?, ?, ?, ?, ?, ?, ?)" - -toi = "insert into toi values (?, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)" -item = "insert into goods values (?, 0, 0, 0, 0, 0, 0)" - -name = c["name"] - -cle1 = "CREATE TABLE IF NOT EXISTS test(id, name, cal, age, sex, aria, exp, pt, lv)" -cle2 = "CREATE TABLE IF NOT EXISTS toi(id, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10)" -cle3 = "CREATE TABLE IF NOT EXISTS goods(id, g1, g2, g3, g4, g5, g6)" -cle4 = "CREATE TABLE IF NOT EXISTS time(cd, now, id)" -cle5 = "CREATE TABLE IF NOT EXISTS num(cd, id)" -cle6 = "CREATE TABLE IF NOT EXISTS pass(id, pass, name)" - -ins4 = 'insert into time values(?, 61, "n")' -ins5 = 'insert into num values("aa",0)' -ins6 = 'insert into pass values(?, ?, ?)' -num = "select id from num where cd = ?" -numup = "update num set id = ? where cd = ?" - -db.execute(cle1) -db.execute(cle2) -db.execute(cle3) -db.execute(cle4) -db.execute(cle5) -db.execute(cle6) -if name == "createman789789789" -db.execute(ins4, "a") -db.execute(ins4, "b") -db.execute(ins4, "c") -db.execute(ins4, "d") -db.execute(ins4, "e") -db.execute(ins4, "f") -db.execute(ins4, "g") -db.execute(ins4, "h") -db.execute(ins4, "i") -db.execute(ins4, "j") -db.execute(ins5) -end - -name = c["name"] -namae = "#{name}" -cal = c["cal"] -age = c["age"] -sex = c["sex"] -aria = c["aria"] - -id = c.cookies["id"][0] -pass = c.cookies["pass"][0] - -if id == nil -# srand -# id = rand(1000) - number = db.execute(num, "aa") - id = number[0][0].to_i + 1 - exp = 0 - pt = 0 - lv = 1 - cd = "aa" - if pass == nil - pass = id - end - db.execute(ins6, id, pass, name) - db.execute(sql, id, name, cal, age, sex, aria, exp, pt, lv) - db.execute(toi, id) - db.execute(item, id) - db.execute(numup, id, cd) -end -# srand(id.to_i) -# id2 = rand(1000000) -id2 = pass - - - -expires = "SAT, 2 Apr 2016 00:00:00 GMT" - -printf("Content-type: text/html; charset=UTF-8 -Set-Cookie:id=%s ;expires=%s -Set-Cookie:pass=%s ;expires=%s\n\n", id, expires, id2, expires) - - -printf(<<_EOS_, name, id.to_i) -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" type="text/css" rel="stylesheet" /> - - - - -<link rel="shortcut icon" href="./img/cabage.png"/> -<title>Registering Account</title> - -</head> -<body> -<h1>さかたっち</h1> -<h2>登録が完了しました!</h2> -<p>ようこそ_ %s _さん!</p> -<p>あなたのIDは%04dです!</p> -<div class="f1"><a href="prof.rb"><div class="lets"><span>始めよう!</span></div></a></div> -<form method="POST" type="text"> -</form> -</body></html> -_EOS_ - - -if name == "createman987987987" - `rm sql/main.sq3` -# `touch sql/main.sq3` -# `chmod a+w sql/main.sq3` -end
--- a/oasis2015/admin/#check.rb# Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding: utf-8 -*- -require 'cgi' -require 'sqlite3' -require 'kconv' -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("../sql/main.sq3") - -getAC1 = ARGV[0] -pass = "hogehogeboy" - -hsh = c["SQ1"] -hsh += c["SQ2"] - -pts = "<table><tr><th>id</th><td>name</td><td>cal</td><td>age</td><td>sex</td><td>aria</td><td>exp</td><td>pt</td><td>lv</td></tr>" - - -if c["SQ2"] == "toi" -pts = "<table><tr><th>id</th><td>q1</td><td>q2</td><td>q3</td><td>q4</td><td>q5</td><td>q6</td><td>q7</td><td>q8</td><td>q9</td><td>secret</td></tr>" -elsif c["SQ2"] == "time" -pts = "<table><tr><th>cd</th><td>now</td><td>id</td></tr>" -elsif c["SQ2"] == "goods" -pts = "<table><tr><th>id</th><td>おちゃ</td><td>しょうひん2</td><td>しょうひん3</td><td>しょうひん4</td><td>しょうひん5</td><td>しょうひん6</td></tr>" -elsif c["SQ2"] == "pass" -pts = "<table><tr><th>id</th><td>pass</td><td>name</td></tr>" - -end - - -###################################### -################SQ3################### -if c["SQ3"] == "" -else -upd = c["SQ3"] -db.execute(upd) -end - -################SQ3################### -###################################### - - - - -################################ -################################ -if hsh == "" -# pts = "hoge" - hsh = "select * from test" -else -end - -hsh2 = db.execute(hsh) -i = 0 -while i < hsh2.length - data = hsh2[i] - if c["SQ2"] == "toi" - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td><td>#{data[10]}</td></tr>" - elsif c["SQ2"] == "time" - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td></tr>" - elsif c["SQ2"] == "goods" - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td></tr>" - else - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td></tr>" - end - i += 1 -end -#end -pts += "</table>" - - -print"Content-type: text/html; charset=UTF-8\n\n" - - -###################################### -################if ~html############## - -#if getAC1 == pass - -printf(<<_EOS_, pts, hsh2.lenght) -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="../smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="../profeel.css" -type="text/css" rel="stylesheet" /> - -<link rel="shortcut icon" href="../img/tamago.png"/> - -<title>control</title> -<style type="text/css"> -<!-- ---> -</style> -</head> - -<body> -<header><p>test,toi,goods,time,num,pass<p></header> - - - -<h1>control</h1> -<form method="POST" action="check.rb?#{pass}"> -<input type="text" name="SQ1" value="select * from "> -<input type="text" name="SQ2" placeholder='test JOIN pass ON test.id==pass.id;' value="test"> -<input type="submit"> -</form> - -<form method="POST" action="check.rb?#{pass}"> -<input type="text" name="SQ3" size="42" placeholder='insert into test values(501, "foo", "inu", 40, "G", "sakata", 0,0,1)' value="update test set pt = 0 where id = 0"> -<input type="submit"> -</form> -<p>%s<br></p> - - -<address>skip@xxxx.co.jp</address> -<footer></footer> -</body> -</html> - -_EOS_ -############################################# -############################################# -#else -if getAC1 == "hoge" ###いらない行。accをつける前は"else"のみだった。 -printf(<<_EOS_) -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html><head> -<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="../smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="../profeel.css" -type="text/css" rel="stylesheet" /> -<link rel="shortcut icon" href="./img/tamago.png"/> -<title>さかたっち(go top!)</title> -<style type="text/css"> -</style></head> -<body><header></header> -<h1>さかたっち</h1> -<a href="../index.html">トップへ!</a> -<address>skip@xxxx.co.jp</address> -<footer></footer></body> -</html> -_EOS_ -end
--- a/oasis2015/admin/.htaccess Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -AddHandler cgi-script .rb -AddType "text/html; charset=utf-8" .rb -AddType "text/html; charset=utf-8" .html -Options +ExecCGI -AuthUserFile /home/www/skip/oasis2015/admin/.htpasswd -#AuthUserFile /home/irhome/c113/c113007/public_html/web/oasis2015/admin/.htpasswd#royでページを動かしたいとき用 -AuthGroupFile /dev/null -AuthName "splatoon! piyopiyogirl" -AuthType Basic -require valid-user
--- a/oasis2015/admin/.htpasswd Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -c113007:QRf28ARYqd/FY
--- a/oasis2015/admin/check.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding: utf-8 -*- -require 'cgi' -require 'sqlite3' -require 'kconv' -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("../sql/main.sq3") - -getAC1 = ARGV[0] -pass = "hogehogeboy" - -hsh = c["SQ1"] -hsh += c["SQ2"] - -pts = "<table><tr><th>id</th><td>name</td><td>cal</td><td>age</td><td>sex</td><td>aria</td><td>exp</td><td>pt</td><td>lv</td></tr>" - - -if c["SQ2"] == "toi" -pts = "<table><tr><th>id</th><td>q1</td><td>q2</td><td>q3</td><td>q4</td><td>q5</td><td>q6</td><td>q7</td><td>q8</td><td>q9</td><td>secret</td></tr>" -elsif c["SQ2"] == "time" -pts = "<table><tr><th>cd</th><td>now</td><td>id</td></tr>" -elsif c["SQ2"] == "goods" -pts = "<table><tr><th>id</th><td>おちゃ</td><td>しょうひん2</td><td>しょうひん3</td><td>しょうひん4</td><td>しょうひん5</td><td>しょうひん6</td></tr>" -elsif c["SQ2"] == "pass" -pts = "<table><tr><th>id</th><td>pass</td><td>name</td></tr>" - -end - - -###################################### -################SQ3################### -if c["SQ3"] == "" -else -upd = c["SQ3"] -db.execute(upd) -end - -################SQ3################### -###################################### - - - - -################################ -################################ -if hsh == "" -# pts = "hoge" - hsh = "select * from test" -else -end - -hsh2 = db.execute(hsh) -i = 0 -while i < hsh2.length - data = hsh2[i] - if c["SQ2"] == "toi" - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td><td>#{data[10]}</td></tr>" - elsif c["SQ2"] == "time" - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td></tr>" - elsif c["SQ2"] == "goods" - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td></tr>" - else - pts += "<tr><th>#{data[0]}</th><td>#{data[1]}</td><td>#{data[2]}</td><td>#{data[3]}</td><td>#{data[4]}</td><td>#{data[5]}</td><td>#{data[6]}</td><td>#{data[7]}</td><td>#{data[8]}</td><td>#{data[9]}</td></tr>" - end - i += 1 -end -#end -pts += "</table>" - - -print"Content-type: text/html; charset=UTF-8\n\n" - -sum=hsh2.length -###################################### -################if ~html############## - -#if getAC1 == pass - -printf(<<_EOS_, sum , pts) -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="../smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="../profeel.css" -type="text/css" rel="stylesheet" /> - -<link rel="shortcut icon" href="../img/tamago.png"/> - -<title>control</title> -<style type="text/css"> -<!-- ---> -</style> -</head> - -<body> -<header><p>test,toi,goods,time,num,pass,%s<p></header> - - - -<h1>control</h1> -<form method="POST" action="check.rb?#{pass}"> -<input type="text" name="SQ1" value="select * from "> -<input type="text" name="SQ2" placeholder='test JOIN pass ON test.id==pass.id;' value="test"> -<input type="submit"> -</form> - -<form method="POST" action="check.rb?#{pass}"> -<input type="text" name="SQ3" size="42" placeholder='insert into test values(501, "foo", "inu", 40, "G", "sakata", 0,0,1)' value="update test set pt = 0 where id = 0"> -<input type="submit"> -</form> -<p>%s<br></p> - - -<address>skip@xxxx.co.jp</address> -<footer></footer> -</body> -</html> - -_EOS_ -############################################# -############################################# -#else -if getAC1 == "hoge" ###いらない行。accをつける前は"else"のみだった。 -printf(<<_EOS_) -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html><head> -<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="../smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="../profeel.css" -type="text/css" rel="stylesheet" /> -<link rel="shortcut icon" href="./img/tamago.png"/> -<title>さかたっち(go top!)</title> -<style type="text/css"> -</style></head> -<body><header></header> -<h1>さかたっち</h1> -<a href="../index.html">トップへ!</a> -<address>skip@xxxx.co.jp</address> -<footer></footer></body> -</html> -_EOS_ -end
--- a/oasis2015/admin2/.htaccess Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -AddHandler cgi-script .rb -AddType "text/html; charset=utf-8" .rb -AddType "text/html; charset=utf-8" .html -Options +ExecCGI -AuthUserFile /home/www/skip/2014OC/admin/.htpasswd -AuthGroupFile /dev/null -AuthName "ǧڥ" -AuthType Basic -require valid-user
--- a/oasis2015/admin2/.htpasswd Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -Murakami:7Y005Wtya7Ogw -test:tebUY14UFwMKg
--- a/oasis2015/admin2/drawLots.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> -<title>Database delete</title> -</style> -<link rel="stylesheet" type="text/css" href="design.css"> -</head> - -<body> -<h1>抽選用ページ</h1> -<p>実行するとデータベースが書き変えられます。</p> -<p>実行する際は注意してください。</p> -<form method="POST" action="./drawLots.rb"> -<p>抽選を行いますか?<br> -はい<input type="radio" name="check" value="OK"> -いいえ<input type="radio" name="check" value="NO"> -</p> -<input type="submit" value="抽選"> -<input type="reset" value="リセット"> -</form> -<p><a href="monitor.rb">データ閲覧ページに戻る</a></p> -</body> -</html>
--- a/oasis2015/admin2/drawLots.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -#!/usr/bin/env ruby -# -*- coding: utf-8 -*- - -require 'sqlite3' -require 'cgi' -require 'date' - -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("../sql/stamp.sq3") - -add = ENV["REMOTE_ADDR"] - -if /^(172\.19\.5\.|172\.17\.54\.|172\.21\.90\.)|118.21.142.107|202.214.125.107|192.168.43.255/ =~ add -check = c['check'] - -printf("Content-type: text/html; charset=UTF-8\n\n") - -sum = 'SELECT SUM(rank) FROM main WHERE NOT id=1;' -rank_sum = db.execute(sum).flatten(2)[0].to_i - -t = Time.now -expires = Time.local(2014, 8, 17, 8, 50) -expires2 = Time.local(2014, 10, 25, 0, 00) -if t > expires && t < expires2 && rank_sum == 0 -else - check = "" - puts check -end - -if check == "OK" - begin - result = db.execute("select id,exp,rank from main;") - rescue - exit - end - all = Array.new - for id,lv,rank in result - if id == 1 || lv == 0 || rank.to_i != 0 - next - end - lv.to_i.times do - all << id - end - end - - tousen = Array.new(0) - atari1 = rand(all.length) - tousen << all[atari1] - all.delete_if {|x| x == tousen[0]} - - sql = "update main set rank = 1 where id = ?;" - db.execute(sql,tousen[0]) - - sql = "update main set rank = 2 where id = ?;" - while tousen.length < 4 - srand - atari2 = rand(all.length) - hoge = all[atari2] - tousen << all[atari2] - all.delete_if {|x| x == hoge} - db.execute(sql,hoge) - end - - i=0 - - printf("<p>1等はIDが%04dの方!おめでとー!</p>\n",tousen[i].to_i-1) - printf("<p>2等はIDが%04dと%04dと%04dの方!おめでとー!</p>\n",tousen[i+=1].to_i-1,tousen[i+=1].to_i-1,tousen[i+=1].to_i-1) -else - print"<p>抽選はまだ行いませんよ</p>\n" -end -print'<p><a href="drawLots.html">抽選ページに戻る</a></p> -<p><a href="monitor.rb">データ閲覧ページに戻る</a></p> -' -else - printf("Content-type: text/html; charset=UTF-8\n\n") - - printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h -tml4/strict.dtd"> -<html> -<head> -<title>Delete table</title> -<link rel="stylesheet" type="text/css" href="design.css"> -</head> -</body> -<p>管理者用ページのため閲覧できません。</p>' -end -print'</body></html>'
--- a/oasis2015/admin2/monitor.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -#!/usr/bin/env ruby -#coding:utf-8 - -require'cgi' -require'sqlite3' - -db = SQLite3::Database.new("../sql/stamp.sq3") - -c = CGI.new(:accept_charaset => "UTF-8") - -add = ENV["REMOTE_ADDR"] - -if /^(172\.19\.5\.|172\.17\.54\.|172\.21\.90\.)|118.21.142.107|202.214.125.107/ =~ add -rank = c["rank"] -flag = 0 -text = "<p>登録者一覧を表示します</p>\n" -begin - if rank == "y" - rank_reset = 'UPDATE main SET rank=0 WHERE NOT id=1;' - db.execute(rank_reset) - end - result = db.execute("select * from main;") - log = 'select * from logs;' - logs = db.execute(log) -rescue - flag = 1 - text = "<p>データがありません</p>\n" -end - -#rank = "n" - -printf("Content-type: text/html; charset=UTF-8\n\n") - -printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h -tml4/strict.dtd"> -<html> -<head> -<meta http-equiv="refresh" content="180;http://skip.koeki-prj.org/2014OC/admin/monitor.rb"> -<title>Delete table</title> -</head> -</body> -<h1>データ閲覧ページ</h1>' -puts text -if flag == 1 -else - print"<table border = 1>\n" - result.each do |line| - printf("<tr><td>%04d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",line[0].to_i-1,line[1],line[2],line[3],line[4],line[8],line[9]) - end - print'</table>' - print'<p><form method="POST" action="./monitor.rb"> -rankをリセットしますか?<br> -NO <input name="rank" type="radio" value="n" checked="checked"> / -YES <input name="rank" type="radio" value="y"><br> -<input type="submit" value="submit"> -</form></p> -' -end - -print'<h1>ログの閲覧</h1>' -if flag == 1 -else - print'<marquee direction=up hspace=50 scrolldelay=1 loop=1 scrollamount=1000 behavior="slide" width=500 height=200><table style="margin=0;">' - logs.each do |line| - hour = line[3].to_i/3600 - min = line[3].to_i%3600/60 - sec = line[3].to_i%3600%60 - printf("<tr><td width=50px>%s</td><td width=50px>%04d</td><td width=100px>%s</td><td width=100px>%d:%d:%d</td></tr>\n",line[0],line[1].to_i-1,line[2],hour,min,sec) - end - print"</table></marquee>" - print'<h1>その他の操作</h1> -<table border="1"> -<tr><th>データ削除</th><td><a href="operation.html">DELETE</a></td></tr> -<tr><th>抽選</th><td><a href="drawLots.html">DRAW</a></td></tr> -</table> -' -end -else - printf("Content-type: text/html; charset=UTF-8\n\n") - - printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h -tml4/strict.dtd"> -<html> -<head> -<title>Delete table</title> -</head> -</body> -<p>管理者用ページのため閲覧できません。</p>' -end - -print'</body></html>'
--- a/oasis2015/admin2/operation.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> -<title>Database delete</title> -</style> -<link rel="stylesheet" type="text/css" href="design.css"> -</head> - -<body> -<h1>データベース消去用</h1> -<p>実行するとデータベースが削除されます。</p> -<p>実行する際は注意してください。</p> -<form method="POST" action="./operation.rb"> -<p>本当に消しますか?<br> -はい<input type="radio" name="check" value="OK"> -いいえ<input type="radio" name="check" value="NO"> -</p> -<input type="submit" value="削除"> -<input type="reset" value="リセット"> -</form> -<p><a href="monitor.rb">データ閲覧ページに戻る</a></p> - -<address>c111126@g.koeki-u.ac.jp</address> - -</body> -</html>
--- a/oasis2015/admin2/operation.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -#!/usr/bin/env ruby -# -*- coding: utf-8 -*- - -require 'sqlite3' -require 'cgi' - -db = SQLite3::Database.new("../sql/stamp.sq3") -c = CGI.new(:accept_charaset => "UTF-8") - -add = ENV["REMOTE_ADDR"] - -printf("Content-type: text/html; charset=UTF-8\n\n") - -if /^(172\.19\.5\.|172\.17\.54\.|172\.21\.90\.)|118.21.142.107|202.214.125.107/ =~ add -check = c['check'] -if check == "OK" - begin - db.execute("drop table main;") - db.execute("drop table logs;") - text = "<p>データを削除しました。</p>" - rescue - text = "<p>データがありません。</p>" - end -else - text = "データは削除されません" -end - -printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"> -<html> -<head> -<title>Delete table</title> -<link rel=\"stylesheet\" type=\"text/css\" href=\"design.css\"> -</head> -</body> -%s -<p><a href=\"monitor.rb\">データ閲覧ページへ</a></p> -<p></p> -</body></html> -", text) -print"<p><a href=\"monitor.rb\">データ閲覧ページに戻る</a></p>" -print"<p><a href=\"opration.html\">削除ページに戻る</a></p>" -else - printf'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/h -tml4/strict.dtd"> -<html> -<head> -<title>Delete table</title> -<link rel="stylesheet" type="text/css" href="design.css"> -</head> -</body> -<p>管理者用ページのため閲覧できません。</p>' -end
--- a/oasis2015/cookie.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding: utf-8 -*- - -require 'sqlite3' -require 'kconv' -require 'cgi' - -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("sql/main.sq3") - -id = c.cookies["id"][0] -id = nil -expires = Time.now + 1 -if id == nil -end - - -printf("Content-type: text/html; charset=UTF-8 -Set-Cookie:id=%s ;expires=%s\n\n", id, expires) - -printf(<<_EOS_) -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head> -<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" type="text/css" rel="stylesheet" /> -<link rel="shortcut icon" href="./img/cabage.png"/> -<title>Registering Account</title> -</head> -<body> -<h1>さかたっち</h1> -<h2>cookieを削除しました!</h2> -<a href="index.html">とうろくがめんへ!</a> -</body></html> -_EOS_
--- a/oasis2015/deletetest.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -#!/usr/koeki/bin/ruby -# -*- coding: utf-8 -*- - -`cp sql/tsback.sq3 sql/arere.sq3`
--- a/oasis2015/gets.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding:utf-8 -*- - -require 'sqlite3' -require 'cgi' - -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("sql/main.sq3") - -id = c.cookies["id"][0] -person = id.to_i - -data = "select * from test where id = ?" -cook = db.execute(data, person) -upd = "update test set pt = ? where id = ?" -goods = "update goods set g1 = ?, g2 = ?, g3 = ?, g4 = ?, g5 = ?, g6 = ? where id = ?" - - -name = cook[0][1] -pt = cook[0][7] -lv = cook[0][8] - -ticket = "select * from goods where id = ?" -have = db.execute(ticket, person) -g1 = have[0][1] -g2 = have[0][2] -g3 = have[0][3] -g4 = have[0][4] -g5 = have[0][5] -g6 = have[0][6] - -gets = c["sho"] -c1 = 8 #商品それぞれに対して消費するポイント -c2 = 4 -c3 = 6 -c4 = 2 -c5 = 5 -c6 = 100 -n1 = "オランダせんべい" #商品それぞれの名前 -n2 = "ビール" -n3 = "ハンドソープ" -n4 = "" - - -h1 = "チケットを発行したよ!<br>海洋センター3階でスタッフの人と商品をこうかんしてね!" -if lv < 3 - h1 = "チケット発行できません!" - kekka = "レベル が たりないよ!" -elsif gets == "s1" && pt >= c1 - g1 += 1 - pt -= c1 - kekka = "#{n1}交換券をゲット!" -elsif gets == "s2" && pt >= c2 - g2 += 1 - pt -= c2 - kekka = "#{n2}交換券をゲット!" -elsif gets == "s3" && pt >= c3 - g3 += 1 - pt -= c3 - kekka = "#{n3}交換券をゲット!" -elsif gets == "s4" && pt >= c4 - g4 += 1 - pt -= c4 - kekka = "あめ交換券をゲット!" -elsif gets == "s5" && pt >= c5 - g5 += 1 - pt -= c5 - kekka = "10円金券をゲット!" -elsif gets == "s6" && pt >= c6 - g6 += 1 - pt -= c6 - kekka = "まぐろ交換券をゲット!" -else - h1 = "チケット発行できません!!" - kekka = "ポイントとかたりません!" -end - -trade = c["trade"] -if trade == n1 && g1 > 0 - g1 -= 1 - kekka = "#{n1} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" - h1 = "#{n1}と交換します!<br>こぼさないで たべてね!" -elsif trade == n2 && g2 > 0 - g2 -= 1 - kekka = "#{n2} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、年齢を確認してから交換してください!" - h1 = "#{n2} と交換します!<br>ひやしてから おうち で のんでね!" -elsif trade == n3 && g3 > 0 -g3 -= 1 -kekka = "#{n3} と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" - h1 = "#{n3}と交換します!" -elsif trade == n4 && g4 > 0 -g4 -= 1 -kekka = "あめ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" -h1 = "あめと交換します!" -elsif trade == "10えん金券" && g5 > 0 -g5 -= 1 -kekka = " 10えん と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" -h1 = "10えんと交換します!" -elsif trade == "まぐろ" && g6 > 0 -g6 -= 1 -kekka = "まぐろ と交換します!<br>スタッフの人は、スタッフがボタンを押した場合のみ、交換してください!" -h1 = "まぐろと交換します!" -end - - - - - -db.execute(goods, g1, g2, g3, g4, g5, g6, person) -db.execute(upd, pt, person) - - -pre = "%" -printf(<<_EOS_, h1, name, pt, kekka, g1, g2, g3) - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" -content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" -type="text/css" rel="stylesheet" /> - -<link rel="shortcut icon" href="./img/tsuya.png"/> -<title>こうかん!</title> -<style type="text/css"> -<!-- ---> -</style> - -</head> - -<body> -<header></header> -<h1>さかたっち</h1> -<h2>%s</h2> -<p> -%sさん<br> -さかたポイント:%dp<br> -%s -</p> -<table> -<title>もっているチケット</title> -<tr><td> -オランダせんべい</td><td>:%d</td></tr><tr><td> -ビール</td><td>:%d</td></tr><tr><td> -secret</td><td>:%d</td></tr><tr><td> -</td><td></td></tr><tr><td> -</td><td></td></tr> -</table> -<br><br> -<div class="f1"><a href="prof.rb"><div class="lets"><span>もどる!</span></div></a></div> -<br><br> -<form method="POST" action="gets.rb"> -<input type="text" name="trade" placeholder="ここは スタッフ の 人 が つかうよ!"> -<input type="submit" value="スタッフ ぼたん"><br>スタッフじゃない人はおさないでね! -</form> - -<footer></footer> -</body> -</html> - - -_EOS_
--- a/oasis2015/gohan.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding: utf-8 -*- -require 'cgi' -require 'sqlite3' -require 'kconv' -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("sql/main.sq3") - -id = c.cookies["id"][0] -person = id.to_i - -data = "select * from test where id = ?" - #idが?(後で代入)のデータをtest票から探す。という命令をdataにしくむ。全てがほしい場合は「*」。「*」を「name」に変えると該当データのnameだけとりだす。 - -cook = db.execute(data, person) - #dataに仕組んでいた命令を、personを代入しつつ実行。 - -upd = "update test set exp = ?, pt = ? where id = ?" - #「idが?3のとき、expを?1にする。ptを?2にする。」という命令文。 -lvupd = "update test set lv = ? where id = ?" - -que = "select q10 from toi where id = ?" -queupd = "update toi set q10 = 1 where id = ?" -q10 = db.execute(que, person) - - name = cook[0][1] - cal = cook[0][2] - exp = cook[0][6] - pt = cook[0][7] - lv = cook[0][8] - per = "%" -##################################### -##########秘密のこたえを設定############## -if cal == "inu" -m3 = "あゆ" -elsif cal == "sisip" -m3 = "ゆめ" -elsif cal == "kamon" -m3 = "ねぎ" -elsif cal == "boy" -m3 = "ふね" -elsif cal == "girl" -m3 = "かんざし" -else -m3 = "skipskip" -end -##################################### -##################################### - - -gohan = c["gohan"] -#himitu = "" -if gohan == "g1" && pt >= 1 - exp += 1 - pt -= 1 - db.execute(upd, exp, pt, person) - kekka = "#{cal}が成長した!" -elsif gohan == "g2" && pt >= 3 - exp += 4 - pt -= 3 - db.execute(upd, exp, pt, person) - kekka = "#{cal}がすごく成長した!" -elsif gohan == m3 - if q10[0][0] == 0 - exp += 10 - db.execute(upd, exp, pt, person) - kekka = "" - db.execute(queupd, person) - else - kekka ="しつもん に こたえられるのは いっかい だけだよ!" - end -else - kekka = "ポイント が たりない!" -end - -if gohan == m3 -elsif gohan == "g1" -elsif gohan == "g2" -else -kekka = "こたえ が ちがうよ!" -end - - -if exp >= lv*10 && lv < 5 - lv += 1 - db.execute(lvupd, lv, person) - kekka += "<br>レベルが上がった!<br>レベルが#{lv}になった!" -end - - -if cal == "inu" - image = "./img/inu#{lv}.png" - alt = "inu#{lv}" -elsif cal == "sisip" - image = "./img/sisip#{lv}.png" - alt = "sisip#{lv}" -elsif cal == "kamon" - image = "./img/kamon#{lv}.png" - alt = "kamon#{lv}" -elsif cal == "boy" - image = "./img/boy#{lv}.png" - alt = "boy#{lv}" -elsif cal == "girl" - image = "./img/girl#{lv}.png" - alt = "girl#{lv}" -else - image = "./img/snail.png" -end - -if lv == 1 - color = "black" -elsif lv == 2 - color = "navy" -elsif lv == 3 - color = "green" -elsif lv == 4 - color = "red" -elsif lv == 5 - color = "yellow" -else - color = "pink" - image = "./img/snail.png" - alt = "snails_bug" -end - -gage = 0 -exp2 = exp -if lv < 5 - while exp2 >= 10 - exp2 -= 10 - end - gage = 100-exp2*10 -end - - - -modoru = '<br><div class="f1"><a href="prof.rb"><div class="lets"><span>ホーム' -back = modoru -if lv < 5 && gohan == "g1" || lv < 5 && gohan == "g2" -mo = '<input type="button" value="おかわり!" onclick="location.reload();" />' -#dmo = "" - back = mo + modoru -elsif lv >= 5 - back += "<br>(レベルマックスだよ!)" -end -back += '</span></div></a></div>' - -cook = db.execute(data, person) -exp = cook[0][6] -pt = cook[0][7] -lv = cook[0][8] - - -printf(<<_EOS_, per, gage, per, per, per, color, image, alt, name, person, cal, lv, pt, kekka, back) - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" -content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" -type="text/css" rel="stylesheet" /> - -<link rel="shortcut icon" href="./img/exp.png"/> -<title>ごはぁん!</title> -<style type="text/css"> -<!-- -p.gage{ -background:#adf; -margin-left:0%s; -margin-right:%d%s; -text-align:left; -border-radius: 10ex; -} -div.gage{ -background:#ddf; -margin-left:20%s; -margin-right:20%s; -border-radius: 10ex; -} - -div.cal div{float:left; border:solid %s;} - ---> -</style> -</head> - -<body> -<header></header> -<h1>さかたっち</h1> - -<div class="cal"> -<div> -<img src=%s alt=%s width="172" height="172"> -</div> -<table class="state"><tr><td>name</td><td>:%s</td></tr> -<tr><td>id</td><td>:%04d</td></tr> -<tr><td>cara</td><td>:%s</td></tr> -<tr><td>lv.</td><td>%d</td></tr> -</table> -</div> - -<div class="gage"> -<p class="gage">exp</p> -</div> - -<p> - -さかたポイント:%dp<br> -%s -</p> - -%s -<footer></footer> -</body> -</html> - -_EOS_
--- a/oasis2015/index.html Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" -content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" -type="text/css" rel="stylesheet" /> - - -<link rel="shortcut icon" href="./img/cabage.png"/> -<title>さかたっち</title> - -</head> - -<body> -<h1>さかたっち</h1><h2>~酒田の自然に囲まれて~</h2> -<p>キャラクターを登録しよう!</p> - -<form method="POST" action="./accountcheck.rb"> -<table> -<tr><td>名前</td><td><input name="name" type="text" size="15" placeholder="名前"></td></tr> -<tr><td>性別</td><td><select name="sex"> - <option value="B">男 - <option value="G">女 - </select></td></tr> -<tr><td>年代</td><td><select name="age"> - <option>10代以下 - <option>10代 - <option>20代 - <option>30代 - <option>40代 - <option>50代 - <option>60代以上 - </select></td></tr> -<tr><td>出身地</td><td><select name="aria"> - <option>酒田市内 - <option>山形県内 - <option>県外 - </select></td></tr> -<tr><td>キャラ</td><td><select name="cal"> - <option value="inu">いぬ - <option value="sisip">シシップ - <option value="kamon">カモン - <option value="boy">男の子 - <option value="girl">女の子 - </select></td></tr> -<tr><td></td><td><input type="submit" value="登録する!"></td></tr> -</table> -</form> -</body> -</html>
--- a/oasis2015/magic.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -#!/usr/bin/env ruby -# -*- coding: utf-8 -*- - -def magic() - srand(123456789) - hoge = Array.new - while hoge.length < 100 - hoge << rand(1000000) - hoge.uniq! - end - return hoge -end
--- a/oasis2015/main.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -body{ -text-align:center; -border-style:dashed; -border-color:#000; -color:#000; -} - -a{margin:-2px;}
--- a/oasis2015/main2.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -##headのstyleのなかに既述しないと、%sなどの情報が受け取れない。prof.rb用。 - - -h2 { -text-align:left;xs -color: #f00; -font-size: 15px; -padding: 5px 20px 5px 5px; -font-family: Consolas, 'Courier New', 'Bitstream Vera Sans Mono', Courier, monospace; -margin: 2%s %d%s 2%s 20%s; -border-left: 2px solid #fcc; -border-bottom: 2px solid #fcc; -text-shadow: #66f 2px 5px 5px; -background:url("./img/lvb.png"); - }
--- a/oasis2015/prof.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,484 +0,0 @@ -#!/usr/bin/env ruby22 -# -*- coding: utf-8 -*- -require 'cgi' -require 'sqlite3' -require 'kconv' -c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8") -db = SQLite3::Database.new("./sql/main.sq3") - -id = c.cookies["id"][0] -person = id.to_i - -data = "select * from test where id = ?" -data2 = "select * from test where id = ?" -#idが?(後で代入)のデータをtest票から探す。という命令をdataにしくむ。全てがほしい場合は「*」。「*」を「name」に変えると該当データのnameだけとりだす。 -cook = db.execute(data, person) #dataに仕組んでいた命令を、personを代入しつつ実行。 -cook2 = db.execute(data2, person) -jikan1 = "select * from time where cd = ?" -timeupd = "update time set now = ?, id = ? where cd = ?" - -que = "select * from toi where id = ?" -queupd = "update toi set q1 = ?, q2 = ?, q3 = ?, q4 = ?, q5 = ? where id = ?" -toi = db.execute(que, person) - -bomd = "update test set pt = ? where id = ?" -ins4 = 'insert into time values(?, 61, "n")' -printf("Content-type: text/html; charset=UTF-8\n\n") - -begin -name = cook[0][1] -cal = cook[0][2] -age = cook[0][3] -sex = cook[0][4] -aria = cook[0][5] -exp = cook[0][6] -pt = cook[0][7] -lv = cook[0][8] -rescue -printf(<<_EOS_) -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html><head> -<meta name="viewport" -content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" -type="text/css" rel="stylesheet" /> -<link rel="shortcut icon" href="./img/cabage.png"/> -<title>さかたっち</title> -<style type="text/css"> -<!-- ---> -</style> -</head> - -<body> -<header></header> -<h1>データがみつかりません!</h1><h2>クッキーを消してやりなおしてください!</h2> -<div class="f1"><a href="index.html"><div class="lets"><span>とうろく画面へ!</span></div></a></div> -<div class="f1"><a href="cookie.rb"><div class="lets"><span>くっきーをけす!</span></div></a></div> -<address>skip@xxxx.co.jp</address> -<footer></footer> -</body> -</html> - -_EOS_ -exit(0) ##プログラム終了! これがないと以降のプログラムが動いてしまう。 -end - - - -q1 = toi[0][1] -q2 = toi[0][2] -q3 = toi[0][3] -q4 = toi[0][4] -q5 = toi[0][5] - -per ="%" - -##################--ptを獲得するための乱数生成--############# -##################----############################# - -def qrc() - srand(11223344) - x = rand(10000000) - srand(x) - qrnumber = Hash.new("n") - qrarr = ["a", "b", "c", "d", "e"] - qrarr.length.times do |n| - qrnumber[rand(100000000)] = qrarr[n] - end - return qrnumber -end - -##################ptを獲得した際の反応。#################### -#########前の人が書き込んだ時間と比べて60秒以内なら追加ポイント#### -kpt = 0 -bom = c["bom"] ####<form ~~ name="bom">より - -begin - jikan2 = db.execute(jikan1, "j") - now1 = jikan2[0][1] -rescue - db.execute(ins4, "a") - db.execute(ins4, "b") - db.execute(ins4, "c") - db.execute(ins4, "d") - db.execute(ins4, "e") - db.execute(ins4, "f") - db.execute(ins4, "g") - db.execute(ins4, "h") - db.execute(ins4, "i") - db.execute(ins4, "j") -end - -if bom == "please skip here" - jikan2 = db.execute(jikan1, "j") - now1 = jikan2[0][1] - nowper = jikan2[0][2] - now2 = Time.now.to_i - db.execute(timeupd, now2, person, "j") - if person == nowper - elsif now1 == nil - elsif now2-now1 < 2 ####2秒以内なら~ - pt += 50 - kpt += 50 - end - pt += 1 - kpt += 1 - # db.execute(bomd, pt, person) -end - -qrAC = qrc ###生成したハッシュには、"乱数"=>"記号"が入っている -getAC = ARGV[0].to_i ###URL?以降の文字(特定の乱数)を取得してgetACに代入 -qr = qrAC[getAC] ###特定の"乱数"が一致すると、"乱数"=>"記号"がqrに正しく入力される。 -qr = ARGV[0] - -if qr =="a" && q1 == 0 - q1 += 1 - jikan2 = db.execute(jikan1, "a") - now1 = jikan2[0][1] - nowper = jikan2[0][2] - now2 = Time.now.to_i - db.execute(timeupd, now2, person, "a") - if person == nowper - elsif now1 == nil - elsif now2-now1 < 60 - pt += 2 - kpt += 2 - end - pt += 10 - kpt += 10 -elsif qr == "b" && q2 == 0 - q2 += 1 - jikan2 = db.execute(jikan1, "b") - now1 = jikan2[0][1] - nowper = jikan2[0][2] - now2 = Time.now.to_i - db.execute(timeupd, now2, person, "b") - if person == nowper - elsif now1 == nil - elsif now2-now1 < 60 - pt += 2 - kpt += 2 - end - pt += 10 - kpt += 10 -elsif qr == "c" && q3 == 0 - q3 += 1 - jikan2 = db.execute(jikan1, "c") - now1 = jikan2[0][1] - nowper = jikan2[0][2] - now2 = Time.now.to_i - db.execute(timeupd, now2, person, "c") - if person == nowper - elsif now1 == nil - elsif now2-now1 < 60 - pt += 2 - kpt += 2 - end - pt += 10 - kpt += 10 -elsif qr == "d" && q4 == 0 - q4 += 1 - jikan2 = db.execute(jikan1, "d") - now1 = jikan2[0][1] - nowper = jikan2[0][2] - now2 = Time.now.to_i - db.execute(timeupd, now2, person, "d") - if person == nowper - elsif now1 == nil - elsif now2-now1 < 60 - pt += 2 - kpt += 2 - end - pt += 10 - kpt += 10 -elsif qr == "e" && q5 == 0 - q5 += 1 - jikan2 = db.execute(jikan1, "e") - now1 = jikan2[0][1] - nowper = jikan2[0][2] - now2 = Time.now.to_i - db.execute(timeupd, now2, person, "e") - if person == nowper - elsif now1 == nil - elsif now2-now1 < 60 - pt += 2 - kpt += 2 - end - pt += 10 - kpt += 10 -end - - -db.execute(bomd, pt, person) -db.execute(queupd, q1, q2, q3, q4, q5, person) - -kkget = "" -if kpt > 0 - kkget = "#{kpt}ポイントゲット!!" -end - - - -########################~ここまでpt処理~################### -####################################################### - -if cal == "inu" - image = "./img/inu#{lv}.png" - alt = "inu#{lv}" - m1 = "ドッグフード" - mimg1 = "./img/food.png" - m2 = "にく" - mimg2 = "./img/niku.png" -elsif cal == "sisip" - image = "./img/sisip#{lv}.png" - alt = "sisip#{lv}" - m1 = "ぱん" - mimg1 = "./img/pan.png" - m2 = "きゃべつ" - mimg2 = "./img/kyabetsu.png" -elsif cal == "kamon" - image = "./img/kamon#{lv}.png" - alt = "kamon#{lv}" - m1 = "かい" - mimg1 = "./img/kai.png" - m2 = "とびうお" - mimg2 = "./img/fish.png" -elsif cal == "boy" - image = "./img/boy#{lv}.png" - alt = "boy#{lv}" - m1 = "いか" - mimg1 = "./img/ship.png" - m2 = "つやひめ" - mimg2 = "./img/tsuya.png" -elsif cal == "girl" - image = "./img/girl#{lv}.png" - alt = "girl#{lv}" - m1 = "さくらんぼ" - mimg1 = "./img/room.png" - m2 = "つやひめ" - mimg2 = "./img/tsuya.png" -elsif cal == "snake" - image = "./img/snake#{lv}.png" - alt = "snake#{lv}" - m1 = "かえる" - mimg1 = "./img/exp.png" - m2 = "ねずみ" - mimg2 = "./img/exp.png" -else - image = "./img/snail.png" - m1 = "たまごのから" - mimg1 = "./img/tamago.png" - m2 = "きゃべつ" - mimg2 = "./img/cabage.png" -end - - - -if lv == 1 - color = "black" -elsif lv == 2 - color = "navy" -elsif lv == 3 - color = "green" -elsif lv == 4 - color = "red" -elsif lv == 5 - color = "yellow" -else - color = "pink" - image = "./img/snail.png" - alt = "snails_bug" -end -#expが10あがる毎にlvが1あがる。 -#expの1の位*10で、次のレベルアップに必要な経験値の割合が出る。 -#(exp=12の場合、2*10=『20%』、次のレベルアップまであと80%が必要、と分かる。) -#(exp=35の場合、5*10=『50%』、次のレベルアップまであと50%が必要、と分かる。) -gage = 0 -exp2 = exp -esa = "<br><br><br>" -if lv < 5 - while exp2 >= 10 - exp2 -= 10 - end - gage = 100-exp2*10 - esa ='<input type="reset" value="とりけし"> -<input type="submit" value="こうかんする!"><br> -<input type="text" name="gohan" placeholder="ひみつ の こたえ を いれてね!">:0pt' -end - - - - -######################## -###lv==5のとき画像を変える### -comm = "" -if ARGV[0] == "commandbomd" -comm += '<form method="POST" action="prof.rb?commandbomd"> -<input type="text" name="bom" size="8"> -<input type="submit"> -</form>' -elsif lv == 5 -comm += '<form method="POST" action="prof.rb"> -<input type="text" name="bom" size="8"> -<input type="submit"> -</form>' -end - -if bom == "inu1" -image = "./img/inu1.png" -elsif bom == "inu2" -image = "./img/inu2.png" -elsif bom == "inu3" -image = "./img/inu3.png" -elsif bom == "inu4" -image = "./img/inu4.png" -elsif bom == "inu5" -image = "./img/inu5.png" - -elsif bom == "sisip1" -image = "./img/sisip1.png" -elsif bom == "sisip2" -image = "./img/sisip2.png" -elsif bom == "sisip3" -image = "./img/sisip3.png" -elsif bom == "sisip4" -image = "./img/sisip4.png" -elsif bom == "sisip5" -image = "./img/sisip5.png" - -elsif bom == "kamon1" -image = "./img/kamon1.png" -elsif bom == "kamon2" -image = "./img/kamon2.png" -elsif bom == "kamon3" -image = "./img/kamon3.png" -elsif bom == "kamon4" -image = "./img/kamon4.png" -elsif bom == "kamon5" -image = "./img/kamon5.png" - -elsif bom == "boy1" -image = "./img/boy1.png" -elsif bom == "boy2" -image = "./img/boy2.png" -elsif bom == "boy3" -image = "./img/boy3.png" -elsif bom == "boy4" -image = "./img/boy4.png" -elsif bom == "boy5" -image = "./img/boy5.png" - -elsif bom == "girl1" -image = "./img/girl1.png" -elsif bom == "girl2" -image = "./img/girl2.png" -elsif bom == "girl3" -image = "./img/girl3.png" -elsif bom == "girl4" -image = "./img/girl4.png" -elsif bom == "girl5" -image = "./img/girl5.png" -end -######################### -######################### -###################################--HTML--################## -###################################--------################## - -#以下のprintfについて -#pre*4はstyleの部分、<h2>{margin(本来OS_,per,gage,per,per,per,name...) -printf(<<_EOS_, per, gage, per, per, per, color, kkget, image, alt, name, person, cal, lv, comm, pt, m1, mimg1, m2, mimg2, esa) - - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - -<meta name="viewport" -content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> -<meta name="format-detection" content="telephone=no"> -<link media="only screen and (max-device-width:480px)" -href="smart.css" type="text/css" rel="stylesheet" /> -<link media="screen and (min-device-width:481px)" href="profeel.css" -type="text/css" rel="stylesheet" /> - - - - -<link rel="shortcut icon" href="./img/cabage.png"/> -<title>さかたっち</title> -<style type="text/css"> -<!-- -p.gage{ -background:#adf; -margin-left:0%s; -margin-right:%d%s; -text-align:left; -border-radius: 10ex; -} -div.gage{ -background:#ddf; -margin-left:20%s; -margin-right:20%s; -border-radius: 10ex; -} -div.cal div{float:left; border:solid %s;} - ---> -</style> -</head> - -<body> -<header></header> -<h1>さかたっち</h1> -<h2>%s</h2> - -<div class="cal"> -<div> -<img src=%s alt=%s width="172" height="172"> -</div> -<table class="state"><tr><td>name</td><td>:%s</td></tr> -<tr><td>id</td><td>:%04d</td></tr> -<tr><td>cara</td><td>:%s</td></tr> -<tr><td>lv.</td><td>%d</td></tr> -</table> -</div> - -<div class="gage"> -<p class="gage">exp</p> -</div> - -%s - -<p>さかたポイント:%dp</p> -<table><tr><td> -<form method="POST" action="gohan.rb"> -<input type="checkbox" name="hdn">ごはん!<div><br> -<label><input type="radio" name="gohan" value="g1">%s:1pt<img src=%s width="16" height="16"></label><br> -<label><input type="radio" name="gohan" value="g2">%s:3pt<img src=%s width="16" height="16"></label><br> -%s -</div></form> -</td><td> -<form method="POST" action="gets.rb"> -<label><input type="checkbox" name="hdn">しょうひん!<div><br> -<label><input type="radio" name="sho" value="s1">オランダせんべい:8pt</label><br> -<label><input type="radio" name="sho" value="s2">ビール:4pt</label><br> -<input type="reset" value="とりけし"> -<input type="submit" value="こうかんする!"></div></label><br> - -</form> -</td></tr></table> - - - -<address>skip@xxxx.co.jp</address> -<footer></footer> -</body> -</html> - -_EOS_
--- a/oasis2015/profeel.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -body{text-align:center; -background:#ffb; -} -header{ -#padding:100px; - position: relative; - top: 0px; - left: 0px; - width: 80%; - height: 200px; -background-image:url(./img/head.png); -text-align:center; -margin-left:auto;margin-right:auto; -} -footer{ -#padding:100px; - position: relative; - top: 0px; - left: 0px; - width: 80%; - height: 200px; -background-image:url(./img/foot.png); -text-align:center; -margin-left:auto;margin-right:auto; -} - - - -header p {color:red;} - -h1{ -color:#e90; -border:solid 5px #fa0; -border-style:double; -background:url("./img/lvb.png"); -background-color:red; -} - - - - -input[type="checkbox"][name="hdn"] + span {display: none;} -input[type="checkbox"][name="hdn"]:checked + span {display: inline;} - -input[type="checkbox"][name="hdn"] + div{opacity: 0;} -input[type="checkbox"][name="hdn"]:checked + div { - opacity: 1.0; transition: 3s ease-in-out; - transition: 1s linear;} - -table{margin-left:auto; margin-right: auto;} -table.state{text-align:left;} -table.state tr+tr+tr+tr{font-size:xx-large;} - - -div.f1{padding:0% 0%; -margin:1em 17em;} -div.lets{ -border:solid 2px #fa0; -background:#faf; -padding:1% 0%; -#margin:1em 17em; -} -div.lets span{color:navy; text-decoration: underline #faf;} - -div.cal {margin-left:auto; margin-right:auto; -width: 320px; height: 180px; -background: white} - - - -#form{margin-left:auto; margin-right:auto;}
--- a/oasis2015/smart.css Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -body{text-align:center; -background:#ffb; -margin-left:auto;margin-right:auto; -width:340px; -} -header{ -#padding:100px; - position: relative; - top: 0px; - left: 0px; - width: 100%; - height: 140px; -background-image:url(./img/head2.png); -background-repeat:no-repeat; -text-align:center; -margin-left:auto;margin-right:auto; -} -footer{ -#padding:100px; - position: relative; - top: 0px; - left: 0px; - width: 100%; - height: 140px; -background-image:url(./img/foot2.png); -background-repeat:no-repeat; -text-align:center; -margin-left:auto;margin-right:auto; -} - - - -header p {color:red;} - -h1{ -color:#e90; -border:solid 5px #fa0; -border-style:double; -background:url("./img/lvb.png"); -background-color:red; -} - -input[type="checkbox"][name="hdn"] + span {display: none;} -input[type="checkbox"][name="hdn"]:checked + span {display: inline;} - -input[type="checkbox"][name="hdn"] + div{opacity: 0;} -input[type="checkbox"][name="hdn"]:checked + div { - opacity: 1.0; transition: 3s ease-in-out; - transition: 1s linear;} - -table{margin-left:auto; margin-right: auto;} -table.state{text-align:left;} -table.state tr+tr+tr+tr{font-size:xx-large;} - - -div.f1{padding:0% 0%;} -div.lets{ -border:solid 2px #fa0; -background:#faf; -padding:1% 0%; -#margin:1em 17em; -} -div.lets span{color:navy; text-decoration: underline #faf;} - - - - -div.cal {margin-left:auto; margin-right:auto; -width: 320px; height: 180px; -background: white} - - - -#form{margin-left:auto; margin-right:auto;}
--- a/oasis2015/test.rb Thu Feb 11 08:58:58 2016 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -#!/usr/bin/env ruby -# -*- coding: utf-8 -*- - -require 'cgi' -require 'sqlite3' -require './magic.rb' - -c = CGI.new(:accept_charset => "UTF-8") -db = SQLite3::Database.new("./sql/stamp.sq3") - -begin - result = db.execute("select * from main;") - max = "select max(id) from main;" -rescue - db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,sex,age,aria,cal,stamp_status,stamp_img,exp INTEGER,rank INTEGER,magic)"); - db.execute("insert into main(name,sex,age,aria,cal,stamp_status,stamp_img,exp,rank,magic) values('名前','性別','年代','住所','職業','スタンプ状況','スタンプ画像','レベル','当選順位','本人確認用')"); - result = db.execute("select * from main;") - max = "select max(id) from main;" -end - -id = c.cookies["id"][0] -c_magic = c.cookies["magic"][0] -name = c["name"] -cal = c["cal"] -age = c["age"] -sex = c["sex"] -aria = c["aria"] - -begin -sel = 'select * from main where id=? AND magic=?' -h = db.execute(sel, id.to_i, c_magic.to_i) -rescue -h == [] -end - -if id != nil && h != [] -update = 'update main set name=?, cal=?, age=?, sex=?, aria=? where id=? and magic=?' -mg = c_magic -db.execute(update, name, cal, age, sex, aria, id.to_i, mg.to_i) -else -code = magic() -id = db.execute(max).flatten(2)[0].to_i + 1 -mg = code[id] -sql = "insert into main(name,sex,age,aria,cal,stamp_status,stamp_img,exp,rank,magic) values (?,?,?,?,?,?,?,?,?,?);" -db.execute(sql,name,sex,age,aria,cal,'000010000','n,n,n,n,kamo1,n,n,n,n',0,0,mg); #初期値 -end - -expires = "SAT, 26 Oct 2015 00:00:00 GMT" - - -printf(<<_EOS_,id, expires, mg.to_s, expires) -Content-type: text/html; charset=UTF-8 -Set-Cookie:id=%s ;expires=%s -Set-Cookie:magic=%s;expires=%s - -<html> -<head> -<title>#{id}</title> -<link rel="stylesheet" type="text/css" href="../cssrubyII.css"> -</head> -<body> -<p> -・#{name}<br>・#{cal}<br>・#{age}<br>・#{sex}<br>・#{aria}<br>・#{id} -</p> - -<p> -tukaretanaaaa、#{name} -</p> -</body> -</html> -_EOS_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/.htaccess Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,4 @@ +AddHandler cgi-script .rb +AddType "text/html; charset=UTF-8" .rb +AddType "text/html; charset=UTF-8" .html +Options +ExecCGI
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/add.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,21 @@ +<html> +<head> +<title>add page</title> +<link rel="stylesheet" type="text/css" href="ほげ.css"> +</head> + +<body> +<h1>登録ぺーじ</h1> + +<p><a href="manual.html">はじめに</a></p> +<p>名前を入れて登録しよう</p> +<form method="POST" action="./add.rb"> +<p>お名前: <input name="name" type="text" maxlength="40"><br> +<input type="submit" value="OK"> +<input type="reset" value="reset"><br></p> +</form> + +<address>c111126@g.koeki-u.ac.jp</address> + +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/add.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,64 @@ +#!/usr/bin/env ruby +#coding:utf-8 + +require'cgi' +require'sqlite3' + +c = CGI.new(:accept_charset => "UTF-8") +adname = c["name"] + +db = SQLite3::Database.new("sql/test.sq3") + +cookieuke = Hash.new # cookie値保存用のHash +if (c=ENV['HTTP_COOKIE']) # 環境変数 HTTP_COOKIE にcookieリストがある + c.split(/[;,]\s+/).each do |exp| # (セミコロンかカンマ)+空白 で分解 + if /(.*)=(.*)/ =~ exp # =の前後で分解 「変数=値;」 + key = CGI::unescape($1) # 変数も値もエスケープされているので + value = CGI::unescape($2) # 元に戻す + cookieuke[key] = CGI::unescape(value) + end + end +end + +name = cookieuke["name"] +id = cookieuke["id"].to_i + +if name == nil && id == 0 + begin + db.execute("insert into main(name,lon,lat,sta) values('#{adname}',0,0,1)"); + rescue + db.execute("create table main(id integer PRIMARY KEY AUTOINCREMENT,adname,lon,lat,sta)"); + db.execute("insert into main(name,lon,lat,sta) values('#{adname}',0,0,1)"); + db.execute("select * from main"); + end + + count = db.execute("select max(id) from main"); + + expires = (Time.now.gmtime+3600*24).strftime("%a, %d %b %Y %H:%M:%S GMT") + + printf("Set-Cookie:id=%d; expires=%s\n",count[0][0],expires) + printf("Set-Cookie:name=%s; expires=%s\n",adname,expires) +end + +print"Content-type: text/html charset=UTF-8\n\n" + +printf"<!DOCTYPE html> +<html> +<head> +<title>add page's</title> +<script language=\"javascript\"> +time = 1; +url = \"http://skip.koeki-prj.org/staff/fujix/redirect.html\"; +function jumpPage() { + location.href = url; +} +setTimeout(\"jumpPage()\",time*500) +</script> + +</head> +<body> +<p>勝手にページが飛びます。</p> +<p>移動しない場合は<a href=\"redirect.html\">こちら</a>から移動してください</p> +</body> +</html> +"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/admin/delete.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,25 @@ +<html> +<head> +<title>たいとる</title> +</style> +<link rel="stylesheet" type="text/css" href="ほげ.css"> +</head> + +<body> +<h1>データベース消去用</h1> +<p>OKで実行すると個人情報等が削除されます。</p> +<p>実行の際は注意してください。</p> +<form method="POST" action="./delete.rb"> +<p>本当に消しますか?<br> +はい<input type="radio" name="check" value="OK"> +いいえ<input type="radio" name="check" value="NO"> +</p> + +<input type="submit" value="削除"> +<input type="reset" value="リセット"> +</form> + +<address>c111126@g.koeki-u.ac.jp</address> + +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/admin/delete.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby +#coding: utf-8 + +require 'cgi' +c = CGI.new(:accept_charaset => "UTF-8") +print("Content-type: text/html; charset=utf-8\n\n") +check = c['check'] +require 'sqlite3' +db = SQLite3::Database.new("../sql/test.sq3") + +if check == "OK" + db.execute("delete from main"); + begin + db.execute("drop table main"); + rescue + print"<p>テーブルの再構築に失敗しました。</p>" + else + db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat,sta)"); + db.execute("insert into main(name,lon,lat,sta) values('NAME','LON','LAT','STA')"); + print"<p>データベースの中身を消去しました。</p>" + end +else + print"<p>データベースは保持されたままです。</p>" +end +print"<p><a href=\"etsuran.rb\">もどる</a></p>"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/admin/etsuran.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,39 @@ +#!/usr/bin/env ruby +#coding:utf-8 + +require 'sqlite3' +db = SQLite3::Database.new("../sql/test.sq3") + +begin + result = db.execute("select * from main"); +rescue + db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat,sta)"); + db.execute("insert into main(name,lon,lat,sta) values('NAME','LON','LAT','STA')"); + result = db.execute("select * from main"); +end + +print"Content-type: text/html; charset=utf-8 + +<html> +<head><title>情報閲覧用ページ</title> +<link rel=\"stylesheet\" type=\"text/css\" href=\"../coupon2.css\"> +</head> +<body>" +print"<div> +<h1>位置情報一覧</h1>" +if result.length == 0 + print"<p>まだ登録している人は居ません</p>" +else + print"<table border = 1> + <tr><th>名前</th><th>緯度</th><th>経度</th><th>地図</th></tr>\n" + result.each do |line| + if line[2] == "LON" + next + else + printf("<tr><td>%s</td><td>%f</td><td>%f</td><td><a href=\"../check.rb?%s\">表示</a></td></tr>\n",line[1],line[2],line[3],line[2].to_s+"+"+line[3].to_s) + end + end + print"</table>" +end +print"</body> +</html>"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/check.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,91 @@ +#!/usr/bin/env ruby +#coding:utf-8 + +print"Content-type: text/html charset=UTF-8\n\n" + +require'sqlite3' +require'cgi' +c = CGI.new(:accept_charaset => "UTF-8") +db = SQLite3::Database.new("sql/test.sq3") +db.results_as_hash = true + +data = Hash.new + +begin + db.execute("select * from main"); +rescue + db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat)"); + db.execute("insert into main(name,lon,lat) values('#{name}','#{lon}','#{lat}')"); +end + +db.execute("select * from main") do |load| + data[load['id']] = [load['name'],load['lon'],load['lat'],load['sta']] +end + +lon = 38.89420 +lat = 139.8187 +redirect = "check.rb" +image = ["","face","angry","sad"] + +if ARGV[1] != nil + lon = ARGV[0].to_f + lat = ARGV[1].to_f + redirect += "?" + lon.to_s + "+" + lat.to_s +end + +printf(<<_EOS_,redirect,lon.to_f,lat.to_f) +<!DOCTYPE html> +<html> +<head> +<link rel="stylesheet" type="text/css" href="leaflet/leaflet.css"/> +<script src="leaflet/leaflet.js"></script> +<style> + html,body,#map{ + height: 100% + } + body{ + padding: 0; + margin: 0; + } +</style> +<title>閲覧用ページ</title> +<!-- <meta http-equiv="refresh" content="20;%s"> --> +</head> +<body> +<div id="map"></div> +<script type="text/javascript"> + var hmap = L.map('map',{ + center: [%f,%f], + zoom: 16 //1~18 + }); + L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ + attribution: '© OpenStreetMap contributors' + }).addTo(hmap); +_EOS_ + + for id in data.keys + if data[id][1] == "LON" + next + else + num = data[id][3] + printf(<<_EOS_,data[id][1].to_f,data[id][2].to_f,image[num],data[id][0]) + L.marker([%f,%f],{ + clickable:true, + draggable:true, + icon:L.icon({ + iconUrl: 'leaflet/images/%s.png', + iconAnchor: [0,0], + popupAnchor: [10,5] + }) + }) + .bindPopup('%s') + .addTo(hmap); +_EOS_ + end + end + + print" +</script> +</body> +</html>\n" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/glocation.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,55 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> +<title>Ȥ</title> +<link rel="stylesheet" type="text/css" href="ۤ.css"> +</head> + +<script type="text/javascript"> + if (navigator.geolocation) { + + // ߤΰ־ + navigator.geolocation.getCurrentPosition( + + // 1˰־μ + function (pos) { + var location ="<li>"+"١" + pos.coords.latitude + "</li>"; + location += "<li>"+"١" + pos.coords.longitude + "</li>"; + document.getElementById("location").innerHTML = location; + }, + // 2˰־μ˼Ԥ + function (error) { + var message = ""; + + switch (error.code) { + + // ־Ǥʤ + case error.POSITION_UNAVAILABLE: + message = "־μǤޤǤ"; + break; + + // GeolocationλѤĤʤ + case error.PERMISSION_DENIED: + message = "־λѵĤޤǤ"; + break; + + // ॢȤ + case error.PERMISSION_DENIED_TIMEOUT: + message = "־˥ॢȤޤ"; + break; + } + window.alert(message); + } + ); + } else { + window.alert("ܥ֥饦ǤGeolocationȤޤ"); + } +</script> + +<ul id="location"> + <li>:</li> +</ul> + +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/icon.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,56 @@ +<html> +<head> +<title>OpenLayers Simplest Example</title> +</head> +<body> +<div id="Map" style="height:600px;"></div> +<script src="http://openlayers.org/api/OpenLayers.js"></script> +<script> + var lon = 139.83643; + var lat = 38.915394; + var zoom = 16; + + var fromProjection = new OpenLayers.Projection("EPSG:4326"); + var toProjection = new OpenLayers.Projection("EPSG:900913"); + var position = new OpenLayers.LonLat(lon, lat).transform( fromProjection, toProjection); + map = new OpenLayers.Map("Map"); + var mapnik = new OpenLayers.Layer.OSM(); + map.addLayer(mapnik); + map.setCenter(position, zoom); + + var popup; + var marker_layer = new OpenLayers.Layer.Markers( "Markers" ); + var size = new OpenLayers.Size(42,50); + var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); + var contentStrings = new Array(); + + var icon_marker = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',size,offset); + marker = new OpenLayers.Marker(new OpenLayers.LonLat(lon,lat).transform(fromProjection,toProjection), icon_marker); + marker.events.register('click', marker, function(evt) { + popup = new OpenLayers.Popup.FramedCloud("Popup", + new OpenLayers.LonLat(lon,lat).transform( fromProjection, toProjection), + null,"ほげほげ",null,true); + map.addPopup(popup); + }); + marker.events.register('mouseout', marker, function(evt) {popup.hide();}); + marker_layer.addMarker(marker); + + var icon_marker2 = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',size,offset); + marker2 = new OpenLayers.Marker(new OpenLayers.LonLat(139.83664,38.915955).transform(fromProjection,toProjection), icon_marker2); + marker2.events.register('click', marker2, function(evt) { + popup2 = new OpenLayers.Popup.FramedCloud("Popup2", + new OpenLayers.LonLat(139.83664, 38.915955).transform( fromProjection, toProjection), + null,"fujix",null,true); + map.addPopup(popup2); + }); + //here add mouseout event + marker2.events.register('mouseout', marker2, function(evt) {popup2.hide();}); + + marker_layer.addMarker(marker2); + + map.addLayer(marker_layer); + +</script> +</body> + +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/leaf.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="stylesheet" type="text/css" href="leaflet/leaflet.css"/> + +<script src="leaflet/leaflet.js"></script> +<style> + html,body,#map{ + height: 100% + } + body{ + padding: 0; + margin: 0; + } + </style> + +<title>Getting Started with Leaflet</title> +</head> + +<body> +<div id="map"></div> +<script type="text/javascript"> + var hmap = L.map('map',{ + center: [38.91026,139.84532], + zoom: 14 //1~18 + }); + L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ + attribution: '© OpenStreetMap contributors' + }).addTo(hmap); + L.marker([38.91026,139.84532],{ + clickable:true + }) + .bindPopup('ほげ') + .addTo(hmap); +</script> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/leaf.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,155 @@ +#!/usr/bin/env ruby +#coding:utf-8 + +print"Content-type: text/html charset=UTF-8\n\n" + +require'sqlite3' +require'cgi' +cgi = CGI.new(:accept_charaset => "UTF-8") +db = SQLite3::Database.new("sql/test.sq3") +db.results_as_hash = true #DBの値をハッシュとして受け取る + +cookieuke = Hash.new # cookie値保存用のHash +if (c=ENV['HTTP_COOKIE']) # 環境変数 HTTP_COOKIE にcookieリストがある + c.split(/[;,]\s+/).each do |exp| # (セミコロンかカンマ)+空白 で分解 + if /(.*)=(.*)/ =~ exp # =の前後で分解 「変数=値;」 + key = CGI::unescape($1) # 変数も値もエスケープされているので + value = CGI::unescape($2) # 元に戻す + cookieuke[key] = CGI::unescape(value) + end + end +end + +name = cookieuke["name"] +id = cookieuke["id"].to_i +image = ["","face","angry","sad"] + +if ARGV[0] == "error" || ARGV[1] == nil || (name == "" && id == 0) + message = "" + redirect = "redirect" + if name == "" && id == 0 + redirect = "add" + message = "登録されていないため登録ページへ飛びます" + elsif ARGV[0] == "error" + message = "位置情報が正しく取れなかったため、もう一度取り直します" + elsif ARGV[1] == nil + message = "想定されないアクセスがされたため登録ページに戻ります" + redirect = "add" + end + + printf(<<_EOS_,redirect,message,redirect) +<!DOCTYPE html> +<html> +<head> +<title>MISS</title> +<meta http-equiv="refresh" content="3;%s.html"> +</head> +<body> +<p>%s</p> +<p>移動しない場合は<a href="%s.html">こちら</a>から移動してください</p> +</body> +</html> +_EOS_ + +else + lon = ARGV[0].to_f + lat = ARGV[1].to_f + data = Hash.new + + begin + db.execute("select * from main"); + rescue + db.execute("create table main(id INTEGER PRIMARY KEY AUTOINCREMENT,name,lon,lat,sta)"); + db.execute("insert into main(name,lon,lat,sta) values('#{name}','#{lon}','#{lat}','#{sta}')"); + end + + sta = cgi["v_radio"].to_i + if sta != 0 + bun = "good" + sql = "update main set name=?,lon=?,lat=?,sta=? where id=?" + begin + db.execute(sql,name,lon,lat,sta,id) + rescue + #db.execute("insert into main(name,lon,lat,sta) values('#{name}','#{lon}','#{lat}','#{sta}')"); + end + else + bun = "boo" + sql = "update main set name=?,lon=?,lat=? where id=?" + begin + db.execute(sql,name,lon,lat,id) + rescue + #db.execute("insert into main(name,lon,lat,sta) values('#{name}','#{lon}','#{lat}','#{sta}')"); + end + end + + db.execute("select * from main") do |load| + data[load['id']] = [load['name'],load['lon'],load['lat'],load['sta']] + end + + printf(<<_EOS_,lon.to_f,lat.to_f,lon.to_f,lat.to_f) +<!DOCTYPE html> +<html> +<head> +<link rel="stylesheet" type="text/css" href="leaflet/leaflet.css"/> +<script src="leaflet/leaflet.js"></script> +<style> + html,body{ + height: 100% + } + #map{ + height: 95% + } + body{ + padding: 0; + margin: 0; + } + form{ + font-size:5mm; + } +</style> +<title>Getting Started with Leaflet</title> +<meta http-equiv="refresh" content="20;redirect.html"> +</head> +<body> +<form method="POST" action="./leaf.rb?%f+%f"> +<input name="v_radio" type="radio" value="1">順調 +<input name="v_radio" type="radio" value="2">トラブル +<input name="v_radio" type="radio" value="3">ヘルプ +<input type="submit" value="OK"> +</form> +<div id="map"></div> +<script type="text/javascript"> + var hmap = L.map('map',{ + center: [%f,%f], + zoom: 17 //1~18 + }); + L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ + attribution: '© OpenStreetMap contributors' + }).addTo(hmap); +_EOS_ + for id in data.keys + if data[id][1] == "LON" + next + else + gazo = data[id][3] + printf(<<_EOS_,data[id][1].to_f,data[id][2].to_f,image[gazo],data[id][0]) + L.marker([%f,%f],{ + clickable:true, + draggable:true, + icon:L.icon({ + iconUrl: 'leaflet/images/%s.png', + iconAnchor: [0,0], + popupAnchor: [10,5] + }) + }) + .bindPopup('%s') + .addTo(hmap); +_EOS_ + end + end + + print" +</script> +</body> +</html>\n" +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/leaflet/leaflet-src.js Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,8909 @@ +/* + Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com + (c) 2010-2013, Vladimir Agafonkin + (c) 2010-2011, CloudMade +*/ +(function (window, document, undefined) { +var oldL = window.L, + L = {}; + +L.version = '0.6.4'; + +// define Leaflet for Node module pattern loaders, including Browserify +if (typeof module === 'object' && typeof module.exports === 'object') { + module.exports = L; + +// define Leaflet as an AMD module +} else if (typeof define === 'function' && define.amd) { + define(L); +} + +// define Leaflet as a global L variable, saving the original L to restore later if needed + +L.noConflict = function () { + window.L = oldL; + return this; +}; + +window.L = L; + + +/* + * L.Util contains various utility functions used throughout Leaflet code. + */ + +L.Util = { + extend: function (dest) { // (Object[, Object, ...]) -> + var sources = Array.prototype.slice.call(arguments, 1), + i, j, len, src; + + for (j = 0, len = sources.length; j < len; j++) { + src = sources[j] || {}; + for (i in src) { + if (src.hasOwnProperty(i)) { + dest[i] = src[i]; + } + } + } + return dest; + }, + + bind: function (fn, obj) { // (Function, Object) -> Function + var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; + return function () { + return fn.apply(obj, args || arguments); + }; + }, + + stamp: (function () { + var lastId = 0, + key = '_leaflet_id'; + return function (obj) { + obj[key] = obj[key] || ++lastId; + return obj[key]; + }; + }()), + + invokeEach: function (obj, method, context) { + var i, args; + + if (typeof obj === 'object') { + args = Array.prototype.slice.call(arguments, 3); + + for (i in obj) { + method.apply(context, [i, obj[i]].concat(args)); + } + return true; + } + + return false; + }, + + limitExecByInterval: function (fn, time, context) { + var lock, execOnUnlock; + + return function wrapperFn() { + var args = arguments; + + if (lock) { + execOnUnlock = true; + return; + } + + lock = true; + + setTimeout(function () { + lock = false; + + if (execOnUnlock) { + wrapperFn.apply(context, args); + execOnUnlock = false; + } + }, time); + + fn.apply(context, args); + }; + }, + + falseFn: function () { + return false; + }, + + formatNum: function (num, digits) { + var pow = Math.pow(10, digits || 5); + return Math.round(num * pow) / pow; + }, + + trim: function (str) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); + }, + + splitWords: function (str) { + return L.Util.trim(str).split(/\s+/); + }, + + setOptions: function (obj, options) { + obj.options = L.extend({}, obj.options, options); + return obj.options; + }, + + getParamString: function (obj, existingUrl, uppercase) { + var params = []; + for (var i in obj) { + params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); + } + return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); + }, + + template: function (str, data) { + return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { + var value = data[key]; + if (value === undefined) { + throw new Error('No value provided for variable ' + str); + } else if (typeof value === 'function') { + value = value(data); + } + return value; + }); + }, + + isArray: function (obj) { + return (Object.prototype.toString.call(obj) === '[object Array]'); + }, + + emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' +}; + +(function () { + + // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + + function getPrefixed(name) { + var i, fn, + prefixes = ['webkit', 'moz', 'o', 'ms']; + + for (i = 0; i < prefixes.length && !fn; i++) { + fn = window[prefixes[i] + name]; + } + + return fn; + } + + var lastTime = 0; + + function timeoutDefer(fn) { + var time = +new Date(), + timeToCall = Math.max(0, 16 - (time - lastTime)); + + lastTime = time + timeToCall; + return window.setTimeout(fn, timeToCall); + } + + var requestFn = window.requestAnimationFrame || + getPrefixed('RequestAnimationFrame') || timeoutDefer; + + var cancelFn = window.cancelAnimationFrame || + getPrefixed('CancelAnimationFrame') || + getPrefixed('CancelRequestAnimationFrame') || + function (id) { window.clearTimeout(id); }; + + + L.Util.requestAnimFrame = function (fn, context, immediate, element) { + fn = L.bind(fn, context); + + if (immediate && requestFn === timeoutDefer) { + fn(); + } else { + return requestFn.call(window, fn, element); + } + }; + + L.Util.cancelAnimFrame = function (id) { + if (id) { + cancelFn.call(window, id); + } + }; + +}()); + +// shortcuts for most used utility functions +L.extend = L.Util.extend; +L.bind = L.Util.bind; +L.stamp = L.Util.stamp; +L.setOptions = L.Util.setOptions; + + +/* + * L.Class powers the OOP facilities of the library. + * Thanks to John Resig and Dean Edwards for inspiration! + */ + +L.Class = function () {}; + +L.Class.extend = function (props) { + + // extended class with the new prototype + var NewClass = function () { + + // call the constructor + if (this.initialize) { + this.initialize.apply(this, arguments); + } + + // call all constructor hooks + if (this._initHooks) { + this.callInitHooks(); + } + }; + + // instantiate class without calling constructor + var F = function () {}; + F.prototype = this.prototype; + + var proto = new F(); + proto.constructor = NewClass; + + NewClass.prototype = proto; + + //inherit parent's statics + for (var i in this) { + if (this.hasOwnProperty(i) && i !== 'prototype') { + NewClass[i] = this[i]; + } + } + + // mix static properties into the class + if (props.statics) { + L.extend(NewClass, props.statics); + delete props.statics; + } + + // mix includes into the prototype + if (props.includes) { + L.Util.extend.apply(null, [proto].concat(props.includes)); + delete props.includes; + } + + // merge options + if (props.options && proto.options) { + props.options = L.extend({}, proto.options, props.options); + } + + // mix given properties into the prototype + L.extend(proto, props); + + proto._initHooks = []; + + var parent = this; + // jshint camelcase: false + NewClass.__super__ = parent.prototype; + + // add method for calling all hooks + proto.callInitHooks = function () { + + if (this._initHooksCalled) { return; } + + if (parent.prototype.callInitHooks) { + parent.prototype.callInitHooks.call(this); + } + + this._initHooksCalled = true; + + for (var i = 0, len = proto._initHooks.length; i < len; i++) { + proto._initHooks[i].call(this); + } + }; + + return NewClass; +}; + + +// method for adding properties to prototype +L.Class.include = function (props) { + L.extend(this.prototype, props); +}; + +// merge new default options to the Class +L.Class.mergeOptions = function (options) { + L.extend(this.prototype.options, options); +}; + +// add a constructor hook +L.Class.addInitHook = function (fn) { // (Function) || (String, args...) + var args = Array.prototype.slice.call(arguments, 1); + + var init = typeof fn === 'function' ? fn : function () { + this[fn].apply(this, args); + }; + + this.prototype._initHooks = this.prototype._initHooks || []; + this.prototype._initHooks.push(init); +}; + + +/* + * L.Mixin.Events is used to add custom events functionality to Leaflet classes. + */ + +var eventsKey = '_leaflet_events'; + +L.Mixin = {}; + +L.Mixin.Events = { + + addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) + + // types can be a map of types/handlers + if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; } + + var events = this[eventsKey] = this[eventsKey] || {}, + contextId = context && L.stamp(context), + i, len, event, type, indexKey, indexLenKey, typeIndex; + + // types can be a string of space-separated words + types = L.Util.splitWords(types); + + for (i = 0, len = types.length; i < len; i++) { + event = { + action: fn, + context: context || this + }; + type = types[i]; + + if (context) { + // store listeners of a particular context in a separate hash (if it has an id) + // gives a major performance boost when removing thousands of map layers + + indexKey = type + '_idx'; + indexLenKey = indexKey + '_len'; + + typeIndex = events[indexKey] = events[indexKey] || {}; + + if (!typeIndex[contextId]) { + typeIndex[contextId] = []; + + // keep track of the number of keys in the index to quickly check if it's empty + events[indexLenKey] = (events[indexLenKey] || 0) + 1; + } + + typeIndex[contextId].push(event); + + + } else { + events[type] = events[type] || []; + events[type].push(event); + } + } + + return this; + }, + + hasEventListeners: function (type) { // (String) -> Boolean + var events = this[eventsKey]; + return !!events && ((type in events && events[type].length > 0) || + (type + '_idx' in events && events[type + '_idx_len'] > 0)); + }, + + removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object]) + + if (!this[eventsKey]) { + return this; + } + + if (!types) { + return this.clearAllEventListeners(); + } + + if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; } + + var events = this[eventsKey], + contextId = context && L.stamp(context), + i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed; + + types = L.Util.splitWords(types); + + for (i = 0, len = types.length; i < len; i++) { + type = types[i]; + indexKey = type + '_idx'; + indexLenKey = indexKey + '_len'; + + typeIndex = events[indexKey]; + + if (!fn) { + // clear all listeners for a type if function isn't specified + delete events[type]; + delete events[indexKey]; + + } else { + listeners = context && typeIndex ? typeIndex[contextId] : events[type]; + + if (listeners) { + for (j = listeners.length - 1; j >= 0; j--) { + if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) { + removed = listeners.splice(j, 1); + // set the old action to a no-op, because it is possible + // that the listener is being iterated over as part of a dispatch + removed[0].action = L.Util.falseFn; + } + } + + if (context && typeIndex && (listeners.length === 0)) { + delete typeIndex[contextId]; + events[indexLenKey]--; + } + } + } + } + + return this; + }, + + clearAllEventListeners: function () { + delete this[eventsKey]; + return this; + }, + + fireEvent: function (type, data) { // (String[, Object]) + if (!this.hasEventListeners(type)) { + return this; + } + + var event = L.Util.extend({}, data, { type: type, target: this }); + + var events = this[eventsKey], + listeners, i, len, typeIndex, contextId; + + if (events[type]) { + // make sure adding/removing listeners inside other listeners won't cause infinite loop + listeners = events[type].slice(); + + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].action.call(listeners[i].context || this, event); + } + } + + // fire event for the context-indexed listeners as well + typeIndex = events[type + '_idx']; + + for (contextId in typeIndex) { + listeners = typeIndex[contextId].slice(); + + if (listeners) { + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].action.call(listeners[i].context || this, event); + } + } + } + + return this; + }, + + addOneTimeEventListener: function (types, fn, context) { + + if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; } + + var handler = L.bind(function () { + this + .removeEventListener(types, fn, context) + .removeEventListener(types, handler, context); + }, this); + + return this + .addEventListener(types, fn, context) + .addEventListener(types, handler, context); + } +}; + +L.Mixin.Events.on = L.Mixin.Events.addEventListener; +L.Mixin.Events.off = L.Mixin.Events.removeEventListener; +L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener; +L.Mixin.Events.fire = L.Mixin.Events.fireEvent; + + +/* + * L.Browser handles different browser and feature detections for internal Leaflet use. + */ + +(function () { + + var ie = !!window.ActiveXObject, + ie6 = ie && !window.XMLHttpRequest, + ie7 = ie && !document.querySelector, + ielt9 = ie && !document.addEventListener, + + // terrible browser detection to work around Safari / iOS / Android browser bugs + ua = navigator.userAgent.toLowerCase(), + webkit = ua.indexOf('webkit') !== -1, + chrome = ua.indexOf('chrome') !== -1, + phantomjs = ua.indexOf('phantom') !== -1, + android = ua.indexOf('android') !== -1, + android23 = ua.search('android [23]') !== -1, + + mobile = typeof orientation !== undefined + '', + msTouch = window.navigator && window.navigator.msPointerEnabled && + window.navigator.msMaxTouchPoints, + retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || + ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && + window.matchMedia('(min-resolution:144dpi)').matches), + + doc = document.documentElement, + ie3d = ie && ('transition' in doc.style), + webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()), + gecko3d = 'MozPerspective' in doc.style, + opera3d = 'OTransition' in doc.style, + any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; + + + // PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch. + // https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151 + + var touch = !window.L_NO_TOUCH && !phantomjs && (function () { + + var startName = 'ontouchstart'; + + // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.MsTouch) or WebKit, etc. + if (msTouch || (startName in doc)) { + return true; + } + + // Firefox/Gecko + var div = document.createElement('div'), + supported = false; + + if (!div.setAttribute) { + return false; + } + div.setAttribute(startName, 'return;'); + + if (typeof div[startName] === 'function') { + supported = true; + } + + div.removeAttribute(startName); + div = null; + + return supported; + }()); + + + L.Browser = { + ie: ie, + ie6: ie6, + ie7: ie7, + ielt9: ielt9, + webkit: webkit, + + android: android, + android23: android23, + + chrome: chrome, + + ie3d: ie3d, + webkit3d: webkit3d, + gecko3d: gecko3d, + opera3d: opera3d, + any3d: any3d, + + mobile: mobile, + mobileWebkit: mobile && webkit, + mobileWebkit3d: mobile && webkit3d, + mobileOpera: mobile && window.opera, + + touch: touch, + msTouch: msTouch, + + retina: retina + }; + +}()); + + +/* + * L.Point represents a point with x and y coordinates. + */ + +L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) { + this.x = (round ? Math.round(x) : x); + this.y = (round ? Math.round(y) : y); +}; + +L.Point.prototype = { + + clone: function () { + return new L.Point(this.x, this.y); + }, + + // non-destructive, returns a new point + add: function (point) { + return this.clone()._add(L.point(point)); + }, + + // destructive, used directly for performance in situations where it's safe to modify existing point + _add: function (point) { + this.x += point.x; + this.y += point.y; + return this; + }, + + subtract: function (point) { + return this.clone()._subtract(L.point(point)); + }, + + _subtract: function (point) { + this.x -= point.x; + this.y -= point.y; + return this; + }, + + divideBy: function (num) { + return this.clone()._divideBy(num); + }, + + _divideBy: function (num) { + this.x /= num; + this.y /= num; + return this; + }, + + multiplyBy: function (num) { + return this.clone()._multiplyBy(num); + }, + + _multiplyBy: function (num) { + this.x *= num; + this.y *= num; + return this; + }, + + round: function () { + return this.clone()._round(); + }, + + _round: function () { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + }, + + floor: function () { + return this.clone()._floor(); + }, + + _floor: function () { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this; + }, + + distanceTo: function (point) { + point = L.point(point); + + var x = point.x - this.x, + y = point.y - this.y; + + return Math.sqrt(x * x + y * y); + }, + + equals: function (point) { + point = L.point(point); + + return point.x === this.x && + point.y === this.y; + }, + + contains: function (point) { + point = L.point(point); + + return Math.abs(point.x) <= Math.abs(this.x) && + Math.abs(point.y) <= Math.abs(this.y); + }, + + toString: function () { + return 'Point(' + + L.Util.formatNum(this.x) + ', ' + + L.Util.formatNum(this.y) + ')'; + } +}; + +L.point = function (x, y, round) { + if (x instanceof L.Point) { + return x; + } + if (L.Util.isArray(x)) { + return new L.Point(x[0], x[1]); + } + if (x === undefined || x === null) { + return x; + } + return new L.Point(x, y, round); +}; + + +/* + * L.Bounds represents a rectangular area on the screen in pixel coordinates. + */ + +L.Bounds = function (a, b) { //(Point, Point) or Point[] + if (!a) { return; } + + var points = b ? [a, b] : a; + + for (var i = 0, len = points.length; i < len; i++) { + this.extend(points[i]); + } +}; + +L.Bounds.prototype = { + // extend the bounds to contain the given point + extend: function (point) { // (Point) + point = L.point(point); + + if (!this.min && !this.max) { + this.min = point.clone(); + this.max = point.clone(); + } else { + this.min.x = Math.min(point.x, this.min.x); + this.max.x = Math.max(point.x, this.max.x); + this.min.y = Math.min(point.y, this.min.y); + this.max.y = Math.max(point.y, this.max.y); + } + return this; + }, + + getCenter: function (round) { // (Boolean) -> Point + return new L.Point( + (this.min.x + this.max.x) / 2, + (this.min.y + this.max.y) / 2, round); + }, + + getBottomLeft: function () { // -> Point + return new L.Point(this.min.x, this.max.y); + }, + + getTopRight: function () { // -> Point + return new L.Point(this.max.x, this.min.y); + }, + + getSize: function () { + return this.max.subtract(this.min); + }, + + contains: function (obj) { // (Bounds) or (Point) -> Boolean + var min, max; + + if (typeof obj[0] === 'number' || obj instanceof L.Point) { + obj = L.point(obj); + } else { + obj = L.bounds(obj); + } + + if (obj instanceof L.Bounds) { + min = obj.min; + max = obj.max; + } else { + min = max = obj; + } + + return (min.x >= this.min.x) && + (max.x <= this.max.x) && + (min.y >= this.min.y) && + (max.y <= this.max.y); + }, + + intersects: function (bounds) { // (Bounds) -> Boolean + bounds = L.bounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xIntersects = (max2.x >= min.x) && (min2.x <= max.x), + yIntersects = (max2.y >= min.y) && (min2.y <= max.y); + + return xIntersects && yIntersects; + }, + + isValid: function () { + return !!(this.min && this.max); + } +}; + +L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[]) + if (!a || a instanceof L.Bounds) { + return a; + } + return new L.Bounds(a, b); +}; + + +/* + * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix. + */ + +L.Transformation = function (a, b, c, d) { + this._a = a; + this._b = b; + this._c = c; + this._d = d; +}; + +L.Transformation.prototype = { + transform: function (point, scale) { // (Point, Number) -> Point + return this._transform(point.clone(), scale); + }, + + // destructive transform (faster) + _transform: function (point, scale) { + scale = scale || 1; + point.x = scale * (this._a * point.x + this._b); + point.y = scale * (this._c * point.y + this._d); + return point; + }, + + untransform: function (point, scale) { + scale = scale || 1; + return new L.Point( + (point.x / scale - this._b) / this._a, + (point.y / scale - this._d) / this._c); + } +}; + + +/* + * L.DomUtil contains various utility functions for working with DOM. + */ + +L.DomUtil = { + get: function (id) { + return (typeof id === 'string' ? document.getElementById(id) : id); + }, + + getStyle: function (el, style) { + + var value = el.style[style]; + + if (!value && el.currentStyle) { + value = el.currentStyle[style]; + } + + if ((!value || value === 'auto') && document.defaultView) { + var css = document.defaultView.getComputedStyle(el, null); + value = css ? css[style] : null; + } + + return value === 'auto' ? null : value; + }, + + getViewportOffset: function (element) { + + var top = 0, + left = 0, + el = element, + docBody = document.body, + docEl = document.documentElement, + pos, + ie7 = L.Browser.ie7; + + do { + top += el.offsetTop || 0; + left += el.offsetLeft || 0; + + //add borders + top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0; + left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0; + + pos = L.DomUtil.getStyle(el, 'position'); + + if (el.offsetParent === docBody && pos === 'absolute') { break; } + + if (pos === 'fixed') { + top += docBody.scrollTop || docEl.scrollTop || 0; + left += docBody.scrollLeft || docEl.scrollLeft || 0; + break; + } + + if (pos === 'relative' && !el.offsetLeft) { + var width = L.DomUtil.getStyle(el, 'width'), + maxWidth = L.DomUtil.getStyle(el, 'max-width'), + r = el.getBoundingClientRect(); + + if (width !== 'none' || maxWidth !== 'none') { + left += r.left + el.clientLeft; + } + + //calculate full y offset since we're breaking out of the loop + top += r.top + (docBody.scrollTop || docEl.scrollTop || 0); + + break; + } + + el = el.offsetParent; + + } while (el); + + el = element; + + do { + if (el === docBody) { break; } + + top -= el.scrollTop || 0; + left -= el.scrollLeft || 0; + + // webkit (and ie <= 7) handles RTL scrollLeft different to everyone else + // https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js + if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) { + left += el.scrollWidth - el.clientWidth; + + // ie7 shows the scrollbar by default and provides clientWidth counting it, so we + // need to add it back in if it is visible; scrollbar is on the left as we are RTL + if (ie7 && L.DomUtil.getStyle(el, 'overflow-y') !== 'hidden' && + L.DomUtil.getStyle(el, 'overflow') !== 'hidden') { + left += 17; + } + } + + el = el.parentNode; + } while (el); + + return new L.Point(left, top); + }, + + documentIsLtr: function () { + if (!L.DomUtil._docIsLtrCached) { + L.DomUtil._docIsLtrCached = true; + L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr'; + } + return L.DomUtil._docIsLtr; + }, + + create: function (tagName, className, container) { + + var el = document.createElement(tagName); + el.className = className; + + if (container) { + container.appendChild(el); + } + + return el; + }, + + hasClass: function (el, name) { + return (el.className.length > 0) && + new RegExp('(^|\\s)' + name + '(\\s|$)').test(el.className); + }, + + addClass: function (el, name) { + if (!L.DomUtil.hasClass(el, name)) { + el.className += (el.className ? ' ' : '') + name; + } + }, + + removeClass: function (el, name) { + el.className = L.Util.trim((' ' + el.className + ' ').replace(' ' + name + ' ', ' ')); + }, + + setOpacity: function (el, value) { + + if ('opacity' in el.style) { + el.style.opacity = value; + + } else if ('filter' in el.style) { + + var filter = false, + filterName = 'DXImageTransform.Microsoft.Alpha'; + + // filters collection throws an error if we try to retrieve a filter that doesn't exist + try { + filter = el.filters.item(filterName); + } catch (e) { + // don't set opacity to 1 if we haven't already set an opacity, + // it isn't needed and breaks transparent pngs. + if (value === 1) { return; } + } + + value = Math.round(value * 100); + + if (filter) { + filter.Enabled = (value !== 100); + filter.Opacity = value; + } else { + el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; + } + } + }, + + testProp: function (props) { + + var style = document.documentElement.style; + + for (var i = 0; i < props.length; i++) { + if (props[i] in style) { + return props[i]; + } + } + return false; + }, + + getTranslateString: function (point) { + // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate + // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care + // (same speed either way), Opera 12 doesn't support translate3d + + var is3d = L.Browser.webkit3d, + open = 'translate' + (is3d ? '3d' : '') + '(', + close = (is3d ? ',0' : '') + ')'; + + return open + point.x + 'px,' + point.y + 'px' + close; + }, + + getScaleString: function (scale, origin) { + + var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))), + scaleStr = ' scale(' + scale + ') '; + + return preTranslateStr + scaleStr; + }, + + setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean]) + + // jshint camelcase: false + el._leaflet_pos = point; + + if (!disable3D && L.Browser.any3d) { + el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point); + + // workaround for Android 2/3 stability (https://github.com/CloudMade/Leaflet/issues/69) + if (L.Browser.mobileWebkit3d) { + el.style.WebkitBackfaceVisibility = 'hidden'; + } + } else { + el.style.left = point.x + 'px'; + el.style.top = point.y + 'px'; + } + }, + + getPosition: function (el) { + // this method is only used for elements previously positioned using setPosition, + // so it's safe to cache the position for performance + + // jshint camelcase: false + return el._leaflet_pos; + } +}; + + +// prefix style property names + +L.DomUtil.TRANSFORM = L.DomUtil.testProp( + ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + +// webkitTransition comes first because some browser versions that drop vendor prefix don't do +// the same for the transitionend event, in particular the Android 4.1 stock browser + +L.DomUtil.TRANSITION = L.DomUtil.testProp( + ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + +L.DomUtil.TRANSITION_END = + L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ? + L.DomUtil.TRANSITION + 'End' : 'transitionend'; + +(function () { + var userSelectProperty = L.DomUtil.testProp( + ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + + L.extend(L.DomUtil, { + disableTextSelection: function () { + L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); + if (userSelectProperty) { + var style = document.documentElement.style; + this._userSelect = style[userSelectProperty]; + style[userSelectProperty] = 'none'; + } + }, + + enableTextSelection: function () { + L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); + if (userSelectProperty) { + document.documentElement.style[userSelectProperty] = this._userSelect; + delete this._userSelect; + } + }, + + disableImageDrag: function () { + L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); + }, + + enableImageDrag: function () { + L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); + } + }); +})(); + + +/* + * L.LatLng represents a geographical point with latitude and longitude coordinates. + */ + +L.LatLng = function (rawLat, rawLng) { // (Number, Number) + var lat = parseFloat(rawLat), + lng = parseFloat(rawLng); + + if (isNaN(lat) || isNaN(lng)) { + throw new Error('Invalid LatLng object: (' + rawLat + ', ' + rawLng + ')'); + } + + this.lat = lat; + this.lng = lng; +}; + +L.extend(L.LatLng, { + DEG_TO_RAD: Math.PI / 180, + RAD_TO_DEG: 180 / Math.PI, + MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check +}); + +L.LatLng.prototype = { + equals: function (obj) { // (LatLng) -> Boolean + if (!obj) { return false; } + + obj = L.latLng(obj); + + var margin = Math.max( + Math.abs(this.lat - obj.lat), + Math.abs(this.lng - obj.lng)); + + return margin <= L.LatLng.MAX_MARGIN; + }, + + toString: function (precision) { // (Number) -> String + return 'LatLng(' + + L.Util.formatNum(this.lat, precision) + ', ' + + L.Util.formatNum(this.lng, precision) + ')'; + }, + + // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula + // TODO move to projection code, LatLng shouldn't know about Earth + distanceTo: function (other) { // (LatLng) -> Number + other = L.latLng(other); + + var R = 6378137, // earth radius in meters + d2r = L.LatLng.DEG_TO_RAD, + dLat = (other.lat - this.lat) * d2r, + dLon = (other.lng - this.lng) * d2r, + lat1 = this.lat * d2r, + lat2 = other.lat * d2r, + sin1 = Math.sin(dLat / 2), + sin2 = Math.sin(dLon / 2); + + var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2); + + return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + }, + + wrap: function (a, b) { // (Number, Number) -> LatLng + var lng = this.lng; + + a = a || -180; + b = b || 180; + + lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a); + + return new L.LatLng(this.lat, lng); + } +}; + +L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number) + if (a instanceof L.LatLng) { + return a; + } + if (L.Util.isArray(a)) { + return new L.LatLng(a[0], a[1]); + } + if (a === undefined || a === null) { + return a; + } + if (typeof a === 'object' && 'lat' in a) { + return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon); + } + return new L.LatLng(a, b); +}; + + + +/* + * L.LatLngBounds represents a rectangular area on the map in geographical coordinates. + */ + +L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[]) + if (!southWest) { return; } + + var latlngs = northEast ? [southWest, northEast] : southWest; + + for (var i = 0, len = latlngs.length; i < len; i++) { + this.extend(latlngs[i]); + } +}; + +L.LatLngBounds.prototype = { + // extend the bounds to contain the given point or bounds + extend: function (obj) { // (LatLng) or (LatLngBounds) + if (!obj) { return this; } + + if (typeof obj[0] === 'number' || typeof obj[0] === 'string' || obj instanceof L.LatLng) { + obj = L.latLng(obj); + } else { + obj = L.latLngBounds(obj); + } + + if (obj instanceof L.LatLng) { + if (!this._southWest && !this._northEast) { + this._southWest = new L.LatLng(obj.lat, obj.lng); + this._northEast = new L.LatLng(obj.lat, obj.lng); + } else { + this._southWest.lat = Math.min(obj.lat, this._southWest.lat); + this._southWest.lng = Math.min(obj.lng, this._southWest.lng); + + this._northEast.lat = Math.max(obj.lat, this._northEast.lat); + this._northEast.lng = Math.max(obj.lng, this._northEast.lng); + } + } else if (obj instanceof L.LatLngBounds) { + this.extend(obj._southWest); + this.extend(obj._northEast); + } + return this; + }, + + // extend the bounds by a percentage + pad: function (bufferRatio) { // (Number) -> LatLngBounds + var sw = this._southWest, + ne = this._northEast, + heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, + widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; + + return new L.LatLngBounds( + new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), + new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); + }, + + getCenter: function () { // -> LatLng + return new L.LatLng( + (this._southWest.lat + this._northEast.lat) / 2, + (this._southWest.lng + this._northEast.lng) / 2); + }, + + getSouthWest: function () { + return this._southWest; + }, + + getNorthEast: function () { + return this._northEast; + }, + + getNorthWest: function () { + return new L.LatLng(this.getNorth(), this.getWest()); + }, + + getSouthEast: function () { + return new L.LatLng(this.getSouth(), this.getEast()); + }, + + getWest: function () { + return this._southWest.lng; + }, + + getSouth: function () { + return this._southWest.lat; + }, + + getEast: function () { + return this._northEast.lng; + }, + + getNorth: function () { + return this._northEast.lat; + }, + + contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean + if (typeof obj[0] === 'number' || obj instanceof L.LatLng) { + obj = L.latLng(obj); + } else { + obj = L.latLngBounds(obj); + } + + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; + + if (obj instanceof L.LatLngBounds) { + sw2 = obj.getSouthWest(); + ne2 = obj.getNorthEast(); + } else { + sw2 = ne2 = obj; + } + + return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && + (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); + }, + + intersects: function (bounds) { // (LatLngBounds) + bounds = L.latLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), + lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); + + return latIntersects && lngIntersects; + }, + + toBBoxString: function () { + return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); + }, + + equals: function (bounds) { // (LatLngBounds) + if (!bounds) { return false; } + + bounds = L.latLngBounds(bounds); + + return this._southWest.equals(bounds.getSouthWest()) && + this._northEast.equals(bounds.getNorthEast()); + }, + + isValid: function () { + return !!(this._southWest && this._northEast); + } +}; + +//TODO International date line? + +L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) + if (!a || a instanceof L.LatLngBounds) { + return a; + } + return new L.LatLngBounds(a, b); +}; + + +/* + * L.Projection contains various geographical projections used by CRS classes. + */ + +L.Projection = {}; + + +/* + * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default. + */ + +L.Projection.SphericalMercator = { + MAX_LATITUDE: 85.0511287798, + + project: function (latlng) { // (LatLng) -> Point + var d = L.LatLng.DEG_TO_RAD, + max = this.MAX_LATITUDE, + lat = Math.max(Math.min(max, latlng.lat), -max), + x = latlng.lng * d, + y = lat * d; + + y = Math.log(Math.tan((Math.PI / 4) + (y / 2))); + + return new L.Point(x, y); + }, + + unproject: function (point) { // (Point, Boolean) -> LatLng + var d = L.LatLng.RAD_TO_DEG, + lng = point.x * d, + lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d; + + return new L.LatLng(lat, lng); + } +}; + + +/* + * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple. + */ + +L.Projection.LonLat = { + project: function (latlng) { + return new L.Point(latlng.lng, latlng.lat); + }, + + unproject: function (point) { + return new L.LatLng(point.y, point.x); + } +}; + + +/* + * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet. + */ + +L.CRS = { + latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point + var projectedPoint = this.projection.project(latlng), + scale = this.scale(zoom); + + return this.transformation._transform(projectedPoint, scale); + }, + + pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng + var scale = this.scale(zoom), + untransformedPoint = this.transformation.untransform(point, scale); + + return this.projection.unproject(untransformedPoint); + }, + + project: function (latlng) { + return this.projection.project(latlng); + }, + + scale: function (zoom) { + return 256 * Math.pow(2, zoom); + } +}; + + +/* + * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps. + */ + +L.CRS.Simple = L.extend({}, L.CRS, { + projection: L.Projection.LonLat, + transformation: new L.Transformation(1, 0, -1, 0), + + scale: function (zoom) { + return Math.pow(2, zoom); + } +}); + + +/* + * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping + * and is used by Leaflet by default. + */ + +L.CRS.EPSG3857 = L.extend({}, L.CRS, { + code: 'EPSG:3857', + + projection: L.Projection.SphericalMercator, + transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5), + + project: function (latlng) { // (LatLng) -> Point + var projectedPoint = this.projection.project(latlng), + earthRadius = 6378137; + return projectedPoint.multiplyBy(earthRadius); + } +}); + +L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { + code: 'EPSG:900913' +}); + + +/* + * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists. + */ + +L.CRS.EPSG4326 = L.extend({}, L.CRS, { + code: 'EPSG:4326', + + projection: L.Projection.LonLat, + transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5) +}); + + +/* + * L.Map is the central class of the API - it is used to create a map. + */ + +L.Map = L.Class.extend({ + + includes: L.Mixin.Events, + + options: { + crs: L.CRS.EPSG3857, + + /* + center: LatLng, + zoom: Number, + layers: Array, + */ + + fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23, + trackResize: true, + markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d + }, + + initialize: function (id, options) { // (HTMLElement or String, Object) + options = L.setOptions(this, options); + + this._initContainer(id); + this._initLayout(); + this._initEvents(); + + if (options.maxBounds) { + this.setMaxBounds(options.maxBounds); + } + + if (options.center && options.zoom !== undefined) { + this.setView(L.latLng(options.center), options.zoom, {reset: true}); + } + + this._handlers = []; + + this._layers = {}; + this._zoomBoundLayers = {}; + this._tileLayersNum = 0; + + this.callInitHooks(); + + this._addLayers(options.layers); + }, + + + // public methods that modify map state + + // replaced by animation-powered implementation in Map.PanAnimation.js + setView: function (center, zoom) { + this._resetView(L.latLng(center), this._limitZoom(zoom)); + return this; + }, + + setZoom: function (zoom, options) { + return this.setView(this.getCenter(), zoom, {zoom: options}); + }, + + zoomIn: function (delta, options) { + return this.setZoom(this._zoom + (delta || 1), options); + }, + + zoomOut: function (delta, options) { + return this.setZoom(this._zoom - (delta || 1), options); + }, + + setZoomAround: function (latlng, zoom, options) { + var scale = this.getZoomScale(zoom), + viewHalf = this.getSize().divideBy(2), + containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng), + + centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale), + newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); + + return this.setView(newCenter, zoom, {zoom: options}); + }, + + fitBounds: function (bounds, options) { + + options = options || {}; + bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds); + + var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]), + paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]), + + zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)), + paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), + + swPoint = this.project(bounds.getSouthWest(), zoom), + nePoint = this.project(bounds.getNorthEast(), zoom), + center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); + + return this.setView(center, zoom, options); + }, + + fitWorld: function (options) { + return this.fitBounds([[-90, -180], [90, 180]], options); + }, + + panTo: function (center, options) { // (LatLng) + return this.setView(center, this._zoom, {pan: options}); + }, + + panBy: function (offset) { // (Point) + // replaced with animated panBy in Map.Animation.js + this.fire('movestart'); + + this._rawPanBy(L.point(offset)); + + this.fire('move'); + return this.fire('moveend'); + }, + + setMaxBounds: function (bounds, options) { + bounds = L.latLngBounds(bounds); + + this.options.maxBounds = bounds; + + if (!bounds) { + this._boundsMinZoom = null; + this.off('moveend', this._panInsideMaxBounds, this); + return this; + } + + var minZoom = this.getBoundsZoom(bounds, true); + + this._boundsMinZoom = minZoom; + + if (this._loaded) { + if (this._zoom < minZoom) { + this.setView(bounds.getCenter(), minZoom, options); + } else { + this.panInsideBounds(bounds); + } + } + + this.on('moveend', this._panInsideMaxBounds, this); + + return this; + }, + + panInsideBounds: function (bounds) { + bounds = L.latLngBounds(bounds); + + var viewBounds = this.getPixelBounds(), + viewSw = viewBounds.getBottomLeft(), + viewNe = viewBounds.getTopRight(), + sw = this.project(bounds.getSouthWest()), + ne = this.project(bounds.getNorthEast()), + dx = 0, + dy = 0; + + if (viewNe.y < ne.y) { // north + dy = Math.ceil(ne.y - viewNe.y); + } + if (viewNe.x > ne.x) { // east + dx = Math.floor(ne.x - viewNe.x); + } + if (viewSw.y > sw.y) { // south + dy = Math.floor(sw.y - viewSw.y); + } + if (viewSw.x < sw.x) { // west + dx = Math.ceil(sw.x - viewSw.x); + } + + if (dx || dy) { + return this.panBy([dx, dy]); + } + + return this; + }, + + addLayer: function (layer) { + // TODO method is too big, refactor + + var id = L.stamp(layer); + + if (this._layers[id]) { return this; } + + this._layers[id] = layer; + + // TODO getMaxZoom, getMinZoom in ILayer (instead of options) + if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) { + this._zoomBoundLayers[id] = layer; + this._updateZoomLevels(); + } + + // TODO looks ugly, refactor!!! + if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { + this._tileLayersNum++; + this._tileLayersToLoad++; + layer.on('load', this._onTileLayerLoad, this); + } + + if (this._loaded) { + this._layerAdd(layer); + } + + return this; + }, + + removeLayer: function (layer) { + var id = L.stamp(layer); + + if (!this._layers[id]) { return; } + + if (this._loaded) { + layer.onRemove(this); + } + + delete this._layers[id]; + + if (this._loaded) { + this.fire('layerremove', {layer: layer}); + } + + if (this._zoomBoundLayers[id]) { + delete this._zoomBoundLayers[id]; + this._updateZoomLevels(); + } + + // TODO looks ugly, refactor + if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { + this._tileLayersNum--; + this._tileLayersToLoad--; + layer.off('load', this._onTileLayerLoad, this); + } + + return this; + }, + + hasLayer: function (layer) { + if (!layer) { return false; } + + return (L.stamp(layer) in this._layers); + }, + + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + invalidateSize: function (options) { + options = L.extend({ + animate: false, + pan: true + }, options === true ? {animate: true} : options); + + var oldSize = this.getSize(); + this._sizeChanged = true; + + if (this.options.maxBounds) { + this.setMaxBounds(this.options.maxBounds); + } + + if (!this._loaded) { return this; } + + var newSize = this.getSize(), + offset = oldSize.subtract(newSize).divideBy(2).round(); + + if (!offset.x && !offset.y) { return this; } + + if (options.animate && options.pan) { + this.panBy(offset); + + } else { + if (options.pan) { + this._rawPanBy(offset); + } + + this.fire('move'); + + // make sure moveend is not fired too often on resize + clearTimeout(this._sizeTimer); + this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); + } + + return this.fire('resize', { + oldSize: oldSize, + newSize: newSize + }); + }, + + // TODO handler.addTo + addHandler: function (name, HandlerClass) { + if (!HandlerClass) { return; } + + var handler = this[name] = new HandlerClass(this); + + this._handlers.push(handler); + + if (this.options[name]) { + handler.enable(); + } + + return this; + }, + + remove: function () { + if (this._loaded) { + this.fire('unload'); + } + + this._initEvents('off'); + + delete this._container._leaflet; + + this._clearPanes(); + if (this._clearControlPos) { + this._clearControlPos(); + } + + this._clearHandlers(); + + return this; + }, + + + // public methods for getting map state + + getCenter: function () { // (Boolean) -> LatLng + this._checkIfLoaded(); + + if (!this._moved()) { + return this._initialCenter; + } + return this.layerPointToLatLng(this._getCenterLayerPoint()); + }, + + getZoom: function () { + return this._zoom; + }, + + getBounds: function () { + var bounds = this.getPixelBounds(), + sw = this.unproject(bounds.getBottomLeft()), + ne = this.unproject(bounds.getTopRight()); + + return new L.LatLngBounds(sw, ne); + }, + + getMinZoom: function () { + var z1 = this._layersMinZoom === undefined ? 0 : this._layersMinZoom, + z2 = this._boundsMinZoom === undefined ? 0 : this._boundsMinZoom; + return this.options.minZoom === undefined ? Math.max(z1, z2) : this.options.minZoom; + }, + + getMaxZoom: function () { + return this.options.maxZoom === undefined ? + (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : + this.options.maxZoom; + }, + + getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number + bounds = L.latLngBounds(bounds); + + var zoom = this.getMinZoom() - (inside ? 1 : 0), + maxZoom = this.getMaxZoom(), + size = this.getSize(), + + nw = bounds.getNorthWest(), + se = bounds.getSouthEast(), + + zoomNotFound = true, + boundsSize; + + padding = L.point(padding || [0, 0]); + + do { + zoom++; + boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); + zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; + + } while (zoomNotFound && zoom <= maxZoom); + + if (zoomNotFound && inside) { + return null; + } + + return inside ? zoom : zoom - 1; + }, + + getSize: function () { + if (!this._size || this._sizeChanged) { + this._size = new L.Point( + this._container.clientWidth, + this._container.clientHeight); + + this._sizeChanged = false; + } + return this._size.clone(); + }, + + getPixelBounds: function () { + var topLeftPoint = this._getTopLeftPoint(); + return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); + }, + + getPixelOrigin: function () { + this._checkIfLoaded(); + return this._initialTopLeftPoint; + }, + + getPanes: function () { + return this._panes; + }, + + getContainer: function () { + return this._container; + }, + + + // TODO replace with universal implementation after refactoring projections + + getZoomScale: function (toZoom) { + var crs = this.options.crs; + return crs.scale(toZoom) / crs.scale(this._zoom); + }, + + getScaleZoom: function (scale) { + return this._zoom + (Math.log(scale) / Math.LN2); + }, + + + // conversion methods + + project: function (latlng, zoom) { // (LatLng[, Number]) -> Point + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.latLngToPoint(L.latLng(latlng), zoom); + }, + + unproject: function (point, zoom) { // (Point[, Number]) -> LatLng + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.pointToLatLng(L.point(point), zoom); + }, + + layerPointToLatLng: function (point) { // (Point) + var projectedPoint = L.point(point).add(this.getPixelOrigin()); + return this.unproject(projectedPoint); + }, + + latLngToLayerPoint: function (latlng) { // (LatLng) + var projectedPoint = this.project(L.latLng(latlng))._round(); + return projectedPoint._subtract(this.getPixelOrigin()); + }, + + containerPointToLayerPoint: function (point) { // (Point) + return L.point(point).subtract(this._getMapPanePos()); + }, + + layerPointToContainerPoint: function (point) { // (Point) + return L.point(point).add(this._getMapPanePos()); + }, + + containerPointToLatLng: function (point) { + var layerPoint = this.containerPointToLayerPoint(L.point(point)); + return this.layerPointToLatLng(layerPoint); + }, + + latLngToContainerPoint: function (latlng) { + return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng))); + }, + + mouseEventToContainerPoint: function (e) { // (MouseEvent) + return L.DomEvent.getMousePosition(e, this._container); + }, + + mouseEventToLayerPoint: function (e) { // (MouseEvent) + return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); + }, + + mouseEventToLatLng: function (e) { // (MouseEvent) + return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); + }, + + + // map initialization methods + + _initContainer: function (id) { + var container = this._container = L.DomUtil.get(id); + + if (!container) { + throw new Error('Map container not found.'); + } else if (container._leaflet) { + throw new Error('Map container is already initialized.'); + } + + container._leaflet = true; + }, + + _initLayout: function () { + var container = this._container; + + L.DomUtil.addClass(container, 'leaflet-container' + + (L.Browser.touch ? ' leaflet-touch' : '') + + (L.Browser.retina ? ' leaflet-retina' : '') + + (this.options.fadeAnimation ? ' leaflet-fade-anim' : '')); + + var position = L.DomUtil.getStyle(container, 'position'); + + if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { + container.style.position = 'relative'; + } + + this._initPanes(); + + if (this._initControlPos) { + this._initControlPos(); + } + }, + + _initPanes: function () { + var panes = this._panes = {}; + + this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container); + + this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane); + panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane); + panes.shadowPane = this._createPane('leaflet-shadow-pane'); + panes.overlayPane = this._createPane('leaflet-overlay-pane'); + panes.markerPane = this._createPane('leaflet-marker-pane'); + panes.popupPane = this._createPane('leaflet-popup-pane'); + + var zoomHide = ' leaflet-zoom-hide'; + + if (!this.options.markerZoomAnimation) { + L.DomUtil.addClass(panes.markerPane, zoomHide); + L.DomUtil.addClass(panes.shadowPane, zoomHide); + L.DomUtil.addClass(panes.popupPane, zoomHide); + } + }, + + _createPane: function (className, container) { + return L.DomUtil.create('div', className, container || this._panes.objectsPane); + }, + + _clearPanes: function () { + this._container.removeChild(this._mapPane); + }, + + _addLayers: function (layers) { + layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; + + for (var i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + }, + + + // private methods that modify map state + + _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) { + + var zoomChanged = (this._zoom !== zoom); + + if (!afterZoomAnim) { + this.fire('movestart'); + + if (zoomChanged) { + this.fire('zoomstart'); + } + } + + this._zoom = zoom; + this._initialCenter = center; + + this._initialTopLeftPoint = this._getNewTopLeftPoint(center); + + if (!preserveMapOffset) { + L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); + } else { + this._initialTopLeftPoint._add(this._getMapPanePos()); + } + + this._tileLayersToLoad = this._tileLayersNum; + + var loading = !this._loaded; + this._loaded = true; + + if (loading) { + this.fire('load'); + this.eachLayer(this._layerAdd, this); + } + + this.fire('viewreset', {hard: !preserveMapOffset}); + + this.fire('move'); + + if (zoomChanged || afterZoomAnim) { + this.fire('zoomend'); + } + + this.fire('moveend', {hard: !preserveMapOffset}); + }, + + _rawPanBy: function (offset) { + L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); + }, + + _getZoomSpan: function () { + return this.getMaxZoom() - this.getMinZoom(); + }, + + _updateZoomLevels: function () { + var i, + minZoom = Infinity, + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); + + for (i in this._zoomBoundLayers) { + var layer = this._zoomBoundLayers[i]; + if (!isNaN(layer.options.minZoom)) { + minZoom = Math.min(minZoom, layer.options.minZoom); + } + if (!isNaN(layer.options.maxZoom)) { + maxZoom = Math.max(maxZoom, layer.options.maxZoom); + } + } + + if (i === undefined) { // we have no tilelayers + this._layersMaxZoom = this._layersMinZoom = undefined; + } else { + this._layersMaxZoom = maxZoom; + this._layersMinZoom = minZoom; + } + + if (oldZoomSpan !== this._getZoomSpan()) { + this.fire('zoomlevelschange'); + } + }, + + _panInsideMaxBounds: function () { + this.panInsideBounds(this.options.maxBounds); + }, + + _checkIfLoaded: function () { + if (!this._loaded) { + throw new Error('Set map center and zoom first.'); + } + }, + + // map events + + _initEvents: function (onOff) { + if (!L.DomEvent) { return; } + + onOff = onOff || 'on'; + + L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this); + + var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter', + 'mouseleave', 'mousemove', 'contextmenu'], + i, len; + + for (i = 0, len = events.length; i < len; i++) { + L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this); + } + + if (this.options.trackResize) { + L.DomEvent[onOff](window, 'resize', this._onResize, this); + } + }, + + _onResize: function () { + L.Util.cancelAnimFrame(this._resizeRequest); + this._resizeRequest = L.Util.requestAnimFrame( + this.invalidateSize, this, false, this._container); + }, + + _onMouseClick: function (e) { + if (!this._loaded || (!e._simulated && this.dragging && this.dragging.moved()) || + L.DomEvent._skipped(e)) { return; } + + this.fire('preclick'); + this._fireMouseEvent(e); + }, + + _fireMouseEvent: function (e) { + if (!this._loaded || L.DomEvent._skipped(e)) { return; } + + var type = e.type; + + type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type)); + + if (!this.hasEventListeners(type)) { return; } + + if (type === 'contextmenu') { + L.DomEvent.preventDefault(e); + } + + var containerPoint = this.mouseEventToContainerPoint(e), + layerPoint = this.containerPointToLayerPoint(containerPoint), + latlng = this.layerPointToLatLng(layerPoint); + + this.fire(type, { + latlng: latlng, + layerPoint: layerPoint, + containerPoint: containerPoint, + originalEvent: e + }); + }, + + _onTileLayerLoad: function () { + this._tileLayersToLoad--; + if (this._tileLayersNum && !this._tileLayersToLoad) { + this.fire('tilelayersload'); + } + }, + + _clearHandlers: function () { + for (var i = 0, len = this._handlers.length; i < len; i++) { + this._handlers[i].disable(); + } + }, + + whenReady: function (callback, context) { + if (this._loaded) { + callback.call(context || this, this); + } else { + this.on('load', callback, context); + } + return this; + }, + + _layerAdd: function (layer) { + layer.onAdd(this); + this.fire('layeradd', {layer: layer}); + }, + + + // private methods for getting map state + + _getMapPanePos: function () { + return L.DomUtil.getPosition(this._mapPane); + }, + + _moved: function () { + var pos = this._getMapPanePos(); + return pos && !pos.equals([0, 0]); + }, + + _getTopLeftPoint: function () { + return this.getPixelOrigin().subtract(this._getMapPanePos()); + }, + + _getNewTopLeftPoint: function (center, zoom) { + var viewHalf = this.getSize()._divideBy(2); + // TODO round on display, not calculation to increase precision? + return this.project(center, zoom)._subtract(viewHalf)._round(); + }, + + _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) { + var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos()); + return this.project(latlng, newZoom)._subtract(topLeft); + }, + + // layer point of the current center + _getCenterLayerPoint: function () { + return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); + }, + + // offset of the specified place to the current center in pixels + _getCenterOffset: function (latlng) { + return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); + }, + + _limitZoom: function (zoom) { + var min = this.getMinZoom(), + max = this.getMaxZoom(); + + return Math.max(min, Math.min(max, zoom)); + } +}); + +L.map = function (id, options) { + return new L.Map(id, options); +}; + + +/* + * Mercator projection that takes into account that the Earth is not a perfect sphere. + * Less popular than spherical mercator; used by projections like EPSG:3395. + */ + +L.Projection.Mercator = { + MAX_LATITUDE: 85.0840591556, + + R_MINOR: 6356752.314245179, + R_MAJOR: 6378137, + + project: function (latlng) { // (LatLng) -> Point + var d = L.LatLng.DEG_TO_RAD, + max = this.MAX_LATITUDE, + lat = Math.max(Math.min(max, latlng.lat), -max), + r = this.R_MAJOR, + r2 = this.R_MINOR, + x = latlng.lng * d * r, + y = lat * d, + tmp = r2 / r, + eccent = Math.sqrt(1.0 - tmp * tmp), + con = eccent * Math.sin(y); + + con = Math.pow((1 - con) / (1 + con), eccent * 0.5); + + var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con; + y = -r * Math.log(ts); + + return new L.Point(x, y); + }, + + unproject: function (point) { // (Point, Boolean) -> LatLng + var d = L.LatLng.RAD_TO_DEG, + r = this.R_MAJOR, + r2 = this.R_MINOR, + lng = point.x * d / r, + tmp = r2 / r, + eccent = Math.sqrt(1 - (tmp * tmp)), + ts = Math.exp(- point.y / r), + phi = (Math.PI / 2) - 2 * Math.atan(ts), + numIter = 15, + tol = 1e-7, + i = numIter, + dphi = 0.1, + con; + + while ((Math.abs(dphi) > tol) && (--i > 0)) { + con = eccent * Math.sin(phi); + dphi = (Math.PI / 2) - 2 * Math.atan(ts * + Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi; + phi += dphi; + } + + return new L.LatLng(phi * d, lng); + } +}; + + + +L.CRS.EPSG3395 = L.extend({}, L.CRS, { + code: 'EPSG:3395', + + projection: L.Projection.Mercator, + + transformation: (function () { + var m = L.Projection.Mercator, + r = m.R_MAJOR, + r2 = m.R_MINOR; + + return new L.Transformation(0.5 / (Math.PI * r), 0.5, -0.5 / (Math.PI * r2), 0.5); + }()) +}); + + +/* + * L.TileLayer is used for standard xyz-numbered tile layers. + */ + +L.TileLayer = L.Class.extend({ + includes: L.Mixin.Events, + + options: { + minZoom: 0, + maxZoom: 18, + tileSize: 256, + subdomains: 'abc', + errorTileUrl: '', + attribution: '', + zoomOffset: 0, + opacity: 1, + /* (undefined works too) + zIndex: null, + tms: false, + continuousWorld: false, + noWrap: false, + zoomReverse: false, + detectRetina: false, + reuseTiles: false, + bounds: false, + */ + unloadInvisibleTiles: L.Browser.mobile, + updateWhenIdle: L.Browser.mobile + }, + + initialize: function (url, options) { + options = L.setOptions(this, options); + + // detecting retina displays, adjusting tileSize and zoom levels + if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { + + options.tileSize = Math.floor(options.tileSize / 2); + options.zoomOffset++; + + if (options.minZoom > 0) { + options.minZoom--; + } + this.options.maxZoom--; + } + + if (options.bounds) { + options.bounds = L.latLngBounds(options.bounds); + } + + this._url = url; + + var subdomains = this.options.subdomains; + + if (typeof subdomains === 'string') { + this.options.subdomains = subdomains.split(''); + } + }, + + onAdd: function (map) { + this._map = map; + this._animated = map._zoomAnimated; + + // create a container div for tiles + this._initContainer(); + + // create an image to clone for tiles + this._createTileProto(); + + // set up events + map.on({ + 'viewreset': this._reset, + 'moveend': this._update + }, this); + + if (this._animated) { + map.on({ + 'zoomanim': this._animateZoom, + 'zoomend': this._endZoomAnim + }, this); + } + + if (!this.options.updateWhenIdle) { + this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); + map.on('move', this._limitedUpdate, this); + } + + this._reset(); + this._update(); + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + onRemove: function (map) { + this._container.parentNode.removeChild(this._container); + + map.off({ + 'viewreset': this._reset, + 'moveend': this._update + }, this); + + if (this._animated) { + map.off({ + 'zoomanim': this._animateZoom, + 'zoomend': this._endZoomAnim + }, this); + } + + if (!this.options.updateWhenIdle) { + map.off('move', this._limitedUpdate, this); + } + + this._container = null; + this._map = null; + }, + + bringToFront: function () { + var pane = this._map._panes.tilePane; + + if (this._container) { + pane.appendChild(this._container); + this._setAutoZIndex(pane, Math.max); + } + + return this; + }, + + bringToBack: function () { + var pane = this._map._panes.tilePane; + + if (this._container) { + pane.insertBefore(this._container, pane.firstChild); + this._setAutoZIndex(pane, Math.min); + } + + return this; + }, + + getAttribution: function () { + return this.options.attribution; + }, + + getContainer: function () { + return this._container; + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._map) { + this._updateOpacity(); + } + + return this; + }, + + setZIndex: function (zIndex) { + this.options.zIndex = zIndex; + this._updateZIndex(); + + return this; + }, + + setUrl: function (url, noRedraw) { + this._url = url; + + if (!noRedraw) { + this.redraw(); + } + + return this; + }, + + redraw: function () { + if (this._map) { + this._reset({hard: true}); + this._update(); + } + return this; + }, + + _updateZIndex: function () { + if (this._container && this.options.zIndex !== undefined) { + this._container.style.zIndex = this.options.zIndex; + } + }, + + _setAutoZIndex: function (pane, compare) { + + var layers = pane.children, + edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min + zIndex, i, len; + + for (i = 0, len = layers.length; i < len; i++) { + + if (layers[i] !== this._container) { + zIndex = parseInt(layers[i].style.zIndex, 10); + + if (!isNaN(zIndex)) { + edgeZIndex = compare(edgeZIndex, zIndex); + } + } + } + + this.options.zIndex = this._container.style.zIndex = + (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); + }, + + _updateOpacity: function () { + var i, + tiles = this._tiles; + + if (L.Browser.ielt9) { + for (i in tiles) { + L.DomUtil.setOpacity(tiles[i], this.options.opacity); + } + } else { + L.DomUtil.setOpacity(this._container, this.options.opacity); + } + }, + + _initContainer: function () { + var tilePane = this._map._panes.tilePane; + + if (!this._container) { + this._container = L.DomUtil.create('div', 'leaflet-layer'); + + this._updateZIndex(); + + if (this._animated) { + var className = 'leaflet-tile-container leaflet-zoom-animated'; + + this._bgBuffer = L.DomUtil.create('div', className, this._container); + this._tileContainer = L.DomUtil.create('div', className, this._container); + + } else { + this._tileContainer = this._container; + } + + tilePane.appendChild(this._container); + + if (this.options.opacity < 1) { + this._updateOpacity(); + } + } + }, + + _reset: function (e) { + for (var key in this._tiles) { + this.fire('tileunload', {tile: this._tiles[key]}); + } + + this._tiles = {}; + this._tilesToLoad = 0; + + if (this.options.reuseTiles) { + this._unusedTiles = []; + } + + this._tileContainer.innerHTML = ''; + + if (this._animated && e && e.hard) { + this._clearBgBuffer(); + } + + this._initContainer(); + }, + + _update: function () { + + if (!this._map) { return; } + + var bounds = this._map.getPixelBounds(), + zoom = this._map.getZoom(), + tileSize = this.options.tileSize; + + if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { + return; + } + + var tileBounds = L.bounds( + bounds.min.divideBy(tileSize)._floor(), + bounds.max.divideBy(tileSize)._floor()); + + this._addTilesFromCenterOut(tileBounds); + + if (this.options.unloadInvisibleTiles || this.options.reuseTiles) { + this._removeOtherTiles(tileBounds); + } + }, + + _addTilesFromCenterOut: function (bounds) { + var queue = [], + center = bounds.getCenter(); + + var j, i, point; + + for (j = bounds.min.y; j <= bounds.max.y; j++) { + for (i = bounds.min.x; i <= bounds.max.x; i++) { + point = new L.Point(i, j); + + if (this._tileShouldBeLoaded(point)) { + queue.push(point); + } + } + } + + var tilesToLoad = queue.length; + + if (tilesToLoad === 0) { return; } + + // load tiles in order of their distance to center + queue.sort(function (a, b) { + return a.distanceTo(center) - b.distanceTo(center); + }); + + var fragment = document.createDocumentFragment(); + + // if its the first batch of tiles to load + if (!this._tilesToLoad) { + this.fire('loading'); + } + + this._tilesToLoad += tilesToLoad; + + for (i = 0; i < tilesToLoad; i++) { + this._addTile(queue[i], fragment); + } + + this._tileContainer.appendChild(fragment); + }, + + _tileShouldBeLoaded: function (tilePoint) { + if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) { + return false; // already loaded + } + + var options = this.options; + + if (!options.continuousWorld) { + var limit = this._getWrapTileNum(); + + // don't load if exceeds world bounds + if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit)) || + tilePoint.y < 0 || tilePoint.y >= limit) { return false; } + } + + if (options.bounds) { + var tileSize = options.tileSize, + nwPoint = tilePoint.multiplyBy(tileSize), + sePoint = nwPoint.add([tileSize, tileSize]), + nw = this._map.unproject(nwPoint), + se = this._map.unproject(sePoint); + + // TODO temporary hack, will be removed after refactoring projections + // https://github.com/Leaflet/Leaflet/issues/1618 + if (!options.continuousWorld && !options.noWrap) { + nw = nw.wrap(); + se = se.wrap(); + } + + if (!options.bounds.intersects([nw, se])) { return false; } + } + + return true; + }, + + _removeOtherTiles: function (bounds) { + var kArr, x, y, key; + + for (key in this._tiles) { + kArr = key.split(':'); + x = parseInt(kArr[0], 10); + y = parseInt(kArr[1], 10); + + // remove tile if it's out of bounds + if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) { + this._removeTile(key); + } + } + }, + + _removeTile: function (key) { + var tile = this._tiles[key]; + + this.fire('tileunload', {tile: tile, url: tile.src}); + + if (this.options.reuseTiles) { + L.DomUtil.removeClass(tile, 'leaflet-tile-loaded'); + this._unusedTiles.push(tile); + + } else if (tile.parentNode === this._tileContainer) { + this._tileContainer.removeChild(tile); + } + + // for https://github.com/CloudMade/Leaflet/issues/137 + if (!L.Browser.android) { + tile.onload = null; + tile.src = L.Util.emptyImageUrl; + } + + delete this._tiles[key]; + }, + + _addTile: function (tilePoint, container) { + var tilePos = this._getTilePos(tilePoint); + + // get unused tile - or create a new tile + var tile = this._getTile(); + + /* + Chrome 20 layouts much faster with top/left (verify with timeline, frames) + Android 4 browser has display issues with top/left and requires transform instead + Android 2 browser requires top/left or tiles disappear on load or first drag + (reappear after zoom) https://github.com/CloudMade/Leaflet/issues/866 + (other browsers don't currently care) - see debug/hacks/jitter.html for an example + */ + L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome || L.Browser.android23); + + this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; + + this._loadTile(tile, tilePoint); + + if (tile.parentNode !== this._tileContainer) { + container.appendChild(tile); + } + }, + + _getZoomForUrl: function () { + + var options = this.options, + zoom = this._map.getZoom(); + + if (options.zoomReverse) { + zoom = options.maxZoom - zoom; + } + + return zoom + options.zoomOffset; + }, + + _getTilePos: function (tilePoint) { + var origin = this._map.getPixelOrigin(), + tileSize = this.options.tileSize; + + return tilePoint.multiplyBy(tileSize).subtract(origin); + }, + + // image-specific code (override to implement e.g. Canvas or SVG tile layer) + + getTileUrl: function (tilePoint) { + return L.Util.template(this._url, L.extend({ + s: this._getSubdomain(tilePoint), + z: tilePoint.z, + x: tilePoint.x, + y: tilePoint.y + }, this.options)); + }, + + _getWrapTileNum: function () { + // TODO refactor, limit is not valid for non-standard projections + return Math.pow(2, this._getZoomForUrl()); + }, + + _adjustTilePoint: function (tilePoint) { + + var limit = this._getWrapTileNum(); + + // wrap tile coordinates + if (!this.options.continuousWorld && !this.options.noWrap) { + tilePoint.x = ((tilePoint.x % limit) + limit) % limit; + } + + if (this.options.tms) { + tilePoint.y = limit - tilePoint.y - 1; + } + + tilePoint.z = this._getZoomForUrl(); + }, + + _getSubdomain: function (tilePoint) { + var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; + return this.options.subdomains[index]; + }, + + _createTileProto: function () { + var img = this._tileImg = L.DomUtil.create('img', 'leaflet-tile'); + img.style.width = img.style.height = this.options.tileSize + 'px'; + img.galleryimg = 'no'; + }, + + _getTile: function () { + if (this.options.reuseTiles && this._unusedTiles.length > 0) { + var tile = this._unusedTiles.pop(); + this._resetTile(tile); + return tile; + } + return this._createTile(); + }, + + // Override if data stored on a tile needs to be cleaned up before reuse + _resetTile: function (/*tile*/) {}, + + _createTile: function () { + var tile = this._tileImg.cloneNode(false); + tile.onselectstart = tile.onmousemove = L.Util.falseFn; + + if (L.Browser.ielt9 && this.options.opacity !== undefined) { + L.DomUtil.setOpacity(tile, this.options.opacity); + } + return tile; + }, + + _loadTile: function (tile, tilePoint) { + tile._layer = this; + tile.onload = this._tileOnLoad; + tile.onerror = this._tileOnError; + + this._adjustTilePoint(tilePoint); + tile.src = this.getTileUrl(tilePoint); + }, + + _tileLoaded: function () { + this._tilesToLoad--; + if (!this._tilesToLoad) { + this.fire('load'); + + if (this._animated) { + // clear scaled tiles after all new tiles are loaded (for performance) + clearTimeout(this._clearBgBufferTimer); + this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); + } + } + }, + + _tileOnLoad: function () { + var layer = this._layer; + + //Only if we are loading an actual image + if (this.src !== L.Util.emptyImageUrl) { + L.DomUtil.addClass(this, 'leaflet-tile-loaded'); + + layer.fire('tileload', { + tile: this, + url: this.src + }); + } + + layer._tileLoaded(); + }, + + _tileOnError: function () { + var layer = this._layer; + + layer.fire('tileerror', { + tile: this, + url: this.src + }); + + var newUrl = layer.options.errorTileUrl; + if (newUrl) { + this.src = newUrl; + } + + layer._tileLoaded(); + } +}); + +L.tileLayer = function (url, options) { + return new L.TileLayer(url, options); +}; + + +/* + * L.TileLayer.WMS is used for putting WMS tile layers on the map. + */ + +L.TileLayer.WMS = L.TileLayer.extend({ + + defaultWmsParams: { + service: 'WMS', + request: 'GetMap', + version: '1.1.1', + layers: '', + styles: '', + format: 'image/jpeg', + transparent: false + }, + + initialize: function (url, options) { // (String, Object) + + this._url = url; + + var wmsParams = L.extend({}, this.defaultWmsParams), + tileSize = options.tileSize || this.options.tileSize; + + if (options.detectRetina && L.Browser.retina) { + wmsParams.width = wmsParams.height = tileSize * 2; + } else { + wmsParams.width = wmsParams.height = tileSize; + } + + for (var i in options) { + // all keys that are not TileLayer options go to WMS params + if (!this.options.hasOwnProperty(i) && i !== 'crs') { + wmsParams[i] = options[i]; + } + } + + this.wmsParams = wmsParams; + + L.setOptions(this, options); + }, + + onAdd: function (map) { + + this._crs = this.options.crs || map.options.crs; + + var projectionKey = parseFloat(this.wmsParams.version) >= 1.3 ? 'crs' : 'srs'; + this.wmsParams[projectionKey] = this._crs.code; + + L.TileLayer.prototype.onAdd.call(this, map); + }, + + getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String + + var map = this._map, + tileSize = this.options.tileSize, + + nwPoint = tilePoint.multiplyBy(tileSize), + sePoint = nwPoint.add([tileSize, tileSize]), + + nw = this._crs.project(map.unproject(nwPoint, zoom)), + se = this._crs.project(map.unproject(sePoint, zoom)), + + bbox = [nw.x, se.y, se.x, nw.y].join(','), + + url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)}); + + return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox; + }, + + setParams: function (params, noRedraw) { + + L.extend(this.wmsParams, params); + + if (!noRedraw) { + this.redraw(); + } + + return this; + } +}); + +L.tileLayer.wms = function (url, options) { + return new L.TileLayer.WMS(url, options); +}; + + +/* + * L.TileLayer.Canvas is a class that you can use as a base for creating + * dynamically drawn Canvas-based tile layers. + */ + +L.TileLayer.Canvas = L.TileLayer.extend({ + options: { + async: false + }, + + initialize: function (options) { + L.setOptions(this, options); + }, + + redraw: function () { + if (this._map) { + this._reset({hard: true}); + this._update(); + } + + for (var i in this._tiles) { + this._redrawTile(this._tiles[i]); + } + return this; + }, + + _redrawTile: function (tile) { + this.drawTile(tile, tile._tilePoint, this._map._zoom); + }, + + _createTileProto: function () { + var proto = this._canvasProto = L.DomUtil.create('canvas', 'leaflet-tile'); + proto.width = proto.height = this.options.tileSize; + }, + + _createTile: function () { + var tile = this._canvasProto.cloneNode(false); + tile.onselectstart = tile.onmousemove = L.Util.falseFn; + return tile; + }, + + _loadTile: function (tile, tilePoint) { + tile._layer = this; + tile._tilePoint = tilePoint; + + this._redrawTile(tile); + + if (!this.options.async) { + this.tileDrawn(tile); + } + }, + + drawTile: function (/*tile, tilePoint*/) { + // override with rendering code + }, + + tileDrawn: function (tile) { + this._tileOnLoad.call(tile); + } +}); + + +L.tileLayer.canvas = function (options) { + return new L.TileLayer.Canvas(options); +}; + + +/* + * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds). + */ + +L.ImageOverlay = L.Class.extend({ + includes: L.Mixin.Events, + + options: { + opacity: 1 + }, + + initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) + this._url = url; + this._bounds = L.latLngBounds(bounds); + + L.setOptions(this, options); + }, + + onAdd: function (map) { + this._map = map; + + if (!this._image) { + this._initImage(); + } + + map._panes.overlayPane.appendChild(this._image); + + map.on('viewreset', this._reset, this); + + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', this._animateZoom, this); + } + + this._reset(); + }, + + onRemove: function (map) { + map.getPanes().overlayPane.removeChild(this._image); + + map.off('viewreset', this._reset, this); + + if (map.options.zoomAnimation) { + map.off('zoomanim', this._animateZoom, this); + } + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + this._updateOpacity(); + return this; + }, + + // TODO remove bringToFront/bringToBack duplication from TileLayer/Path + bringToFront: function () { + if (this._image) { + this._map._panes.overlayPane.appendChild(this._image); + } + return this; + }, + + bringToBack: function () { + var pane = this._map._panes.overlayPane; + if (this._image) { + pane.insertBefore(this._image, pane.firstChild); + } + return this; + }, + + _initImage: function () { + this._image = L.DomUtil.create('img', 'leaflet-image-layer'); + + if (this._map.options.zoomAnimation && L.Browser.any3d) { + L.DomUtil.addClass(this._image, 'leaflet-zoom-animated'); + } else { + L.DomUtil.addClass(this._image, 'leaflet-zoom-hide'); + } + + this._updateOpacity(); + + //TODO createImage util method to remove duplication + L.extend(this._image, { + galleryimg: 'no', + onselectstart: L.Util.falseFn, + onmousemove: L.Util.falseFn, + onload: L.bind(this._onImageLoad, this), + src: this._url + }); + }, + + _animateZoom: function (e) { + var map = this._map, + image = this._image, + scale = map.getZoomScale(e.zoom), + nw = this._bounds.getNorthWest(), + se = this._bounds.getSouthEast(), + + topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center), + size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft), + origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale))); + + image.style[L.DomUtil.TRANSFORM] = + L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; + }, + + _reset: function () { + var image = this._image, + topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()), + size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft); + + L.DomUtil.setPosition(image, topLeft); + + image.style.width = size.x + 'px'; + image.style.height = size.y + 'px'; + }, + + _onImageLoad: function () { + this.fire('load'); + }, + + _updateOpacity: function () { + L.DomUtil.setOpacity(this._image, this.options.opacity); + } +}); + +L.imageOverlay = function (url, bounds, options) { + return new L.ImageOverlay(url, bounds, options); +}; + + +/* + * L.Icon is an image-based icon class that you can use with L.Marker for custom markers. + */ + +L.Icon = L.Class.extend({ + options: { + /* + iconUrl: (String) (required) + iconRetinaUrl: (String) (optional, used for retina devices if detected) + iconSize: (Point) (can be set through CSS) + iconAnchor: (Point) (centered by default, can be set in CSS with negative margins) + popupAnchor: (Point) (if not specified, popup opens in the anchor point) + shadowUrl: (String) (no shadow by default) + shadowRetinaUrl: (String) (optional, used for retina devices if detected) + shadowSize: (Point) + shadowAnchor: (Point) + */ + className: '' + }, + + initialize: function (options) { + L.setOptions(this, options); + }, + + createIcon: function (oldIcon) { + return this._createIcon('icon', oldIcon); + }, + + createShadow: function (oldIcon) { + return this._createIcon('shadow', oldIcon); + }, + + _createIcon: function (name, oldIcon) { + var src = this._getIconUrl(name); + + if (!src) { + if (name === 'icon') { + throw new Error('iconUrl not set in Icon options (see the docs).'); + } + return null; + } + + var img; + if (!oldIcon || oldIcon.tagName !== 'IMG') { + img = this._createImg(src); + } else { + img = this._createImg(src, oldIcon); + } + this._setIconStyles(img, name); + + return img; + }, + + _setIconStyles: function (img, name) { + var options = this.options, + size = L.point(options[name + 'Size']), + anchor; + + if (name === 'shadow') { + anchor = L.point(options.shadowAnchor || options.iconAnchor); + } else { + anchor = L.point(options.iconAnchor); + } + + if (!anchor && size) { + anchor = size.divideBy(2, true); + } + + img.className = 'leaflet-marker-' + name + ' ' + options.className; + + if (anchor) { + img.style.marginLeft = (-anchor.x) + 'px'; + img.style.marginTop = (-anchor.y) + 'px'; + } + + if (size) { + img.style.width = size.x + 'px'; + img.style.height = size.y + 'px'; + } + }, + + _createImg: function (src, el) { + + if (!L.Browser.ie6) { + if (!el) { + el = document.createElement('img'); + } + el.src = src; + } else { + if (!el) { + el = document.createElement('div'); + } + el.style.filter = + 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")'; + } + return el; + }, + + _getIconUrl: function (name) { + if (L.Browser.retina && this.options[name + 'RetinaUrl']) { + return this.options[name + 'RetinaUrl']; + } + return this.options[name + 'Url']; + } +}); + +L.icon = function (options) { + return new L.Icon(options); +}; + + +/* + * L.Icon.Default is the blue marker icon used by default in Leaflet. + */ + +L.Icon.Default = L.Icon.extend({ + + options: { + iconSize: [25, 41], + iconAnchor: [12, 41], + popupAnchor: [1, -34], + + shadowSize: [41, 41] + }, + + _getIconUrl: function (name) { + var key = name + 'Url'; + + if (this.options[key]) { + return this.options[key]; + } + + if (L.Browser.retina && name === 'icon') { + name += '-2x'; + } + + var path = L.Icon.Default.imagePath; + + if (!path) { + throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.'); + } + + return path + '/marker-' + name + '.png'; + } +}); + +L.Icon.Default.imagePath = (function () { + var scripts = document.getElementsByTagName('script'), + leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/; + + var i, len, src, matches, path; + + for (i = 0, len = scripts.length; i < len; i++) { + src = scripts[i].src; + matches = src.match(leafletRe); + + if (matches) { + path = src.split(leafletRe)[0]; + return (path ? path + '/' : '') + 'images'; + } + } +}()); + + +/* + * L.Marker is used to display clickable/draggable icons on the map. + */ + +L.Marker = L.Class.extend({ + + includes: L.Mixin.Events, + + options: { + icon: new L.Icon.Default(), + title: '', + clickable: true, + draggable: false, + keyboard: true, + zIndexOffset: 0, + opacity: 1, + riseOnHover: false, + riseOffset: 250 + }, + + initialize: function (latlng, options) { + L.setOptions(this, options); + this._latlng = L.latLng(latlng); + }, + + onAdd: function (map) { + this._map = map; + + map.on('viewreset', this.update, this); + + this._initIcon(); + this.update(); + + if (map.options.zoomAnimation && map.options.markerZoomAnimation) { + map.on('zoomanim', this._animateZoom, this); + } + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + onRemove: function (map) { + if (this.dragging) { + this.dragging.disable(); + } + + this._removeIcon(); + this._removeShadow(); + + this.fire('remove'); + + map.off({ + 'viewreset': this.update, + 'zoomanim': this._animateZoom + }, this); + + this._map = null; + }, + + getLatLng: function () { + return this._latlng; + }, + + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + + this.update(); + + return this.fire('move', { latlng: this._latlng }); + }, + + setZIndexOffset: function (offset) { + this.options.zIndexOffset = offset; + this.update(); + + return this; + }, + + setIcon: function (icon) { + + this.options.icon = icon; + + if (this._map) { + this._initIcon(); + this.update(); + } + + return this; + }, + + update: function () { + if (this._icon) { + var pos = this._map.latLngToLayerPoint(this._latlng).round(); + this._setPos(pos); + } + + return this; + }, + + _initIcon: function () { + var options = this.options, + map = this._map, + animation = (map.options.zoomAnimation && map.options.markerZoomAnimation), + classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide'; + + var icon = options.icon.createIcon(this._icon), + addIcon = false; + + // if we're not reusing the icon, remove the old one and init new one + if (icon !== this._icon) { + if (this._icon) { + this._removeIcon(); + } + addIcon = true; + + if (options.title) { + icon.title = options.title; + } + } + + L.DomUtil.addClass(icon, classToAdd); + + if (options.keyboard) { + icon.tabIndex = '0'; + } + + this._icon = icon; + + this._initInteraction(); + + if (options.riseOnHover) { + L.DomEvent + .on(icon, 'mouseover', this._bringToFront, this) + .on(icon, 'mouseout', this._resetZIndex, this); + } + + var newShadow = options.icon.createShadow(this._shadow), + addShadow = false; + + if (newShadow !== this._shadow) { + this._removeShadow(); + addShadow = true; + } + + if (newShadow) { + L.DomUtil.addClass(newShadow, classToAdd); + } + this._shadow = newShadow; + + + if (options.opacity < 1) { + this._updateOpacity(); + } + + + var panes = this._map._panes; + + if (addIcon) { + panes.markerPane.appendChild(this._icon); + } + + if (newShadow && addShadow) { + panes.shadowPane.appendChild(this._shadow); + } + }, + + _removeIcon: function () { + if (this.options.riseOnHover) { + L.DomEvent + .off(this._icon, 'mouseover', this._bringToFront) + .off(this._icon, 'mouseout', this._resetZIndex); + } + + this._map._panes.markerPane.removeChild(this._icon); + + this._icon = null; + }, + + _removeShadow: function () { + if (this._shadow) { + this._map._panes.shadowPane.removeChild(this._shadow); + } + this._shadow = null; + }, + + _setPos: function (pos) { + L.DomUtil.setPosition(this._icon, pos); + + if (this._shadow) { + L.DomUtil.setPosition(this._shadow, pos); + } + + this._zIndex = pos.y + this.options.zIndexOffset; + + this._resetZIndex(); + }, + + _updateZIndex: function (offset) { + this._icon.style.zIndex = this._zIndex + offset; + }, + + _animateZoom: function (opt) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); + + this._setPos(pos); + }, + + _initInteraction: function () { + + if (!this.options.clickable) { return; } + + // TODO refactor into something shared with Map/Path/etc. to DRY it up + + var icon = this._icon, + events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; + + L.DomUtil.addClass(icon, 'leaflet-clickable'); + L.DomEvent.on(icon, 'click', this._onMouseClick, this); + L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); + + for (var i = 0; i < events.length; i++) { + L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); + } + + if (L.Handler.MarkerDrag) { + this.dragging = new L.Handler.MarkerDrag(this); + + if (this.options.draggable) { + this.dragging.enable(); + } + } + }, + + _onMouseClick: function (e) { + var wasDragged = this.dragging && this.dragging.moved(); + + if (this.hasEventListeners(e.type) || wasDragged) { + L.DomEvent.stopPropagation(e); + } + + if (wasDragged) { return; } + + if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; } + + this.fire(e.type, { + originalEvent: e, + latlng: this._latlng + }); + }, + + _onKeyPress: function (e) { + if (e.keyCode === 13) { + this.fire('click', { + originalEvent: e, + latlng: this._latlng + }); + } + }, + + _fireMouseEvent: function (e) { + + this.fire(e.type, { + originalEvent: e, + latlng: this._latlng + }); + + // TODO proper custom event propagation + // this line will always be called if marker is in a FeatureGroup + if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) { + L.DomEvent.preventDefault(e); + } + if (e.type !== 'mousedown') { + L.DomEvent.stopPropagation(e); + } else { + L.DomEvent.preventDefault(e); + } + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._map) { + this._updateOpacity(); + } + + return this; + }, + + _updateOpacity: function () { + L.DomUtil.setOpacity(this._icon, this.options.opacity); + if (this._shadow) { + L.DomUtil.setOpacity(this._shadow, this.options.opacity); + } + }, + + _bringToFront: function () { + this._updateZIndex(this.options.riseOffset); + }, + + _resetZIndex: function () { + this._updateZIndex(0); + } +}); + +L.marker = function (latlng, options) { + return new L.Marker(latlng, options); +}; + + +/* + * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon) + * to use with L.Marker. + */ + +L.DivIcon = L.Icon.extend({ + options: { + iconSize: [12, 12], // also can be set through CSS + /* + iconAnchor: (Point) + popupAnchor: (Point) + html: (String) + bgPos: (Point) + */ + className: 'leaflet-div-icon', + html: false + }, + + createIcon: function (oldIcon) { + var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), + options = this.options; + + if (options.html !== false) { + div.innerHTML = options.html; + } else { + div.innerHTML = ''; + } + + if (options.bgPos) { + div.style.backgroundPosition = + (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; + } + + this._setIconStyles(div, 'icon'); + return div; + }, + + createShadow: function () { + return null; + } +}); + +L.divIcon = function (options) { + return new L.DivIcon(options); +}; + + +/* + * L.Popup is used for displaying popups on the map. + */ + +L.Map.mergeOptions({ + closePopupOnClick: true +}); + +L.Popup = L.Class.extend({ + includes: L.Mixin.Events, + + options: { + minWidth: 50, + maxWidth: 300, + maxHeight: null, + autoPan: true, + closeButton: true, + offset: [0, 7], + autoPanPadding: [5, 5], + keepInView: false, + className: '', + zoomAnimation: true + }, + + initialize: function (options, source) { + L.setOptions(this, options); + + this._source = source; + this._animated = L.Browser.any3d && this.options.zoomAnimation; + this._isOpen = false; + }, + + onAdd: function (map) { + this._map = map; + + if (!this._container) { + this._initLayout(); + } + this._updateContent(); + + var animFade = map.options.fadeAnimation; + + if (animFade) { + L.DomUtil.setOpacity(this._container, 0); + } + map._panes.popupPane.appendChild(this._container); + + map.on(this._getEvents(), this); + + this._update(); + + if (animFade) { + L.DomUtil.setOpacity(this._container, 1); + } + + this.fire('open'); + + map.fire('popupopen', {popup: this}); + + if (this._source) { + this._source.fire('popupopen', {popup: this}); + } + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + openOn: function (map) { + map.openPopup(this); + return this; + }, + + onRemove: function (map) { + map._panes.popupPane.removeChild(this._container); + + L.Util.falseFn(this._container.offsetWidth); // force reflow + + map.off(this._getEvents(), this); + + if (map.options.fadeAnimation) { + L.DomUtil.setOpacity(this._container, 0); + } + + this._map = null; + + this.fire('close'); + + map.fire('popupclose', {popup: this}); + + if (this._source) { + this._source.fire('popupclose', {popup: this}); + } + }, + + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + this._update(); + return this; + }, + + setContent: function (content) { + this._content = content; + this._update(); + return this; + }, + + _getEvents: function () { + var events = { + viewreset: this._updatePosition + }; + + if (this._animated) { + events.zoomanim = this._zoomAnimation; + } + if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { + events.preclick = this._close; + } + if (this.options.keepInView) { + events.moveend = this._adjustPan; + } + + return events; + }, + + _close: function () { + if (this._map) { + this._map.closePopup(this); + } + }, + + _initLayout: function () { + var prefix = 'leaflet-popup', + containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' + + (this._animated ? 'animated' : 'hide'), + container = this._container = L.DomUtil.create('div', containerClass), + closeButton; + + if (this.options.closeButton) { + closeButton = this._closeButton = + L.DomUtil.create('a', prefix + '-close-button', container); + closeButton.href = '#close'; + closeButton.innerHTML = '×'; + L.DomEvent.disableClickPropagation(closeButton); + + L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); + } + + var wrapper = this._wrapper = + L.DomUtil.create('div', prefix + '-content-wrapper', container); + L.DomEvent.disableClickPropagation(wrapper); + + this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); + L.DomEvent.on(this._contentNode, 'mousewheel', L.DomEvent.stopPropagation); + L.DomEvent.on(this._contentNode, 'MozMousePixelScroll', L.DomEvent.stopPropagation); + L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); + this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); + this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); + }, + + _update: function () { + if (!this._map) { return; } + + this._container.style.visibility = 'hidden'; + + this._updateContent(); + this._updateLayout(); + this._updatePosition(); + + this._container.style.visibility = ''; + + this._adjustPan(); + }, + + _updateContent: function () { + if (!this._content) { return; } + + if (typeof this._content === 'string') { + this._contentNode.innerHTML = this._content; + } else { + while (this._contentNode.hasChildNodes()) { + this._contentNode.removeChild(this._contentNode.firstChild); + } + this._contentNode.appendChild(this._content); + } + this.fire('contentupdate'); + }, + + _updateLayout: function () { + var container = this._contentNode, + style = container.style; + + style.width = ''; + style.whiteSpace = 'nowrap'; + + var width = container.offsetWidth; + width = Math.min(width, this.options.maxWidth); + width = Math.max(width, this.options.minWidth); + + style.width = (width + 1) + 'px'; + style.whiteSpace = ''; + + style.height = ''; + + var height = container.offsetHeight, + maxHeight = this.options.maxHeight, + scrolledClass = 'leaflet-popup-scrolled'; + + if (maxHeight && height > maxHeight) { + style.height = maxHeight + 'px'; + L.DomUtil.addClass(container, scrolledClass); + } else { + L.DomUtil.removeClass(container, scrolledClass); + } + + this._containerWidth = this._container.offsetWidth; + }, + + _updatePosition: function () { + if (!this._map) { return; } + + var pos = this._map.latLngToLayerPoint(this._latlng), + animated = this._animated, + offset = L.point(this.options.offset); + + if (animated) { + L.DomUtil.setPosition(this._container, pos); + } + + this._containerBottom = -offset.y - (animated ? 0 : pos.y); + this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x); + + // bottom position the popup in case the height of the popup changes (images loading etc) + this._container.style.bottom = this._containerBottom + 'px'; + this._container.style.left = this._containerLeft + 'px'; + }, + + _zoomAnimation: function (opt) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); + + L.DomUtil.setPosition(this._container, pos); + }, + + _adjustPan: function () { + if (!this.options.autoPan) { return; } + + var map = this._map, + containerHeight = this._container.offsetHeight, + containerWidth = this._containerWidth, + + layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); + + if (this._animated) { + layerPos._add(L.DomUtil.getPosition(this._container)); + } + + var containerPos = map.layerPointToContainerPoint(layerPos), + padding = L.point(this.options.autoPanPadding), + size = map.getSize(), + dx = 0, + dy = 0; + + if (containerPos.x + containerWidth > size.x) { // right + dx = containerPos.x + containerWidth - size.x + padding.x; + } + if (containerPos.x - dx < 0) { // left + dx = containerPos.x - padding.x; + } + if (containerPos.y + containerHeight > size.y) { // bottom + dy = containerPos.y + containerHeight - size.y + padding.y; + } + if (containerPos.y - dy < 0) { // top + dy = containerPos.y - padding.y; + } + + if (dx || dy) { + map + .fire('autopanstart') + .panBy([dx, dy]); + } + }, + + _onCloseButtonClick: function (e) { + this._close(); + L.DomEvent.stop(e); + } +}); + +L.popup = function (options, source) { + return new L.Popup(options, source); +}; + + +L.Map.include({ + openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object]) + this.closePopup(); + + if (!(popup instanceof L.Popup)) { + var content = popup; + + popup = new L.Popup(options) + .setLatLng(latlng) + .setContent(content); + } + popup._isOpen = true; + + this._popup = popup; + return this.addLayer(popup); + }, + + closePopup: function (popup) { + if (!popup || popup === this._popup) { + popup = this._popup; + this._popup = null; + } + if (popup) { + this.removeLayer(popup); + popup._isOpen = false; + } + return this; + } +}); + + +/* + * Popup extension to L.Marker, adding popup-related methods. + */ + +L.Marker.include({ + openPopup: function () { + if (this._popup && this._map && !this._map.hasLayer(this._popup)) { + this._popup.setLatLng(this._latlng); + this._map.openPopup(this._popup); + } + + return this; + }, + + closePopup: function () { + if (this._popup) { + this._popup._close(); + } + return this; + }, + + togglePopup: function () { + if (this._popup) { + if (this._popup._isOpen) { + this.closePopup(); + } else { + this.openPopup(); + } + } + return this; + }, + + bindPopup: function (content, options) { + var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]); + + anchor = anchor.add(L.Popup.prototype.options.offset); + + if (options && options.offset) { + anchor = anchor.add(options.offset); + } + + options = L.extend({offset: anchor}, options); + + if (!this._popup) { + this + .on('click', this.togglePopup, this) + .on('remove', this.closePopup, this) + .on('move', this._movePopup, this); + } + + if (content instanceof L.Popup) { + L.setOptions(content, options); + this._popup = content; + } else { + this._popup = new L.Popup(options, this) + .setContent(content); + } + + return this; + }, + + setPopupContent: function (content) { + if (this._popup) { + this._popup.setContent(content); + } + return this; + }, + + unbindPopup: function () { + if (this._popup) { + this._popup = null; + this + .off('click', this.togglePopup) + .off('remove', this.closePopup) + .off('move', this._movePopup); + } + return this; + }, + + _movePopup: function (e) { + this._popup.setLatLng(e.latlng); + } +}); + + +/* + * L.LayerGroup is a class to combine several layers into one so that + * you can manipulate the group (e.g. add/remove it) as one layer. + */ + +L.LayerGroup = L.Class.extend({ + initialize: function (layers) { + this._layers = {}; + + var i, len; + + if (layers) { + for (i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + } + }, + + addLayer: function (layer) { + var id = this.getLayerId(layer); + + this._layers[id] = layer; + + if (this._map) { + this._map.addLayer(layer); + } + + return this; + }, + + removeLayer: function (layer) { + var id = layer in this._layers ? layer : this.getLayerId(layer); + + if (this._map && this._layers[id]) { + this._map.removeLayer(this._layers[id]); + } + + delete this._layers[id]; + + return this; + }, + + hasLayer: function (layer) { + if (!layer) { return false; } + + return (layer in this._layers || this.getLayerId(layer) in this._layers); + }, + + clearLayers: function () { + this.eachLayer(this.removeLayer, this); + return this; + }, + + invoke: function (methodName) { + var args = Array.prototype.slice.call(arguments, 1), + i, layer; + + for (i in this._layers) { + layer = this._layers[i]; + + if (layer[methodName]) { + layer[methodName].apply(layer, args); + } + } + + return this; + }, + + onAdd: function (map) { + this._map = map; + this.eachLayer(map.addLayer, map); + }, + + onRemove: function (map) { + this.eachLayer(map.removeLayer, map); + this._map = null; + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + getLayer: function (id) { + return this._layers[id]; + }, + + getLayers: function () { + var layers = []; + + for (var i in this._layers) { + layers.push(this._layers[i]); + } + return layers; + }, + + setZIndex: function (zIndex) { + return this.invoke('setZIndex', zIndex); + }, + + getLayerId: function (layer) { + return L.stamp(layer); + } +}); + +L.layerGroup = function (layers) { + return new L.LayerGroup(layers); +}; + + +/* + * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods + * shared between a group of interactive layers (like vectors or markers). + */ + +L.FeatureGroup = L.LayerGroup.extend({ + includes: L.Mixin.Events, + + statics: { + EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose' + }, + + addLayer: function (layer) { + if (this.hasLayer(layer)) { + return this; + } + + layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); + + L.LayerGroup.prototype.addLayer.call(this, layer); + + if (this._popupContent && layer.bindPopup) { + layer.bindPopup(this._popupContent, this._popupOptions); + } + + return this.fire('layeradd', {layer: layer}); + }, + + removeLayer: function (layer) { + if (!this.hasLayer(layer)) { + return this; + } + if (layer in this._layers) { + layer = this._layers[layer]; + } + + layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this); + + L.LayerGroup.prototype.removeLayer.call(this, layer); + + if (this._popupContent) { + this.invoke('unbindPopup'); + } + + return this.fire('layerremove', {layer: layer}); + }, + + bindPopup: function (content, options) { + this._popupContent = content; + this._popupOptions = options; + return this.invoke('bindPopup', content, options); + }, + + setStyle: function (style) { + return this.invoke('setStyle', style); + }, + + bringToFront: function () { + return this.invoke('bringToFront'); + }, + + bringToBack: function () { + return this.invoke('bringToBack'); + }, + + getBounds: function () { + var bounds = new L.LatLngBounds(); + + this.eachLayer(function (layer) { + bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds()); + }); + + return bounds; + }, + + _propagateEvent: function (e) { + if (!e.layer) { + e.layer = e.target; + } + e.target = this; + + this.fire(e.type, e); + } +}); + +L.featureGroup = function (layers) { + return new L.FeatureGroup(layers); +}; + + +/* + * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc. + */ + +L.Path = L.Class.extend({ + includes: [L.Mixin.Events], + + statics: { + // how much to extend the clip area around the map view + // (relative to its size, e.g. 0.5 is half the screen in each direction) + // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is) + CLIP_PADDING: (function () { + var max = L.Browser.mobile ? 1280 : 2000, + target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2; + return Math.max(0, Math.min(0.5, target)); + })() + }, + + options: { + stroke: true, + color: '#0033ff', + dashArray: null, + weight: 5, + opacity: 0.5, + + fill: false, + fillColor: null, //same as color by default + fillOpacity: 0.2, + + clickable: true + }, + + initialize: function (options) { + L.setOptions(this, options); + }, + + onAdd: function (map) { + this._map = map; + + if (!this._container) { + this._initElements(); + this._initEvents(); + } + + this.projectLatlngs(); + this._updatePath(); + + if (this._container) { + this._map._pathRoot.appendChild(this._container); + } + + this.fire('add'); + + map.on({ + 'viewreset': this.projectLatlngs, + 'moveend': this._updatePath + }, this); + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + onRemove: function (map) { + map._pathRoot.removeChild(this._container); + + // Need to fire remove event before we set _map to null as the event hooks might need the object + this.fire('remove'); + this._map = null; + + if (L.Browser.vml) { + this._container = null; + this._stroke = null; + this._fill = null; + } + + map.off({ + 'viewreset': this.projectLatlngs, + 'moveend': this._updatePath + }, this); + }, + + projectLatlngs: function () { + // do all projection stuff here + }, + + setStyle: function (style) { + L.setOptions(this, style); + + if (this._container) { + this._updateStyle(); + } + + return this; + }, + + redraw: function () { + if (this._map) { + this.projectLatlngs(); + this._updatePath(); + } + return this; + } +}); + +L.Map.include({ + _updatePathViewport: function () { + var p = L.Path.CLIP_PADDING, + size = this.getSize(), + panePos = L.DomUtil.getPosition(this._mapPane), + min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()), + max = min.add(size.multiplyBy(1 + p * 2)._round()); + + this._pathViewport = new L.Bounds(min, max); + } +}); + + +/* + * Extends L.Path with SVG-specific rendering code. + */ + +L.Path.SVG_NS = 'http://www.w3.org/2000/svg'; + +L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect); + +L.Path = L.Path.extend({ + statics: { + SVG: L.Browser.svg + }, + + bringToFront: function () { + var root = this._map._pathRoot, + path = this._container; + + if (path && root.lastChild !== path) { + root.appendChild(path); + } + return this; + }, + + bringToBack: function () { + var root = this._map._pathRoot, + path = this._container, + first = root.firstChild; + + if (path && first !== path) { + root.insertBefore(path, first); + } + return this; + }, + + getPathString: function () { + // form path string here + }, + + _createElement: function (name) { + return document.createElementNS(L.Path.SVG_NS, name); + }, + + _initElements: function () { + this._map._initPathRoot(); + this._initPath(); + this._initStyle(); + }, + + _initPath: function () { + this._container = this._createElement('g'); + + this._path = this._createElement('path'); + this._container.appendChild(this._path); + }, + + _initStyle: function () { + if (this.options.stroke) { + this._path.setAttribute('stroke-linejoin', 'round'); + this._path.setAttribute('stroke-linecap', 'round'); + } + if (this.options.fill) { + this._path.setAttribute('fill-rule', 'evenodd'); + } + if (this.options.pointerEvents) { + this._path.setAttribute('pointer-events', this.options.pointerEvents); + } + if (!this.options.clickable && !this.options.pointerEvents) { + this._path.setAttribute('pointer-events', 'none'); + } + this._updateStyle(); + }, + + _updateStyle: function () { + if (this.options.stroke) { + this._path.setAttribute('stroke', this.options.color); + this._path.setAttribute('stroke-opacity', this.options.opacity); + this._path.setAttribute('stroke-width', this.options.weight); + if (this.options.dashArray) { + this._path.setAttribute('stroke-dasharray', this.options.dashArray); + } else { + this._path.removeAttribute('stroke-dasharray'); + } + } else { + this._path.setAttribute('stroke', 'none'); + } + if (this.options.fill) { + this._path.setAttribute('fill', this.options.fillColor || this.options.color); + this._path.setAttribute('fill-opacity', this.options.fillOpacity); + } else { + this._path.setAttribute('fill', 'none'); + } + }, + + _updatePath: function () { + var str = this.getPathString(); + if (!str) { + // fix webkit empty string parsing bug + str = 'M0 0'; + } + this._path.setAttribute('d', str); + }, + + // TODO remove duplication with L.Map + _initEvents: function () { + if (this.options.clickable) { + if (L.Browser.svg || !L.Browser.vml) { + this._path.setAttribute('class', 'leaflet-clickable'); + } + + L.DomEvent.on(this._container, 'click', this._onMouseClick, this); + + var events = ['dblclick', 'mousedown', 'mouseover', + 'mouseout', 'mousemove', 'contextmenu']; + for (var i = 0; i < events.length; i++) { + L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); + } + } + }, + + _onMouseClick: function (e) { + if (this._map.dragging && this._map.dragging.moved()) { return; } + + this._fireMouseEvent(e); + }, + + _fireMouseEvent: function (e) { + if (!this.hasEventListeners(e.type)) { return; } + + var map = this._map, + containerPoint = map.mouseEventToContainerPoint(e), + layerPoint = map.containerPointToLayerPoint(containerPoint), + latlng = map.layerPointToLatLng(layerPoint); + + this.fire(e.type, { + latlng: latlng, + layerPoint: layerPoint, + containerPoint: containerPoint, + originalEvent: e + }); + + if (e.type === 'contextmenu') { + L.DomEvent.preventDefault(e); + } + if (e.type !== 'mousemove') { + L.DomEvent.stopPropagation(e); + } + } +}); + +L.Map.include({ + _initPathRoot: function () { + if (!this._pathRoot) { + this._pathRoot = L.Path.prototype._createElement('svg'); + this._panes.overlayPane.appendChild(this._pathRoot); + + if (this.options.zoomAnimation && L.Browser.any3d) { + this._pathRoot.setAttribute('class', ' leaflet-zoom-animated'); + + this.on({ + 'zoomanim': this._animatePathZoom, + 'zoomend': this._endPathZoom + }); + } else { + this._pathRoot.setAttribute('class', ' leaflet-zoom-hide'); + } + + this.on('moveend', this._updateSvgViewport); + this._updateSvgViewport(); + } + }, + + _animatePathZoom: function (e) { + var scale = this.getZoomScale(e.zoom), + offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min); + + this._pathRoot.style[L.DomUtil.TRANSFORM] = + L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') '; + + this._pathZooming = true; + }, + + _endPathZoom: function () { + this._pathZooming = false; + }, + + _updateSvgViewport: function () { + + if (this._pathZooming) { + // Do not update SVGs while a zoom animation is going on otherwise the animation will break. + // When the zoom animation ends we will be updated again anyway + // This fixes the case where you do a momentum move and zoom while the move is still ongoing. + return; + } + + this._updatePathViewport(); + + var vp = this._pathViewport, + min = vp.min, + max = vp.max, + width = max.x - min.x, + height = max.y - min.y, + root = this._pathRoot, + pane = this._panes.overlayPane; + + // Hack to make flicker on drag end on mobile webkit less irritating + if (L.Browser.mobileWebkit) { + pane.removeChild(root); + } + + L.DomUtil.setPosition(root, min); + root.setAttribute('width', width); + root.setAttribute('height', height); + root.setAttribute('viewBox', [min.x, min.y, width, height].join(' ')); + + if (L.Browser.mobileWebkit) { + pane.appendChild(root); + } + } +}); + + +/* + * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods. + */ + +L.Path.include({ + + bindPopup: function (content, options) { + + if (content instanceof L.Popup) { + this._popup = content; + } else { + if (!this._popup || options) { + this._popup = new L.Popup(options, this); + } + this._popup.setContent(content); + } + + if (!this._popupHandlersAdded) { + this + .on('click', this._openPopup, this) + .on('remove', this.closePopup, this); + + this._popupHandlersAdded = true; + } + + return this; + }, + + unbindPopup: function () { + if (this._popup) { + this._popup = null; + this + .off('click', this._openPopup) + .off('remove', this.closePopup); + + this._popupHandlersAdded = false; + } + return this; + }, + + openPopup: function (latlng) { + + if (this._popup) { + // open the popup from one of the path's points if not specified + latlng = latlng || this._latlng || + this._latlngs[Math.floor(this._latlngs.length / 2)]; + + this._openPopup({latlng: latlng}); + } + + return this; + }, + + closePopup: function () { + if (this._popup) { + this._popup._close(); + } + return this; + }, + + _openPopup: function (e) { + this._popup.setLatLng(e.latlng); + this._map.openPopup(this._popup); + } +}); + + +/* + * Vector rendering for IE6-8 through VML. + * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! + */ + +L.Browser.vml = !L.Browser.svg && (function () { + try { + var div = document.createElement('div'); + div.innerHTML = '<v:shape adj="1"/>'; + + var shape = div.firstChild; + shape.style.behavior = 'url(#default#VML)'; + + return shape && (typeof shape.adj === 'object'); + + } catch (e) { + return false; + } +}()); + +L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ + statics: { + VML: true, + CLIP_PADDING: 0.02 + }, + + _createElement: (function () { + try { + document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); + return function (name) { + return document.createElement('<lvml:' + name + ' class="lvml">'); + }; + } catch (e) { + return function (name) { + return document.createElement( + '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); + }; + } + }()), + + _initPath: function () { + var container = this._container = this._createElement('shape'); + L.DomUtil.addClass(container, 'leaflet-vml-shape'); + if (this.options.clickable) { + L.DomUtil.addClass(container, 'leaflet-clickable'); + } + container.coordsize = '1 1'; + + this._path = this._createElement('path'); + container.appendChild(this._path); + + this._map._pathRoot.appendChild(container); + }, + + _initStyle: function () { + this._updateStyle(); + }, + + _updateStyle: function () { + var stroke = this._stroke, + fill = this._fill, + options = this.options, + container = this._container; + + container.stroked = options.stroke; + container.filled = options.fill; + + if (options.stroke) { + if (!stroke) { + stroke = this._stroke = this._createElement('stroke'); + stroke.endcap = 'round'; + container.appendChild(stroke); + } + stroke.weight = options.weight + 'px'; + stroke.color = options.color; + stroke.opacity = options.opacity; + + if (options.dashArray) { + stroke.dashStyle = options.dashArray instanceof Array ? + options.dashArray.join(' ') : + options.dashArray.replace(/( *, *)/g, ' '); + } else { + stroke.dashStyle = ''; + } + + } else if (stroke) { + container.removeChild(stroke); + this._stroke = null; + } + + if (options.fill) { + if (!fill) { + fill = this._fill = this._createElement('fill'); + container.appendChild(fill); + } + fill.color = options.fillColor || options.color; + fill.opacity = options.fillOpacity; + + } else if (fill) { + container.removeChild(fill); + this._fill = null; + } + }, + + _updatePath: function () { + var style = this._container.style; + + style.display = 'none'; + this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug + style.display = ''; + } +}); + +L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : { + _initPathRoot: function () { + if (this._pathRoot) { return; } + + var root = this._pathRoot = document.createElement('div'); + root.className = 'leaflet-vml-container'; + this._panes.overlayPane.appendChild(root); + + this.on('moveend', this._updatePathViewport); + this._updatePathViewport(); + } +}); + + +/* + * Vector rendering for all browsers that support canvas. + */ + +L.Browser.canvas = (function () { + return !!document.createElement('canvas').getContext; +}()); + +L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({ + statics: { + //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value + CANVAS: true, + SVG: false + }, + + redraw: function () { + if (this._map) { + this.projectLatlngs(); + this._requestUpdate(); + } + return this; + }, + + setStyle: function (style) { + L.setOptions(this, style); + + if (this._map) { + this._updateStyle(); + this._requestUpdate(); + } + return this; + }, + + onRemove: function (map) { + map + .off('viewreset', this.projectLatlngs, this) + .off('moveend', this._updatePath, this); + + if (this.options.clickable) { + this._map.off('click', this._onClick, this); + this._map.off('mousemove', this._onMouseMove, this); + } + + this._requestUpdate(); + + this._map = null; + }, + + _requestUpdate: function () { + if (this._map && !L.Path._updateRequest) { + L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map); + } + }, + + _fireMapMoveEnd: function () { + L.Path._updateRequest = null; + this.fire('moveend'); + }, + + _initElements: function () { + this._map._initPathRoot(); + this._ctx = this._map._canvasCtx; + }, + + _updateStyle: function () { + var options = this.options; + + if (options.stroke) { + this._ctx.lineWidth = options.weight; + this._ctx.strokeStyle = options.color; + } + if (options.fill) { + this._ctx.fillStyle = options.fillColor || options.color; + } + }, + + _drawPath: function () { + var i, j, len, len2, point, drawMethod; + + this._ctx.beginPath(); + + for (i = 0, len = this._parts.length; i < len; i++) { + for (j = 0, len2 = this._parts[i].length; j < len2; j++) { + point = this._parts[i][j]; + drawMethod = (j === 0 ? 'move' : 'line') + 'To'; + + this._ctx[drawMethod](point.x, point.y); + } + // TODO refactor ugly hack + if (this instanceof L.Polygon) { + this._ctx.closePath(); + } + } + }, + + _checkIfEmpty: function () { + return !this._parts.length; + }, + + _updatePath: function () { + if (this._checkIfEmpty()) { return; } + + var ctx = this._ctx, + options = this.options; + + this._drawPath(); + ctx.save(); + this._updateStyle(); + + if (options.fill) { + ctx.globalAlpha = options.fillOpacity; + ctx.fill(); + } + + if (options.stroke) { + ctx.globalAlpha = options.opacity; + ctx.stroke(); + } + + ctx.restore(); + + // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature + }, + + _initEvents: function () { + if (this.options.clickable) { + // TODO dblclick + this._map.on('mousemove', this._onMouseMove, this); + this._map.on('click', this._onClick, this); + } + }, + + _onClick: function (e) { + if (this._containsPoint(e.layerPoint)) { + this.fire('click', e); + } + }, + + _onMouseMove: function (e) { + if (!this._map || this._map._animatingZoom) { return; } + + // TODO don't do on each move + if (this._containsPoint(e.layerPoint)) { + this._ctx.canvas.style.cursor = 'pointer'; + this._mouseInside = true; + this.fire('mouseover', e); + + } else if (this._mouseInside) { + this._ctx.canvas.style.cursor = ''; + this._mouseInside = false; + this.fire('mouseout', e); + } + } +}); + +L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : { + _initPathRoot: function () { + var root = this._pathRoot, + ctx; + + if (!root) { + root = this._pathRoot = document.createElement('canvas'); + root.style.position = 'absolute'; + ctx = this._canvasCtx = root.getContext('2d'); + + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + + this._panes.overlayPane.appendChild(root); + + if (this.options.zoomAnimation) { + this._pathRoot.className = 'leaflet-zoom-animated'; + this.on('zoomanim', this._animatePathZoom); + this.on('zoomend', this._endPathZoom); + } + this.on('moveend', this._updateCanvasViewport); + this._updateCanvasViewport(); + } + }, + + _updateCanvasViewport: function () { + // don't redraw while zooming. See _updateSvgViewport for more details + if (this._pathZooming) { return; } + this._updatePathViewport(); + + var vp = this._pathViewport, + min = vp.min, + size = vp.max.subtract(min), + root = this._pathRoot; + + //TODO check if this works properly on mobile webkit + L.DomUtil.setPosition(root, min); + root.width = size.x; + root.height = size.y; + root.getContext('2d').translate(-min.x, -min.y); + } +}); + + +/* + * L.LineUtil contains different utility functions for line segments + * and polylines (clipping, simplification, distances, etc.) + */ + +/*jshint bitwise:false */ // allow bitwise oprations for this file + +L.LineUtil = { + + // Simplify polyline with vertex reduction and Douglas-Peucker simplification. + // Improves rendering performance dramatically by lessening the number of points to draw. + + simplify: function (/*Point[]*/ points, /*Number*/ tolerance) { + if (!tolerance || !points.length) { + return points.slice(); + } + + var sqTolerance = tolerance * tolerance; + + // stage 1: vertex reduction + points = this._reducePoints(points, sqTolerance); + + // stage 2: Douglas-Peucker simplification + points = this._simplifyDP(points, sqTolerance); + + return points; + }, + + // distance from a point to a segment between two points + pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { + return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); + }, + + closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { + return this._sqClosestPointOnSegment(p, p1, p2); + }, + + // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm + _simplifyDP: function (points, sqTolerance) { + + var len = points.length, + ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, + markers = new ArrayConstructor(len); + + markers[0] = markers[len - 1] = 1; + + this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); + + var i, + newPoints = []; + + for (i = 0; i < len; i++) { + if (markers[i]) { + newPoints.push(points[i]); + } + } + + return newPoints; + }, + + _simplifyDPStep: function (points, markers, sqTolerance, first, last) { + + var maxSqDist = 0, + index, i, sqDist; + + for (i = first + 1; i <= last - 1; i++) { + sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true); + + if (sqDist > maxSqDist) { + index = i; + maxSqDist = sqDist; + } + } + + if (maxSqDist > sqTolerance) { + markers[index] = 1; + + this._simplifyDPStep(points, markers, sqTolerance, first, index); + this._simplifyDPStep(points, markers, sqTolerance, index, last); + } + }, + + // reduce points that are too close to each other to a single point + _reducePoints: function (points, sqTolerance) { + var reducedPoints = [points[0]]; + + for (var i = 1, prev = 0, len = points.length; i < len; i++) { + if (this._sqDist(points[i], points[prev]) > sqTolerance) { + reducedPoints.push(points[i]); + prev = i; + } + } + if (prev < len - 1) { + reducedPoints.push(points[len - 1]); + } + return reducedPoints; + }, + + // Cohen-Sutherland line clipping algorithm. + // Used to avoid rendering parts of a polyline that are not currently visible. + + clipSegment: function (a, b, bounds, useLastCode) { + var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds), + codeB = this._getBitCode(b, bounds), + + codeOut, p, newCode; + + // save 2nd code to avoid calculating it on the next segment + this._lastCode = codeB; + + while (true) { + // if a,b is inside the clip window (trivial accept) + if (!(codeA | codeB)) { + return [a, b]; + // if a,b is outside the clip window (trivial reject) + } else if (codeA & codeB) { + return false; + // other cases + } else { + codeOut = codeA || codeB; + p = this._getEdgeIntersection(a, b, codeOut, bounds); + newCode = this._getBitCode(p, bounds); + + if (codeOut === codeA) { + a = p; + codeA = newCode; + } else { + b = p; + codeB = newCode; + } + } + } + }, + + _getEdgeIntersection: function (a, b, code, bounds) { + var dx = b.x - a.x, + dy = b.y - a.y, + min = bounds.min, + max = bounds.max; + + if (code & 8) { // top + return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y); + } else if (code & 4) { // bottom + return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y); + } else if (code & 2) { // right + return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx); + } else if (code & 1) { // left + return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx); + } + }, + + _getBitCode: function (/*Point*/ p, bounds) { + var code = 0; + + if (p.x < bounds.min.x) { // left + code |= 1; + } else if (p.x > bounds.max.x) { // right + code |= 2; + } + if (p.y < bounds.min.y) { // bottom + code |= 4; + } else if (p.y > bounds.max.y) { // top + code |= 8; + } + + return code; + }, + + // square distance (to avoid unnecessary Math.sqrt calls) + _sqDist: function (p1, p2) { + var dx = p2.x - p1.x, + dy = p2.y - p1.y; + return dx * dx + dy * dy; + }, + + // return closest point on segment or distance to that point + _sqClosestPointOnSegment: function (p, p1, p2, sqDist) { + var x = p1.x, + y = p1.y, + dx = p2.x - x, + dy = p2.y - y, + dot = dx * dx + dy * dy, + t; + + if (dot > 0) { + t = ((p.x - x) * dx + (p.y - y) * dy) / dot; + + if (t > 1) { + x = p2.x; + y = p2.y; + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = p.x - x; + dy = p.y - y; + + return sqDist ? dx * dx + dy * dy : new L.Point(x, y); + } +}; + + +/* + * L.Polyline is used to display polylines on a map. + */ + +L.Polyline = L.Path.extend({ + initialize: function (latlngs, options) { + L.Path.prototype.initialize.call(this, options); + + this._latlngs = this._convertLatLngs(latlngs); + }, + + options: { + // how much to simplify the polyline on each zoom level + // more = better performance and smoother look, less = more accurate + smoothFactor: 1.0, + noClip: false + }, + + projectLatlngs: function () { + this._originalPoints = []; + + for (var i = 0, len = this._latlngs.length; i < len; i++) { + this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]); + } + }, + + getPathString: function () { + for (var i = 0, len = this._parts.length, str = ''; i < len; i++) { + str += this._getPathPartStr(this._parts[i]); + } + return str; + }, + + getLatLngs: function () { + return this._latlngs; + }, + + setLatLngs: function (latlngs) { + this._latlngs = this._convertLatLngs(latlngs); + return this.redraw(); + }, + + addLatLng: function (latlng) { + this._latlngs.push(L.latLng(latlng)); + return this.redraw(); + }, + + spliceLatLngs: function () { // (Number index, Number howMany) + var removed = [].splice.apply(this._latlngs, arguments); + this._convertLatLngs(this._latlngs, true); + this.redraw(); + return removed; + }, + + closestLayerPoint: function (p) { + var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null; + + for (var j = 0, jLen = parts.length; j < jLen; j++) { + var points = parts[j]; + for (var i = 1, len = points.length; i < len; i++) { + p1 = points[i - 1]; + p2 = points[i]; + var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true); + if (sqDist < minDistance) { + minDistance = sqDist; + minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2); + } + } + } + if (minPoint) { + minPoint.distance = Math.sqrt(minDistance); + } + return minPoint; + }, + + getBounds: function () { + return new L.LatLngBounds(this.getLatLngs()); + }, + + _convertLatLngs: function (latlngs, overwrite) { + var i, len, target = overwrite ? latlngs : []; + + for (i = 0, len = latlngs.length; i < len; i++) { + if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { + return; + } + target[i] = L.latLng(latlngs[i]); + } + return target; + }, + + _initEvents: function () { + L.Path.prototype._initEvents.call(this); + }, + + _getPathPartStr: function (points) { + var round = L.Path.VML; + + for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { + p = points[j]; + if (round) { + p._round(); + } + str += (j ? 'L' : 'M') + p.x + ' ' + p.y; + } + return str; + }, + + _clipPoints: function () { + var points = this._originalPoints, + len = points.length, + i, k, segment; + + if (this.options.noClip) { + this._parts = [points]; + return; + } + + this._parts = []; + + var parts = this._parts, + vp = this._map._pathViewport, + lu = L.LineUtil; + + for (i = 0, k = 0; i < len - 1; i++) { + segment = lu.clipSegment(points[i], points[i + 1], vp, i); + if (!segment) { + continue; + } + + parts[k] = parts[k] || []; + parts[k].push(segment[0]); + + // if segment goes out of screen, or it's the last one, it's the end of the line part + if ((segment[1] !== points[i + 1]) || (i === len - 2)) { + parts[k].push(segment[1]); + k++; + } + } + }, + + // simplify each clipped part of the polyline + _simplifyPoints: function () { + var parts = this._parts, + lu = L.LineUtil; + + for (var i = 0, len = parts.length; i < len; i++) { + parts[i] = lu.simplify(parts[i], this.options.smoothFactor); + } + }, + + _updatePath: function () { + if (!this._map) { return; } + + this._clipPoints(); + this._simplifyPoints(); + + L.Path.prototype._updatePath.call(this); + } +}); + +L.polyline = function (latlngs, options) { + return new L.Polyline(latlngs, options); +}; + + +/* + * L.PolyUtil contains utility functions for polygons (clipping, etc.). + */ + +/*jshint bitwise:false */ // allow bitwise operations here + +L.PolyUtil = {}; + +/* + * Sutherland-Hodgeman polygon clipping algorithm. + * Used to avoid rendering parts of a polygon that are not currently visible. + */ +L.PolyUtil.clipPolygon = function (points, bounds) { + var clippedPoints, + edges = [1, 4, 2, 8], + i, j, k, + a, b, + len, edge, p, + lu = L.LineUtil; + + for (i = 0, len = points.length; i < len; i++) { + points[i]._code = lu._getBitCode(points[i], bounds); + } + + // for each edge (left, bottom, right, top) + for (k = 0; k < 4; k++) { + edge = edges[k]; + clippedPoints = []; + + for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { + a = points[i]; + b = points[j]; + + // if a is inside the clip window + if (!(a._code & edge)) { + // if b is outside the clip window (a->b goes out of screen) + if (b._code & edge) { + p = lu._getEdgeIntersection(b, a, edge, bounds); + p._code = lu._getBitCode(p, bounds); + clippedPoints.push(p); + } + clippedPoints.push(a); + + // else if b is inside the clip window (a->b enters the screen) + } else if (!(b._code & edge)) { + p = lu._getEdgeIntersection(b, a, edge, bounds); + p._code = lu._getBitCode(p, bounds); + clippedPoints.push(p); + } + } + points = clippedPoints; + } + + return points; +}; + + +/* + * L.Polygon is used to display polygons on a map. + */ + +L.Polygon = L.Polyline.extend({ + options: { + fill: true + }, + + initialize: function (latlngs, options) { + var i, len, hole; + + L.Polyline.prototype.initialize.call(this, latlngs, options); + + if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { + this._latlngs = this._convertLatLngs(latlngs[0]); + this._holes = latlngs.slice(1); + + for (i = 0, len = this._holes.length; i < len; i++) { + hole = this._holes[i] = this._convertLatLngs(this._holes[i]); + if (hole[0].equals(hole[hole.length - 1])) { + hole.pop(); + } + } + } + + // filter out last point if its equal to the first one + latlngs = this._latlngs; + + if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) { + latlngs.pop(); + } + }, + + projectLatlngs: function () { + L.Polyline.prototype.projectLatlngs.call(this); + + // project polygon holes points + // TODO move this logic to Polyline to get rid of duplication + this._holePoints = []; + + if (!this._holes) { return; } + + var i, j, len, len2; + + for (i = 0, len = this._holes.length; i < len; i++) { + this._holePoints[i] = []; + + for (j = 0, len2 = this._holes[i].length; j < len2; j++) { + this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]); + } + } + }, + + _clipPoints: function () { + var points = this._originalPoints, + newParts = []; + + this._parts = [points].concat(this._holePoints); + + if (this.options.noClip) { return; } + + for (var i = 0, len = this._parts.length; i < len; i++) { + var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport); + if (clipped.length) { + newParts.push(clipped); + } + } + + this._parts = newParts; + }, + + _getPathPartStr: function (points) { + var str = L.Polyline.prototype._getPathPartStr.call(this, points); + return str + (L.Browser.svg ? 'z' : 'x'); + } +}); + +L.polygon = function (latlngs, options) { + return new L.Polygon(latlngs, options); +}; + + +/* + * Contains L.MultiPolyline and L.MultiPolygon layers. + */ + +(function () { + function createMulti(Klass) { + + return L.FeatureGroup.extend({ + + initialize: function (latlngs, options) { + this._layers = {}; + this._options = options; + this.setLatLngs(latlngs); + }, + + setLatLngs: function (latlngs) { + var i = 0, + len = latlngs.length; + + this.eachLayer(function (layer) { + if (i < len) { + layer.setLatLngs(latlngs[i++]); + } else { + this.removeLayer(layer); + } + }, this); + + while (i < len) { + this.addLayer(new Klass(latlngs[i++], this._options)); + } + + return this; + }, + + getLatLngs: function () { + var latlngs = []; + + this.eachLayer(function (layer) { + latlngs.push(layer.getLatLngs()); + }); + + return latlngs; + } + }); + } + + L.MultiPolyline = createMulti(L.Polyline); + L.MultiPolygon = createMulti(L.Polygon); + + L.multiPolyline = function (latlngs, options) { + return new L.MultiPolyline(latlngs, options); + }; + + L.multiPolygon = function (latlngs, options) { + return new L.MultiPolygon(latlngs, options); + }; +}()); + + +/* + * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. + */ + +L.Rectangle = L.Polygon.extend({ + initialize: function (latLngBounds, options) { + L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options); + }, + + setBounds: function (latLngBounds) { + this.setLatLngs(this._boundsToLatLngs(latLngBounds)); + }, + + _boundsToLatLngs: function (latLngBounds) { + latLngBounds = L.latLngBounds(latLngBounds); + return [ + latLngBounds.getSouthWest(), + latLngBounds.getNorthWest(), + latLngBounds.getNorthEast(), + latLngBounds.getSouthEast() + ]; + } +}); + +L.rectangle = function (latLngBounds, options) { + return new L.Rectangle(latLngBounds, options); +}; + + +/* + * L.Circle is a circle overlay (with a certain radius in meters). + */ + +L.Circle = L.Path.extend({ + initialize: function (latlng, radius, options) { + L.Path.prototype.initialize.call(this, options); + + this._latlng = L.latLng(latlng); + this._mRadius = radius; + }, + + options: { + fill: true + }, + + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + return this.redraw(); + }, + + setRadius: function (radius) { + this._mRadius = radius; + return this.redraw(); + }, + + projectLatlngs: function () { + var lngRadius = this._getLngRadius(), + latlng = this._latlng, + pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]); + + this._point = this._map.latLngToLayerPoint(latlng); + this._radius = Math.max(this._point.x - pointLeft.x, 1); + }, + + getBounds: function () { + var lngRadius = this._getLngRadius(), + latRadius = (this._mRadius / 40075017) * 360, + latlng = this._latlng; + + return new L.LatLngBounds( + [latlng.lat - latRadius, latlng.lng - lngRadius], + [latlng.lat + latRadius, latlng.lng + lngRadius]); + }, + + getLatLng: function () { + return this._latlng; + }, + + getPathString: function () { + var p = this._point, + r = this._radius; + + if (this._checkIfEmpty()) { + return ''; + } + + if (L.Browser.svg) { + return 'M' + p.x + ',' + (p.y - r) + + 'A' + r + ',' + r + ',0,1,1,' + + (p.x - 0.1) + ',' + (p.y - r) + ' z'; + } else { + p._round(); + r = Math.round(r); + return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360); + } + }, + + getRadius: function () { + return this._mRadius; + }, + + // TODO Earth hardcoded, move into projection code! + + _getLatRadius: function () { + return (this._mRadius / 40075017) * 360; + }, + + _getLngRadius: function () { + return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); + }, + + _checkIfEmpty: function () { + if (!this._map) { + return false; + } + var vp = this._map._pathViewport, + r = this._radius, + p = this._point; + + return p.x - r > vp.max.x || p.y - r > vp.max.y || + p.x + r < vp.min.x || p.y + r < vp.min.y; + } +}); + +L.circle = function (latlng, radius, options) { + return new L.Circle(latlng, radius, options); +}; + + +/* + * L.CircleMarker is a circle overlay with a permanent pixel radius. + */ + +L.CircleMarker = L.Circle.extend({ + options: { + radius: 10, + weight: 2 + }, + + initialize: function (latlng, options) { + L.Circle.prototype.initialize.call(this, latlng, null, options); + this._radius = this.options.radius; + }, + + projectLatlngs: function () { + this._point = this._map.latLngToLayerPoint(this._latlng); + }, + + _updateStyle : function () { + L.Circle.prototype._updateStyle.call(this); + this.setRadius(this.options.radius); + }, + + setRadius: function (radius) { + this.options.radius = this._radius = radius; + return this.redraw(); + } +}); + +L.circleMarker = function (latlng, options) { + return new L.CircleMarker(latlng, options); +}; + + +/* + * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines. + */ + +L.Polyline.include(!L.Path.CANVAS ? {} : { + _containsPoint: function (p, closed) { + var i, j, k, len, len2, dist, part, + w = this.options.weight / 2; + + if (L.Browser.touch) { + w += 10; // polyline click tolerance on touch devices + } + + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + if (!closed && (j === 0)) { + continue; + } + + dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]); + + if (dist <= w) { + return true; + } + } + } + return false; + } +}); + + +/* + * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons. + */ + +L.Polygon.include(!L.Path.CANVAS ? {} : { + _containsPoint: function (p) { + var inside = false, + part, p1, p2, + i, j, k, + len, len2; + + // TODO optimization: check if within bounds first + + if (L.Polyline.prototype._containsPoint.call(this, p, true)) { + // click on polygon border + return true; + } + + // ray casting algorithm for detecting if point is in polygon + + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + p1 = part[j]; + p2 = part[k]; + + if (((p1.y > p.y) !== (p2.y > p.y)) && + (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + inside = !inside; + } + } + } + + return inside; + } +}); + + +/* + * Extends L.Circle with Canvas-specific code. + */ + +L.Circle.include(!L.Path.CANVAS ? {} : { + _drawPath: function () { + var p = this._point; + this._ctx.beginPath(); + this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false); + }, + + _containsPoint: function (p) { + var center = this._point, + w2 = this.options.stroke ? this.options.weight / 2 : 0; + + return (p.distanceTo(center) <= this._radius + w2); + } +}); + + +/* + * CircleMarker canvas specific drawing parts. + */ + +L.CircleMarker.include(!L.Path.CANVAS ? {} : { + _updateStyle: function () { + L.Path.prototype._updateStyle.call(this); + } +}); + + +/* + * L.GeoJSON turns any GeoJSON data into a Leaflet layer. + */ + +L.GeoJSON = L.FeatureGroup.extend({ + + initialize: function (geojson, options) { + L.setOptions(this, options); + + this._layers = {}; + + if (geojson) { + this.addData(geojson); + } + }, + + addData: function (geojson) { + var features = L.Util.isArray(geojson) ? geojson : geojson.features, + i, len, feature; + + if (features) { + for (i = 0, len = features.length; i < len; i++) { + // Only add this if geometry or geometries are set and not null + feature = features[i]; + if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { + this.addData(features[i]); + } + } + return this; + } + + var options = this.options; + + if (options.filter && !options.filter(geojson)) { return; } + + var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng); + layer.feature = L.GeoJSON.asFeature(geojson); + + layer.defaultOptions = layer.options; + this.resetStyle(layer); + + if (options.onEachFeature) { + options.onEachFeature(geojson, layer); + } + + return this.addLayer(layer); + }, + + resetStyle: function (layer) { + var style = this.options.style; + if (style) { + // reset any custom styles + L.Util.extend(layer.options, layer.defaultOptions); + + this._setLayerStyle(layer, style); + } + }, + + setStyle: function (style) { + this.eachLayer(function (layer) { + this._setLayerStyle(layer, style); + }, this); + }, + + _setLayerStyle: function (layer, style) { + if (typeof style === 'function') { + style = style(layer.feature); + } + if (layer.setStyle) { + layer.setStyle(style); + } + } +}); + +L.extend(L.GeoJSON, { + geometryToLayer: function (geojson, pointToLayer, coordsToLatLng) { + var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, + coords = geometry.coordinates, + layers = [], + latlng, latlngs, i, len, layer; + + coordsToLatLng = coordsToLatLng || this.coordsToLatLng; + + switch (geometry.type) { + case 'Point': + latlng = coordsToLatLng(coords); + return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); + + case 'MultiPoint': + for (i = 0, len = coords.length; i < len; i++) { + latlng = coordsToLatLng(coords[i]); + layer = pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); + layers.push(layer); + } + return new L.FeatureGroup(layers); + + case 'LineString': + latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng); + return new L.Polyline(latlngs); + + case 'Polygon': + latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); + return new L.Polygon(latlngs); + + case 'MultiLineString': + latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); + return new L.MultiPolyline(latlngs); + + case 'MultiPolygon': + latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng); + return new L.MultiPolygon(latlngs); + + case 'GeometryCollection': + for (i = 0, len = geometry.geometries.length; i < len; i++) { + + layer = this.geometryToLayer({ + geometry: geometry.geometries[i], + type: 'Feature', + properties: geojson.properties + }, pointToLayer, coordsToLatLng); + + layers.push(layer); + } + return new L.FeatureGroup(layers); + + default: + throw new Error('Invalid GeoJSON object.'); + } + }, + + coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng + return new L.LatLng(coords[1], coords[0]); + }, + + coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array + var latlng, i, len, + latlngs = []; + + for (i = 0, len = coords.length; i < len; i++) { + latlng = levelsDeep ? + this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : + (coordsToLatLng || this.coordsToLatLng)(coords[i]); + + latlngs.push(latlng); + } + + return latlngs; + }, + + latLngToCoords: function (latLng) { + return [latLng.lng, latLng.lat]; + }, + + latLngsToCoords: function (latLngs) { + var coords = []; + + for (var i = 0, len = latLngs.length; i < len; i++) { + coords.push(L.GeoJSON.latLngToCoords(latLngs[i])); + } + + return coords; + }, + + getFeature: function (layer, newGeometry) { + return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry); + }, + + asFeature: function (geoJSON) { + if (geoJSON.type === 'Feature') { + return geoJSON; + } + + return { + type: 'Feature', + properties: {}, + geometry: geoJSON + }; + } +}); + +var PointToGeoJSON = { + toGeoJSON: function () { + return L.GeoJSON.getFeature(this, { + type: 'Point', + coordinates: L.GeoJSON.latLngToCoords(this.getLatLng()) + }); + } +}; + +L.Marker.include(PointToGeoJSON); +L.Circle.include(PointToGeoJSON); +L.CircleMarker.include(PointToGeoJSON); + +L.Polyline.include({ + toGeoJSON: function () { + return L.GeoJSON.getFeature(this, { + type: 'LineString', + coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs()) + }); + } +}); + +L.Polygon.include({ + toGeoJSON: function () { + var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())], + i, len, hole; + + coords[0].push(coords[0][0]); + + if (this._holes) { + for (i = 0, len = this._holes.length; i < len; i++) { + hole = L.GeoJSON.latLngsToCoords(this._holes[i]); + hole.push(hole[0]); + coords.push(hole); + } + } + + return L.GeoJSON.getFeature(this, { + type: 'Polygon', + coordinates: coords + }); + } +}); + +(function () { + function includeMulti(Klass, type) { + Klass.include({ + toGeoJSON: function () { + var coords = []; + + this.eachLayer(function (layer) { + coords.push(layer.toGeoJSON().geometry.coordinates); + }); + + return L.GeoJSON.getFeature(this, { + type: type, + coordinates: coords + }); + } + }); + } + + includeMulti(L.MultiPolyline, 'MultiLineString'); + includeMulti(L.MultiPolygon, 'MultiPolygon'); +}()); + +L.LayerGroup.include({ + toGeoJSON: function () { + var features = []; + + this.eachLayer(function (layer) { + if (layer.toGeoJSON) { + features.push(L.GeoJSON.asFeature(layer.toGeoJSON())); + } + }); + + return { + type: 'FeatureCollection', + features: features + }; + } +}); + +L.geoJson = function (geojson, options) { + return new L.GeoJSON(geojson, options); +}; + + +/* + * L.DomEvent contains functions for working with DOM events. + */ + +L.DomEvent = { + /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */ + addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object]) + + var id = L.stamp(fn), + key = '_leaflet_' + type + id, + handler, originalHandler, newType; + + if (obj[key]) { return this; } + + handler = function (e) { + return fn.call(context || obj, e || L.DomEvent._getEvent()); + }; + + if (L.Browser.msTouch && type.indexOf('touch') === 0) { + return this.addMsTouchListener(obj, type, handler, id); + } + if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { + this.addDoubleTapListener(obj, handler, id); + } + + if ('addEventListener' in obj) { + + if (type === 'mousewheel') { + obj.addEventListener('DOMMouseScroll', handler, false); + obj.addEventListener(type, handler, false); + + } else if ((type === 'mouseenter') || (type === 'mouseleave')) { + + originalHandler = handler; + newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); + + handler = function (e) { + if (!L.DomEvent._checkMouse(obj, e)) { return; } + return originalHandler(e); + }; + + obj.addEventListener(newType, handler, false); + + } else if (type === 'click' && L.Browser.android) { + originalHandler = handler; + handler = function (e) { + return L.DomEvent._filterClick(e, originalHandler); + }; + + obj.addEventListener(type, handler, false); + } else { + obj.addEventListener(type, handler, false); + } + + } else if ('attachEvent' in obj) { + obj.attachEvent('on' + type, handler); + } + + obj[key] = handler; + + return this; + }, + + removeListener: function (obj, type, fn) { // (HTMLElement, String, Function) + + var id = L.stamp(fn), + key = '_leaflet_' + type + id, + handler = obj[key]; + + if (!handler) { return this; } + + if (L.Browser.msTouch && type.indexOf('touch') === 0) { + this.removeMsTouchListener(obj, type, id); + } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { + this.removeDoubleTapListener(obj, id); + + } else if ('removeEventListener' in obj) { + + if (type === 'mousewheel') { + obj.removeEventListener('DOMMouseScroll', handler, false); + obj.removeEventListener(type, handler, false); + + } else if ((type === 'mouseenter') || (type === 'mouseleave')) { + obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); + } else { + obj.removeEventListener(type, handler, false); + } + } else if ('detachEvent' in obj) { + obj.detachEvent('on' + type, handler); + } + + obj[key] = null; + + return this; + }, + + stopPropagation: function (e) { + + if (e.stopPropagation) { + e.stopPropagation(); + } else { + e.cancelBubble = true; + } + return this; + }, + + disableClickPropagation: function (el) { + var stop = L.DomEvent.stopPropagation; + + for (var i = L.Draggable.START.length - 1; i >= 0; i--) { + L.DomEvent.addListener(el, L.Draggable.START[i], stop); + } + + return L.DomEvent + .addListener(el, 'click', L.DomEvent._fakeStop) + .addListener(el, 'dblclick', stop); + }, + + preventDefault: function (e) { + + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + return this; + }, + + stop: function (e) { + return L.DomEvent.preventDefault(e).stopPropagation(e); + }, + + getMousePosition: function (e, container) { + + var ie7 = L.Browser.ie7, + body = document.body, + docEl = document.documentElement, + x = e.pageX ? e.pageX - body.scrollLeft - docEl.scrollLeft: e.clientX, + y = e.pageY ? e.pageY - body.scrollTop - docEl.scrollTop: e.clientY, + pos = new L.Point(x, y), + rect = container.getBoundingClientRect(), + left = rect.left - container.clientLeft, + top = rect.top - container.clientTop; + + // webkit (and ie <= 7) handles RTL scrollLeft different to everyone else + // https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js + if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) { + left += container.scrollWidth - container.clientWidth; + + // ie7 shows the scrollbar by default and provides clientWidth counting it, so we + // need to add it back in if it is visible; scrollbar is on the left as we are RTL + if (ie7 && L.DomUtil.getStyle(container, 'overflow-y') !== 'hidden' && + L.DomUtil.getStyle(container, 'overflow') !== 'hidden') { + left += 17; + } + } + + return pos._subtract(new L.Point(left, top)); + }, + + getWheelDelta: function (e) { + + var delta = 0; + + if (e.wheelDelta) { + delta = e.wheelDelta / 120; + } + if (e.detail) { + delta = -e.detail / 3; + } + return delta; + }, + + _skipEvents: {}, + + _fakeStop: function (e) { + // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e) + L.DomEvent._skipEvents[e.type] = true; + }, + + _skipped: function (e) { + var skipped = this._skipEvents[e.type]; + // reset when checking, as it's only used in map container and propagates outside of the map + this._skipEvents[e.type] = false; + return skipped; + }, + + // check if element really left/entered the event target (for mouseenter/mouseleave) + _checkMouse: function (el, e) { + + var related = e.relatedTarget; + + if (!related) { return true; } + + try { + while (related && (related !== el)) { + related = related.parentNode; + } + } catch (err) { + return false; + } + return (related !== el); + }, + + _getEvent: function () { // evil magic for IE + /*jshint noarg:false */ + var e = window.event; + if (!e) { + var caller = arguments.callee.caller; + while (caller) { + e = caller['arguments'][0]; + if (e && window.Event === e.constructor) { + break; + } + caller = caller.caller; + } + } + return e; + }, + + // this is a horrible workaround for a bug in Android where a single touch triggers two click events + _filterClick: function (e, handler) { + var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), + elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); + + // are they closer together than 1000ms yet more than 100ms? + // Android typically triggers them ~300ms apart while multiple listeners + // on the same event should be triggered far faster; + // or check if click is simulated on the element, and if it is, reject any non-simulated events + + if ((elapsed && elapsed > 100 && elapsed < 1000) || (e.target._simulatedClick && !e._simulated)) { + L.DomEvent.stop(e); + return; + } + L.DomEvent._lastClick = timeStamp; + + return handler(e); + } +}; + +L.DomEvent.on = L.DomEvent.addListener; +L.DomEvent.off = L.DomEvent.removeListener; + + +/* + * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too. + */ + +L.Draggable = L.Class.extend({ + includes: L.Mixin.Events, + + statics: { + START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], + END: { + mousedown: 'mouseup', + touchstart: 'touchend', + MSPointerDown: 'touchend' + }, + MOVE: { + mousedown: 'mousemove', + touchstart: 'touchmove', + MSPointerDown: 'touchmove' + } + }, + + initialize: function (element, dragStartTarget) { + this._element = element; + this._dragStartTarget = dragStartTarget || element; + }, + + enable: function () { + if (this._enabled) { return; } + + for (var i = L.Draggable.START.length - 1; i >= 0; i--) { + L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); + } + + this._enabled = true; + }, + + disable: function () { + if (!this._enabled) { return; } + + for (var i = L.Draggable.START.length - 1; i >= 0; i--) { + L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); + } + + this._enabled = false; + this._moved = false; + }, + + _onDown: function (e) { + if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + + L.DomEvent + .stopPropagation(e); + + if (L.Draggable._disabled) { return; } + + L.DomUtil.disableImageDrag(); + L.DomUtil.disableTextSelection(); + + var first = e.touches ? e.touches[0] : e, + el = first.target; + + // if touching a link, highlight it + if (L.Browser.touch && el.tagName.toLowerCase() === 'a') { + L.DomUtil.addClass(el, 'leaflet-active'); + } + + this._moved = false; + + if (this._moving) { return; } + + this._startPoint = new L.Point(first.clientX, first.clientY); + this._startPos = this._newPos = L.DomUtil.getPosition(this._element); + + L.DomEvent + .on(document, L.Draggable.MOVE[e.type], this._onMove, this) + .on(document, L.Draggable.END[e.type], this._onUp, this); + }, + + _onMove: function (e) { + if (e.touches && e.touches.length > 1) { return; } + + var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), + newPoint = new L.Point(first.clientX, first.clientY), + offset = newPoint.subtract(this._startPoint); + + if (!offset.x && !offset.y) { return; } + + L.DomEvent.preventDefault(e); + + if (!this._moved) { + this.fire('dragstart'); + + this._moved = true; + this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); + + if (!L.Browser.touch) { + L.DomUtil.addClass(document.body, 'leaflet-dragging'); + } + } + + this._newPos = this._startPos.add(offset); + this._moving = true; + + L.Util.cancelAnimFrame(this._animRequest); + this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); + }, + + _updatePosition: function () { + this.fire('predrag'); + L.DomUtil.setPosition(this._element, this._newPos); + this.fire('drag'); + }, + + _onUp: function () { + if (!L.Browser.touch) { + L.DomUtil.removeClass(document.body, 'leaflet-dragging'); + } + + for (var i in L.Draggable.MOVE) { + L.DomEvent + .off(document, L.Draggable.MOVE[i], this._onMove) + .off(document, L.Draggable.END[i], this._onUp); + } + + L.DomUtil.enableImageDrag(); + L.DomUtil.enableTextSelection(); + + if (this._moved) { + // ensure drag is not fired after dragend + L.Util.cancelAnimFrame(this._animRequest); + + this.fire('dragend'); + } + + this._moving = false; + } +}); + + +/* + L.Handler is a base class for handler classes that are used internally to inject + interaction features like dragging to classes like Map and Marker. +*/ + +L.Handler = L.Class.extend({ + initialize: function (map) { + this._map = map; + }, + + enable: function () { + if (this._enabled) { return; } + + this._enabled = true; + this.addHooks(); + }, + + disable: function () { + if (!this._enabled) { return; } + + this._enabled = false; + this.removeHooks(); + }, + + enabled: function () { + return !!this._enabled; + } +}); + + +/* + * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. + */ + +L.Map.mergeOptions({ + dragging: true, + + inertia: !L.Browser.android23, + inertiaDeceleration: 3400, // px/s^2 + inertiaMaxSpeed: Infinity, // px/s + inertiaThreshold: L.Browser.touch ? 32 : 18, // ms + easeLinearity: 0.25, + + // TODO refactor, move to CRS + worldCopyJump: false +}); + +L.Map.Drag = L.Handler.extend({ + addHooks: function () { + if (!this._draggable) { + var map = this._map; + + this._draggable = new L.Draggable(map._mapPane, map._container); + + this._draggable.on({ + 'dragstart': this._onDragStart, + 'drag': this._onDrag, + 'dragend': this._onDragEnd + }, this); + + if (map.options.worldCopyJump) { + this._draggable.on('predrag', this._onPreDrag, this); + map.on('viewreset', this._onViewReset, this); + + this._onViewReset(); + } + } + this._draggable.enable(); + }, + + removeHooks: function () { + this._draggable.disable(); + }, + + moved: function () { + return this._draggable && this._draggable._moved; + }, + + _onDragStart: function () { + var map = this._map; + + if (map._panAnim) { + map._panAnim.stop(); + } + + map + .fire('movestart') + .fire('dragstart'); + + if (map.options.inertia) { + this._positions = []; + this._times = []; + } + }, + + _onDrag: function () { + if (this._map.options.inertia) { + var time = this._lastTime = +new Date(), + pos = this._lastPos = this._draggable._newPos; + + this._positions.push(pos); + this._times.push(time); + + if (time - this._times[0] > 200) { + this._positions.shift(); + this._times.shift(); + } + } + + this._map + .fire('move') + .fire('drag'); + }, + + _onViewReset: function () { + // TODO fix hardcoded Earth values + var pxCenter = this._map.getSize()._divideBy(2), + pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); + + this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; + this._worldWidth = this._map.project([0, 180]).x; + }, + + _onPreDrag: function () { + // TODO refactor to be able to adjust map pane position after zoom + var worldWidth = this._worldWidth, + halfWidth = Math.round(worldWidth / 2), + dx = this._initialWorldOffset, + x = this._draggable._newPos.x, + newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, + newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, + newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; + + this._draggable._newPos.x = newX; + }, + + _onDragEnd: function () { + var map = this._map, + options = map.options, + delay = +new Date() - this._lastTime, + + noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; + + map.fire('dragend'); + + if (noInertia) { + map.fire('moveend'); + + } else { + + var direction = this._lastPos.subtract(this._positions[0]), + duration = (this._lastTime + delay - this._times[0]) / 1000, + ease = options.easeLinearity, + + speedVector = direction.multiplyBy(ease / duration), + speed = speedVector.distanceTo([0, 0]), + + limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), + limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), + + decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), + offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); + + if (!offset.x || !offset.y) { + map.fire('moveend'); + + } else { + L.Util.requestAnimFrame(function () { + map.panBy(offset, { + duration: decelerationDuration, + easeLinearity: ease, + noMoveStart: true + }); + }); + } + } + } +}); + +L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); + + +/* + * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. + */ + +L.Map.mergeOptions({ + doubleClickZoom: true +}); + +L.Map.DoubleClickZoom = L.Handler.extend({ + addHooks: function () { + this._map.on('dblclick', this._onDoubleClick); + }, + + removeHooks: function () { + this._map.off('dblclick', this._onDoubleClick); + }, + + _onDoubleClick: function (e) { + this.setZoomAround(e.containerPoint, this._zoom + 1); + } +}); + +L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); + + +/* + * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. + */ + +L.Map.mergeOptions({ + scrollWheelZoom: true +}); + +L.Map.ScrollWheelZoom = L.Handler.extend({ + addHooks: function () { + L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); + L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); + this._delta = 0; + }, + + removeHooks: function () { + L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll); + L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); + }, + + _onWheelScroll: function (e) { + var delta = L.DomEvent.getWheelDelta(e); + + this._delta += delta; + this._lastMousePos = this._map.mouseEventToContainerPoint(e); + + if (!this._startTime) { + this._startTime = +new Date(); + } + + var left = Math.max(40 - (+new Date() - this._startTime), 0); + + clearTimeout(this._timer); + this._timer = setTimeout(L.bind(this._performZoom, this), left); + + L.DomEvent.preventDefault(e); + L.DomEvent.stopPropagation(e); + }, + + _performZoom: function () { + var map = this._map, + delta = this._delta, + zoom = map.getZoom(); + + delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta); + delta = Math.max(Math.min(delta, 4), -4); + delta = map._limitZoom(zoom + delta) - zoom; + + this._delta = 0; + this._startTime = null; + + if (!delta) { return; } + + map.setZoomAround(this._lastMousePos, zoom + delta); + } +}); + +L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); + + +/* + * Extends the event handling code with double tap support for mobile browsers. + */ + +L.extend(L.DomEvent, { + + _touchstart: L.Browser.msTouch ? 'MSPointerDown' : 'touchstart', + _touchend: L.Browser.msTouch ? 'MSPointerUp' : 'touchend', + + // inspired by Zepto touch code by Thomas Fuchs + addDoubleTapListener: function (obj, handler, id) { + var last, + doubleTap = false, + delay = 250, + touch, + pre = '_leaflet_', + touchstart = this._touchstart, + touchend = this._touchend, + trackedTouches = []; + + function onTouchStart(e) { + var count; + + if (L.Browser.msTouch) { + trackedTouches.push(e.pointerId); + count = trackedTouches.length; + } else { + count = e.touches.length; + } + if (count > 1) { + return; + } + + var now = Date.now(), + delta = now - (last || now); + + touch = e.touches ? e.touches[0] : e; + doubleTap = (delta > 0 && delta <= delay); + last = now; + } + + function onTouchEnd(e) { + if (L.Browser.msTouch) { + var idx = trackedTouches.indexOf(e.pointerId); + if (idx === -1) { + return; + } + trackedTouches.splice(idx, 1); + } + + if (doubleTap) { + if (L.Browser.msTouch) { + // work around .type being readonly with MSPointer* events + var newTouch = { }, + prop; + + // jshint forin:false + for (var i in touch) { + prop = touch[i]; + if (typeof prop === 'function') { + newTouch[i] = prop.bind(touch); + } else { + newTouch[i] = prop; + } + } + touch = newTouch; + } + touch.type = 'dblclick'; + handler(touch); + last = null; + } + } + obj[pre + touchstart + id] = onTouchStart; + obj[pre + touchend + id] = onTouchEnd; + + // on msTouch we need to listen on the document, otherwise a drag starting on the map and moving off screen + // will not come through to us, so we will lose track of how many touches are ongoing + var endElement = L.Browser.msTouch ? document.documentElement : obj; + + obj.addEventListener(touchstart, onTouchStart, false); + endElement.addEventListener(touchend, onTouchEnd, false); + + if (L.Browser.msTouch) { + endElement.addEventListener('MSPointerCancel', onTouchEnd, false); + } + + return this; + }, + + removeDoubleTapListener: function (obj, id) { + var pre = '_leaflet_'; + + obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); + (L.Browser.msTouch ? document.documentElement : obj).removeEventListener( + this._touchend, obj[pre + this._touchend + id], false); + + if (L.Browser.msTouch) { + document.documentElement.removeEventListener('MSPointerCancel', obj[pre + this._touchend + id], false); + } + + return this; + } +}); + + +/* + * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. + */ + +L.extend(L.DomEvent, { + + _msTouches: [], + _msDocumentListener: false, + + // Provides a touch events wrapper for msPointer events. + // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 + + addMsTouchListener: function (obj, type, handler, id) { + + switch (type) { + case 'touchstart': + return this.addMsTouchListenerStart(obj, type, handler, id); + case 'touchend': + return this.addMsTouchListenerEnd(obj, type, handler, id); + case 'touchmove': + return this.addMsTouchListenerMove(obj, type, handler, id); + default: + throw 'Unknown touch event type'; + } + }, + + addMsTouchListenerStart: function (obj, type, handler, id) { + var pre = '_leaflet_', + touches = this._msTouches; + + var cb = function (e) { + + var alreadyInArray = false; + for (var i = 0; i < touches.length; i++) { + if (touches[i].pointerId === e.pointerId) { + alreadyInArray = true; + break; + } + } + if (!alreadyInArray) { + touches.push(e); + } + + e.touches = touches.slice(); + e.changedTouches = [e]; + + handler(e); + }; + + obj[pre + 'touchstart' + id] = cb; + obj.addEventListener('MSPointerDown', cb, false); + + // need to also listen for end events to keep the _msTouches list accurate + // this needs to be on the body and never go away + if (!this._msDocumentListener) { + var internalCb = function (e) { + for (var i = 0; i < touches.length; i++) { + if (touches[i].pointerId === e.pointerId) { + touches.splice(i, 1); + break; + } + } + }; + //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there + document.documentElement.addEventListener('MSPointerUp', internalCb, false); + document.documentElement.addEventListener('MSPointerCancel', internalCb, false); + + this._msDocumentListener = true; + } + + return this; + }, + + addMsTouchListenerMove: function (obj, type, handler, id) { + var pre = '_leaflet_', + touches = this._msTouches; + + function cb(e) { + + // don't fire touch moves when mouse isn't down + if (e.pointerType === e.MSPOINTER_TYPE_MOUSE && e.buttons === 0) { return; } + + for (var i = 0; i < touches.length; i++) { + if (touches[i].pointerId === e.pointerId) { + touches[i] = e; + break; + } + } + + e.touches = touches.slice(); + e.changedTouches = [e]; + + handler(e); + } + + obj[pre + 'touchmove' + id] = cb; + obj.addEventListener('MSPointerMove', cb, false); + + return this; + }, + + addMsTouchListenerEnd: function (obj, type, handler, id) { + var pre = '_leaflet_', + touches = this._msTouches; + + var cb = function (e) { + for (var i = 0; i < touches.length; i++) { + if (touches[i].pointerId === e.pointerId) { + touches.splice(i, 1); + break; + } + } + + e.touches = touches.slice(); + e.changedTouches = [e]; + + handler(e); + }; + + obj[pre + 'touchend' + id] = cb; + obj.addEventListener('MSPointerUp', cb, false); + obj.addEventListener('MSPointerCancel', cb, false); + + return this; + }, + + removeMsTouchListener: function (obj, type, id) { + var pre = '_leaflet_', + cb = obj[pre + type + id]; + + switch (type) { + case 'touchstart': + obj.removeEventListener('MSPointerDown', cb, false); + break; + case 'touchmove': + obj.removeEventListener('MSPointerMove', cb, false); + break; + case 'touchend': + obj.removeEventListener('MSPointerUp', cb, false); + obj.removeEventListener('MSPointerCancel', cb, false); + break; + } + + return this; + } +}); + + +/* + * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. + */ + +L.Map.mergeOptions({ + touchZoom: L.Browser.touch && !L.Browser.android23 +}); + +L.Map.TouchZoom = L.Handler.extend({ + addHooks: function () { + L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); + }, + + _onTouchStart: function (e) { + var map = this._map; + + if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } + + var p1 = map.mouseEventToLayerPoint(e.touches[0]), + p2 = map.mouseEventToLayerPoint(e.touches[1]), + viewCenter = map._getCenterLayerPoint(); + + this._startCenter = p1.add(p2)._divideBy(2); + this._startDist = p1.distanceTo(p2); + + this._moved = false; + this._zooming = true; + + this._centerOffset = viewCenter.subtract(this._startCenter); + + if (map._panAnim) { + map._panAnim.stop(); + } + + L.DomEvent + .on(document, 'touchmove', this._onTouchMove, this) + .on(document, 'touchend', this._onTouchEnd, this); + + L.DomEvent.preventDefault(e); + }, + + _onTouchMove: function (e) { + var map = this._map; + + if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } + + var p1 = map.mouseEventToLayerPoint(e.touches[0]), + p2 = map.mouseEventToLayerPoint(e.touches[1]); + + this._scale = p1.distanceTo(p2) / this._startDist; + this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); + + if (this._scale === 1) { return; } + + if (!this._moved) { + L.DomUtil.addClass(map._mapPane, 'leaflet-touching'); + + map + .fire('movestart') + .fire('zoomstart'); + + this._moved = true; + } + + L.Util.cancelAnimFrame(this._animRequest); + this._animRequest = L.Util.requestAnimFrame( + this._updateOnMove, this, true, this._map._container); + + L.DomEvent.preventDefault(e); + }, + + _updateOnMove: function () { + var map = this._map, + origin = this._getScaleOrigin(), + center = map.layerPointToLatLng(origin), + zoom = map.getScaleZoom(this._scale); + + map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta); + }, + + _onTouchEnd: function () { + if (!this._moved || !this._zooming) { + this._zooming = false; + return; + } + + var map = this._map; + + this._zooming = false; + L.DomUtil.removeClass(map._mapPane, 'leaflet-touching'); + L.Util.cancelAnimFrame(this._animRequest); + + L.DomEvent + .off(document, 'touchmove', this._onTouchMove) + .off(document, 'touchend', this._onTouchEnd); + + var origin = this._getScaleOrigin(), + center = map.layerPointToLatLng(origin), + + oldZoom = map.getZoom(), + floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom, + roundZoomDelta = (floatZoomDelta > 0 ? + Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)), + + zoom = map._limitZoom(oldZoom + roundZoomDelta), + scale = map.getZoomScale(zoom) / this._scale; + + map._animateZoom(center, zoom, origin, scale); + }, + + _getScaleOrigin: function () { + var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale); + return this._startCenter.add(centerOffset); + } +}); + +L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); + + +/* + * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. + */ + +L.Map.mergeOptions({ + tap: true, + tapTolerance: 15 +}); + +L.Map.Tap = L.Handler.extend({ + addHooks: function () { + L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this); + }, + + _onDown: function (e) { + if (!e.touches) { return; } + + L.DomEvent.preventDefault(e); + + this._fireClick = true; + + // don't simulate click or track longpress if more than 1 touch + if (e.touches.length > 1) { + this._fireClick = false; + clearTimeout(this._holdTimeout); + return; + } + + var first = e.touches[0], + el = first.target; + + this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); + + // if touching a link, highlight it + if (el.tagName.toLowerCase() === 'a') { + L.DomUtil.addClass(el, 'leaflet-active'); + } + + // simulate long hold but setting a timeout + this._holdTimeout = setTimeout(L.bind(function () { + if (this._isTapValid()) { + this._fireClick = false; + this._onUp(); + this._simulateEvent('contextmenu', first); + } + }, this), 1000); + + L.DomEvent + .on(document, 'touchmove', this._onMove, this) + .on(document, 'touchend', this._onUp, this); + }, + + _onUp: function (e) { + clearTimeout(this._holdTimeout); + + L.DomEvent + .off(document, 'touchmove', this._onMove, this) + .off(document, 'touchend', this._onUp, this); + + if (this._fireClick && e && e.changedTouches) { + + var first = e.changedTouches[0], + el = first.target; + + if (el.tagName.toLowerCase() === 'a') { + L.DomUtil.removeClass(el, 'leaflet-active'); + } + + // simulate click if the touch didn't move too much + if (this._isTapValid()) { + this._simulateEvent('click', first); + } + } + }, + + _isTapValid: function () { + return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; + }, + + _onMove: function (e) { + var first = e.touches[0]; + this._newPos = new L.Point(first.clientX, first.clientY); + }, + + _simulateEvent: function (type, e) { + var simulatedEvent = document.createEvent('MouseEvents'); + + simulatedEvent._simulated = true; + e.target._simulatedClick = true; + + simulatedEvent.initMouseEvent( + type, true, true, window, 1, + e.screenX, e.screenY, + e.clientX, e.clientY, + false, false, false, false, 0, null); + + e.target.dispatchEvent(simulatedEvent); + } +}); + +if (L.Browser.touch && !L.Browser.msTouch) { + L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); +} + + +/* + * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map + * (zoom to a selected bounding box), enabled by default. + */ + +L.Map.mergeOptions({ + boxZoom: true +}); + +L.Map.BoxZoom = L.Handler.extend({ + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + }, + + addHooks: function () { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); + }, + + _onMouseDown: function (e) { + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } + + L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); + + this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); + L.DomUtil.setPosition(this._box, this._startLayerPoint); + + //TODO refactor: move cursor to styles + this._container.style.cursor = 'crosshair'; + + L.DomEvent + .on(document, 'mousemove', this._onMouseMove, this) + .on(document, 'mouseup', this._onMouseUp, this) + .on(document, 'keydown', this._onKeyDown, this); + + this._map.fire('boxzoomstart'); + }, + + _onMouseMove: function (e) { + var startPoint = this._startLayerPoint, + box = this._box, + + layerPoint = this._map.mouseEventToLayerPoint(e), + offset = layerPoint.subtract(startPoint), + + newPos = new L.Point( + Math.min(layerPoint.x, startPoint.x), + Math.min(layerPoint.y, startPoint.y)); + + L.DomUtil.setPosition(box, newPos); + + // TODO refactor: remove hardcoded 4 pixels + box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; + box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; + }, + + _finish: function () { + this._pane.removeChild(this._box); + this._container.style.cursor = ''; + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + + L.DomEvent + .off(document, 'mousemove', this._onMouseMove) + .off(document, 'mouseup', this._onMouseUp) + .off(document, 'keydown', this._onKeyDown); + }, + + _onMouseUp: function (e) { + + this._finish(); + + var map = this._map, + layerPoint = map.mouseEventToLayerPoint(e); + + if (this._startLayerPoint.equals(layerPoint)) { return; } + + var bounds = new L.LatLngBounds( + map.layerPointToLatLng(this._startLayerPoint), + map.layerPointToLatLng(layerPoint)); + + map.fitBounds(bounds); + + map.fire('boxzoomend', { + boxZoomBounds: bounds + }); + }, + + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._finish(); + } + } +}); + +L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); + + +/* + * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. + */ + +L.Map.mergeOptions({ + keyboard: true, + keyboardPanOffset: 80, + keyboardZoomOffset: 1 +}); + +L.Map.Keyboard = L.Handler.extend({ + + keyCodes: { + left: [37], + right: [39], + down: [40], + up: [38], + zoomIn: [187, 107, 61], + zoomOut: [189, 109, 173] + }, + + initialize: function (map) { + this._map = map; + + this._setPanOffset(map.options.keyboardPanOffset); + this._setZoomOffset(map.options.keyboardZoomOffset); + }, + + addHooks: function () { + var container = this._map._container; + + // make the container focusable by tabbing + if (container.tabIndex === -1) { + container.tabIndex = '0'; + } + + L.DomEvent + .on(container, 'focus', this._onFocus, this) + .on(container, 'blur', this._onBlur, this) + .on(container, 'mousedown', this._onMouseDown, this); + + this._map + .on('focus', this._addHooks, this) + .on('blur', this._removeHooks, this); + }, + + removeHooks: function () { + this._removeHooks(); + + var container = this._map._container; + + L.DomEvent + .off(container, 'focus', this._onFocus, this) + .off(container, 'blur', this._onBlur, this) + .off(container, 'mousedown', this._onMouseDown, this); + + this._map + .off('focus', this._addHooks, this) + .off('blur', this._removeHooks, this); + }, + + _onMouseDown: function () { + if (this._focused) { return; } + + var body = document.body, + docEl = document.documentElement, + top = body.scrollTop || docEl.scrollTop, + left = body.scrollLeft || docEl.scrollLeft; + + this._map._container.focus(); + + window.scrollTo(left, top); + }, + + _onFocus: function () { + this._focused = true; + this._map.fire('focus'); + }, + + _onBlur: function () { + this._focused = false; + this._map.fire('blur'); + }, + + _setPanOffset: function (pan) { + var keys = this._panKeys = {}, + codes = this.keyCodes, + i, len; + + for (i = 0, len = codes.left.length; i < len; i++) { + keys[codes.left[i]] = [-1 * pan, 0]; + } + for (i = 0, len = codes.right.length; i < len; i++) { + keys[codes.right[i]] = [pan, 0]; + } + for (i = 0, len = codes.down.length; i < len; i++) { + keys[codes.down[i]] = [0, pan]; + } + for (i = 0, len = codes.up.length; i < len; i++) { + keys[codes.up[i]] = [0, -1 * pan]; + } + }, + + _setZoomOffset: function (zoom) { + var keys = this._zoomKeys = {}, + codes = this.keyCodes, + i, len; + + for (i = 0, len = codes.zoomIn.length; i < len; i++) { + keys[codes.zoomIn[i]] = zoom; + } + for (i = 0, len = codes.zoomOut.length; i < len; i++) { + keys[codes.zoomOut[i]] = -zoom; + } + }, + + _addHooks: function () { + L.DomEvent.on(document, 'keydown', this._onKeyDown, this); + }, + + _removeHooks: function () { + L.DomEvent.off(document, 'keydown', this._onKeyDown, this); + }, + + _onKeyDown: function (e) { + var key = e.keyCode, + map = this._map; + + if (key in this._panKeys) { + + if (map._panAnim && map._panAnim._inProgress) { return; } + + map.panBy(this._panKeys[key]); + + if (map.options.maxBounds) { + map.panInsideBounds(map.options.maxBounds); + } + + } else if (key in this._zoomKeys) { + map.setZoom(map.getZoom() + this._zoomKeys[key]); + + } else { + return; + } + + L.DomEvent.stop(e); + } +}); + +L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); + + +/* + * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. + */ + +L.Handler.MarkerDrag = L.Handler.extend({ + initialize: function (marker) { + this._marker = marker; + }, + + addHooks: function () { + var icon = this._marker._icon; + if (!this._draggable) { + this._draggable = new L.Draggable(icon, icon); + } + + this._draggable + .on('dragstart', this._onDragStart, this) + .on('drag', this._onDrag, this) + .on('dragend', this._onDragEnd, this); + this._draggable.enable(); + }, + + removeHooks: function () { + this._draggable + .off('dragstart', this._onDragStart, this) + .off('drag', this._onDrag, this) + .off('dragend', this._onDragEnd, this); + + this._draggable.disable(); + }, + + moved: function () { + return this._draggable && this._draggable._moved; + }, + + _onDragStart: function () { + this._marker + .closePopup() + .fire('movestart') + .fire('dragstart'); + }, + + _onDrag: function () { + var marker = this._marker, + shadow = marker._shadow, + iconPos = L.DomUtil.getPosition(marker._icon), + latlng = marker._map.layerPointToLatLng(iconPos); + + // update shadow position + if (shadow) { + L.DomUtil.setPosition(shadow, iconPos); + } + + marker._latlng = latlng; + + marker + .fire('move', {latlng: latlng}) + .fire('drag'); + }, + + _onDragEnd: function () { + this._marker + .fire('moveend') + .fire('dragend'); + } +}); + + +/* + * L.Control is a base class for implementing map controls. Handles positioning. + * All other controls extend from this class. + */ + +L.Control = L.Class.extend({ + options: { + position: 'topright' + }, + + initialize: function (options) { + L.setOptions(this, options); + }, + + getPosition: function () { + return this.options.position; + }, + + setPosition: function (position) { + var map = this._map; + + if (map) { + map.removeControl(this); + } + + this.options.position = position; + + if (map) { + map.addControl(this); + } + + return this; + }, + + getContainer: function () { + return this._container; + }, + + addTo: function (map) { + this._map = map; + + var container = this._container = this.onAdd(map), + pos = this.getPosition(), + corner = map._controlCorners[pos]; + + L.DomUtil.addClass(container, 'leaflet-control'); + + if (pos.indexOf('bottom') !== -1) { + corner.insertBefore(container, corner.firstChild); + } else { + corner.appendChild(container); + } + + return this; + }, + + removeFrom: function (map) { + var pos = this.getPosition(), + corner = map._controlCorners[pos]; + + corner.removeChild(this._container); + this._map = null; + + if (this.onRemove) { + this.onRemove(map); + } + + return this; + } +}); + +L.control = function (options) { + return new L.Control(options); +}; + + +// adds control-related methods to L.Map + +L.Map.include({ + addControl: function (control) { + control.addTo(this); + return this; + }, + + removeControl: function (control) { + control.removeFrom(this); + return this; + }, + + _initControlPos: function () { + var corners = this._controlCorners = {}, + l = 'leaflet-', + container = this._controlContainer = + L.DomUtil.create('div', l + 'control-container', this._container); + + function createCorner(vSide, hSide) { + var className = l + vSide + ' ' + l + hSide; + + corners[vSide + hSide] = L.DomUtil.create('div', className, container); + } + + createCorner('top', 'left'); + createCorner('top', 'right'); + createCorner('bottom', 'left'); + createCorner('bottom', 'right'); + }, + + _clearControlPos: function () { + this._container.removeChild(this._controlContainer); + } +}); + + +/* + * L.Control.Zoom is used for the default zoom buttons on the map. + */ + +L.Control.Zoom = L.Control.extend({ + options: { + position: 'topleft' + }, + + onAdd: function (map) { + var zoomName = 'leaflet-control-zoom', + container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); + + this._map = map; + + this._zoomInButton = this._createButton( + '+', 'Zoom in', zoomName + '-in', container, this._zoomIn, this); + this._zoomOutButton = this._createButton( + '-', 'Zoom out', zoomName + '-out', container, this._zoomOut, this); + + map.on('zoomend zoomlevelschange', this._updateDisabled, this); + + return container; + }, + + onRemove: function (map) { + map.off('zoomend zoomlevelschange', this._updateDisabled, this); + }, + + _zoomIn: function (e) { + this._map.zoomIn(e.shiftKey ? 3 : 1); + }, + + _zoomOut: function (e) { + this._map.zoomOut(e.shiftKey ? 3 : 1); + }, + + _createButton: function (html, title, className, container, fn, context) { + var link = L.DomUtil.create('a', className, container); + link.innerHTML = html; + link.href = '#'; + link.title = title; + + var stop = L.DomEvent.stopPropagation; + + L.DomEvent + .on(link, 'click', stop) + .on(link, 'mousedown', stop) + .on(link, 'dblclick', stop) + .on(link, 'click', L.DomEvent.preventDefault) + .on(link, 'click', fn, context); + + return link; + }, + + _updateDisabled: function () { + var map = this._map, + className = 'leaflet-disabled'; + + L.DomUtil.removeClass(this._zoomInButton, className); + L.DomUtil.removeClass(this._zoomOutButton, className); + + if (map._zoom === map.getMinZoom()) { + L.DomUtil.addClass(this._zoomOutButton, className); + } + if (map._zoom === map.getMaxZoom()) { + L.DomUtil.addClass(this._zoomInButton, className); + } + } +}); + +L.Map.mergeOptions({ + zoomControl: true +}); + +L.Map.addInitHook(function () { + if (this.options.zoomControl) { + this.zoomControl = new L.Control.Zoom(); + this.addControl(this.zoomControl); + } +}); + +L.control.zoom = function (options) { + return new L.Control.Zoom(options); +}; + + + +/* + * L.Control.Attribution is used for displaying attribution on the map (added by default). + */ + +L.Control.Attribution = L.Control.extend({ + options: { + position: 'bottomright', + prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>' + }, + + initialize: function (options) { + L.setOptions(this, options); + + this._attributions = {}; + }, + + onAdd: function (map) { + this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); + L.DomEvent.disableClickPropagation(this._container); + + map + .on('layeradd', this._onLayerAdd, this) + .on('layerremove', this._onLayerRemove, this); + + this._update(); + + return this._container; + }, + + onRemove: function (map) { + map + .off('layeradd', this._onLayerAdd) + .off('layerremove', this._onLayerRemove); + + }, + + setPrefix: function (prefix) { + this.options.prefix = prefix; + this._update(); + return this; + }, + + addAttribution: function (text) { + if (!text) { return; } + + if (!this._attributions[text]) { + this._attributions[text] = 0; + } + this._attributions[text]++; + + this._update(); + + return this; + }, + + removeAttribution: function (text) { + if (!text) { return; } + + if (this._attributions[text]) { + this._attributions[text]--; + this._update(); + } + + return this; + }, + + _update: function () { + if (!this._map) { return; } + + var attribs = []; + + for (var i in this._attributions) { + if (this._attributions[i]) { + attribs.push(i); + } + } + + var prefixAndAttribs = []; + + if (this.options.prefix) { + prefixAndAttribs.push(this.options.prefix); + } + if (attribs.length) { + prefixAndAttribs.push(attribs.join(', ')); + } + + this._container.innerHTML = prefixAndAttribs.join(' | '); + }, + + _onLayerAdd: function (e) { + if (e.layer.getAttribution) { + this.addAttribution(e.layer.getAttribution()); + } + }, + + _onLayerRemove: function (e) { + if (e.layer.getAttribution) { + this.removeAttribution(e.layer.getAttribution()); + } + } +}); + +L.Map.mergeOptions({ + attributionControl: true +}); + +L.Map.addInitHook(function () { + if (this.options.attributionControl) { + this.attributionControl = (new L.Control.Attribution()).addTo(this); + } +}); + +L.control.attribution = function (options) { + return new L.Control.Attribution(options); +}; + + +/* + * L.Control.Scale is used for displaying metric/imperial scale on the map. + */ + +L.Control.Scale = L.Control.extend({ + options: { + position: 'bottomleft', + maxWidth: 100, + metric: true, + imperial: true, + updateWhenIdle: false + }, + + onAdd: function (map) { + this._map = map; + + var className = 'leaflet-control-scale', + container = L.DomUtil.create('div', className), + options = this.options; + + this._addScales(options, className, container); + + map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + map.whenReady(this._update, this); + + return container; + }, + + onRemove: function (map) { + map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + }, + + _addScales: function (options, className, container) { + if (options.metric) { + this._mScale = L.DomUtil.create('div', className + '-line', container); + } + if (options.imperial) { + this._iScale = L.DomUtil.create('div', className + '-line', container); + } + }, + + _update: function () { + var bounds = this._map.getBounds(), + centerLat = bounds.getCenter().lat, + halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), + dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180, + + size = this._map.getSize(), + options = this.options, + maxMeters = 0; + + if (size.x > 0) { + maxMeters = dist * (options.maxWidth / size.x); + } + + this._updateScales(options, maxMeters); + }, + + _updateScales: function (options, maxMeters) { + if (options.metric && maxMeters) { + this._updateMetric(maxMeters); + } + + if (options.imperial && maxMeters) { + this._updateImperial(maxMeters); + } + }, + + _updateMetric: function (maxMeters) { + var meters = this._getRoundNum(maxMeters); + + this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px'; + this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; + }, + + _updateImperial: function (maxMeters) { + var maxFeet = maxMeters * 3.2808399, + scale = this._iScale, + maxMiles, miles, feet; + + if (maxFeet > 5280) { + maxMiles = maxFeet / 5280; + miles = this._getRoundNum(maxMiles); + + scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px'; + scale.innerHTML = miles + ' mi'; + + } else { + feet = this._getRoundNum(maxFeet); + + scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px'; + scale.innerHTML = feet + ' ft'; + } + }, + + _getScaleWidth: function (ratio) { + return Math.round(this.options.maxWidth * ratio) - 10; + }, + + _getRoundNum: function (num) { + var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), + d = num / pow10; + + d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; + + return pow10 * d; + } +}); + +L.control.scale = function (options) { + return new L.Control.Scale(options); +}; + + +/* + * L.Control.Layers is a control to allow users to switch between different layers on the map. + */ + +L.Control.Layers = L.Control.extend({ + options: { + collapsed: true, + position: 'topright', + autoZIndex: true + }, + + initialize: function (baseLayers, overlays, options) { + L.setOptions(this, options); + + this._layers = {}; + this._lastZIndex = 0; + this._handlingClick = false; + + for (var i in baseLayers) { + this._addLayer(baseLayers[i], i); + } + + for (i in overlays) { + this._addLayer(overlays[i], i, true); + } + }, + + onAdd: function (map) { + this._initLayout(); + this._update(); + + map + .on('layeradd', this._onLayerChange, this) + .on('layerremove', this._onLayerChange, this); + + return this._container; + }, + + onRemove: function (map) { + map + .off('layeradd', this._onLayerChange) + .off('layerremove', this._onLayerChange); + }, + + addBaseLayer: function (layer, name) { + this._addLayer(layer, name); + this._update(); + return this; + }, + + addOverlay: function (layer, name) { + this._addLayer(layer, name, true); + this._update(); + return this; + }, + + removeLayer: function (layer) { + var id = L.stamp(layer); + delete this._layers[id]; + this._update(); + return this; + }, + + _initLayout: function () { + var className = 'leaflet-control-layers', + container = this._container = L.DomUtil.create('div', className); + + //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released + container.setAttribute('aria-haspopup', true); + + if (!L.Browser.touch) { + L.DomEvent.disableClickPropagation(container); + L.DomEvent.on(container, 'mousewheel', L.DomEvent.stopPropagation); + } else { + L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); + } + + var form = this._form = L.DomUtil.create('form', className + '-list'); + + if (this.options.collapsed) { + if (!L.Browser.android) { + L.DomEvent + .on(container, 'mouseover', this._expand, this) + .on(container, 'mouseout', this._collapse, this); + } + var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); + link.href = '#'; + link.title = 'Layers'; + + if (L.Browser.touch) { + L.DomEvent + .on(link, 'click', L.DomEvent.stop) + .on(link, 'click', this._expand, this); + } + else { + L.DomEvent.on(link, 'focus', this._expand, this); + } + + this._map.on('click', this._collapse, this); + // TODO keyboard accessibility + } else { + this._expand(); + } + + this._baseLayersList = L.DomUtil.create('div', className + '-base', form); + this._separator = L.DomUtil.create('div', className + '-separator', form); + this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); + + container.appendChild(form); + }, + + _addLayer: function (layer, name, overlay) { + var id = L.stamp(layer); + + this._layers[id] = { + layer: layer, + name: name, + overlay: overlay + }; + + if (this.options.autoZIndex && layer.setZIndex) { + this._lastZIndex++; + layer.setZIndex(this._lastZIndex); + } + }, + + _update: function () { + if (!this._container) { + return; + } + + this._baseLayersList.innerHTML = ''; + this._overlaysList.innerHTML = ''; + + var baseLayersPresent = false, + overlaysPresent = false, + i, obj; + + for (i in this._layers) { + obj = this._layers[i]; + this._addItem(obj); + overlaysPresent = overlaysPresent || obj.overlay; + baseLayersPresent = baseLayersPresent || !obj.overlay; + } + + this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; + }, + + _onLayerChange: function (e) { + var obj = this._layers[L.stamp(e.layer)]; + + if (!obj) { return; } + + if (!this._handlingClick) { + this._update(); + } + + var type = obj.overlay ? + (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') : + (e.type === 'layeradd' ? 'baselayerchange' : null); + + if (type) { + this._map.fire(type, obj); + } + }, + + // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) + _createRadioElement: function (name, checked) { + + var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' + name + '"'; + if (checked) { + radioHtml += ' checked="checked"'; + } + radioHtml += '/>'; + + var radioFragment = document.createElement('div'); + radioFragment.innerHTML = radioHtml; + + return radioFragment.firstChild; + }, + + _addItem: function (obj) { + var label = document.createElement('label'), + input, + checked = this._map.hasLayer(obj.layer); + + if (obj.overlay) { + input = document.createElement('input'); + input.type = 'checkbox'; + input.className = 'leaflet-control-layers-selector'; + input.defaultChecked = checked; + } else { + input = this._createRadioElement('leaflet-base-layers', checked); + } + + input.layerId = L.stamp(obj.layer); + + L.DomEvent.on(input, 'click', this._onInputClick, this); + + var name = document.createElement('span'); + name.innerHTML = ' ' + obj.name; + + label.appendChild(input); + label.appendChild(name); + + var container = obj.overlay ? this._overlaysList : this._baseLayersList; + container.appendChild(label); + + return label; + }, + + _onInputClick: function () { + var i, input, obj, + inputs = this._form.getElementsByTagName('input'), + inputsLen = inputs.length; + + this._handlingClick = true; + + for (i = 0; i < inputsLen; i++) { + input = inputs[i]; + obj = this._layers[input.layerId]; + + if (input.checked && !this._map.hasLayer(obj.layer)) { + this._map.addLayer(obj.layer); + + } else if (!input.checked && this._map.hasLayer(obj.layer)) { + this._map.removeLayer(obj.layer); + } + } + + this._handlingClick = false; + }, + + _expand: function () { + L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); + }, + + _collapse: function () { + this._container.className = this._container.className.replace(' leaflet-control-layers-expanded', ''); + } +}); + +L.control.layers = function (baseLayers, overlays, options) { + return new L.Control.Layers(baseLayers, overlays, options); +}; + + +/* + * L.PosAnimation is used by Leaflet internally for pan animations. + */ + +L.PosAnimation = L.Class.extend({ + includes: L.Mixin.Events, + + run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) + this.stop(); + + this._el = el; + this._inProgress = true; + this._newPos = newPos; + + this.fire('start'); + + el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) + + 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)'; + + L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); + L.DomUtil.setPosition(el, newPos); + + // toggle reflow, Chrome flickers for some reason if you don't do this + L.Util.falseFn(el.offsetWidth); + + // there's no native way to track value updates of transitioned properties, so we imitate this + this._stepTimer = setInterval(L.bind(this._onStep, this), 50); + }, + + stop: function () { + if (!this._inProgress) { return; } + + // if we just removed the transition property, the element would jump to its final position, + // so we need to make it stay at the current position + + L.DomUtil.setPosition(this._el, this._getPos()); + this._onTransitionEnd(); + L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation + }, + + _onStep: function () { + var stepPos = this._getPos(); + if (!stepPos) { + this._onTransitionEnd(); + return; + } + // jshint camelcase: false + // make L.DomUtil.getPosition return intermediate position value during animation + this._el._leaflet_pos = stepPos; + + this.fire('step'); + }, + + // you can't easily get intermediate values of properties animated with CSS3 Transitions, + // we need to parse computed style (in case of transform it returns matrix string) + + _transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/, + + _getPos: function () { + var left, top, matches, + el = this._el, + style = window.getComputedStyle(el); + + if (L.Browser.any3d) { + matches = style[L.DomUtil.TRANSFORM].match(this._transformRe); + if (!matches) { return; } + left = parseFloat(matches[1]); + top = parseFloat(matches[2]); + } else { + left = parseFloat(style.left); + top = parseFloat(style.top); + } + + return new L.Point(left, top, true); + }, + + _onTransitionEnd: function () { + L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); + + if (!this._inProgress) { return; } + this._inProgress = false; + + this._el.style[L.DomUtil.TRANSITION] = ''; + + // jshint camelcase: false + // make sure L.DomUtil.getPosition returns the final position value after animation + this._el._leaflet_pos = this._newPos; + + clearInterval(this._stepTimer); + + this.fire('step').fire('end'); + } + +}); + + +/* + * Extends L.Map to handle panning animations. + */ + +L.Map.include({ + + setView: function (center, zoom, options) { + + zoom = this._limitZoom(zoom); + center = L.latLng(center); + options = options || {}; + + if (this._panAnim) { + this._panAnim.stop(); + } + + if (this._loaded && !options.reset && options !== true) { + + if (options.animate !== undefined) { + options.zoom = L.extend({animate: options.animate}, options.zoom); + options.pan = L.extend({animate: options.animate}, options.pan); + } + + // try animating pan or zoom + var animated = (this._zoom !== zoom) ? + this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : + this._tryAnimatedPan(center, options.pan); + + if (animated) { + // prevent resize handler call, the view will refresh after animation anyway + clearTimeout(this._sizeTimer); + return this; + } + } + + // animation didn't start, just reset the map view + this._resetView(center, zoom); + + return this; + }, + + panBy: function (offset, options) { + offset = L.point(offset).round(); + options = options || {}; + + if (!offset.x && !offset.y) { + return this; + } + + if (!this._panAnim) { + this._panAnim = new L.PosAnimation(); + + this._panAnim.on({ + 'step': this._onPanTransitionStep, + 'end': this._onPanTransitionEnd + }, this); + } + + // don't fire movestart if animating inertia + if (!options.noMoveStart) { + this.fire('movestart'); + } + + // animate pan unless animate: false specified + if (options.animate !== false) { + L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); + + var newPos = this._getMapPanePos().subtract(offset); + this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); + } else { + this._rawPanBy(offset); + this.fire('move').fire('moveend'); + } + + return this; + }, + + _onPanTransitionStep: function () { + this.fire('move'); + }, + + _onPanTransitionEnd: function () { + L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim'); + this.fire('moveend'); + }, + + _tryAnimatedPan: function (center, options) { + // difference between the new and current centers in pixels + var offset = this._getCenterOffset(center)._floor(); + + // don't animate too far unless animate: true specified in options + if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } + + this.panBy(offset, options); + + return true; + } +}); + + +/* + * L.PosAnimation fallback implementation that powers Leaflet pan animations + * in browsers that don't support CSS3 Transitions. + */ + +L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({ + + run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) + this.stop(); + + this._el = el; + this._inProgress = true; + this._duration = duration || 0.25; + this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); + + this._startPos = L.DomUtil.getPosition(el); + this._offset = newPos.subtract(this._startPos); + this._startTime = +new Date(); + + this.fire('start'); + + this._animate(); + }, + + stop: function () { + if (!this._inProgress) { return; } + + this._step(); + this._complete(); + }, + + _animate: function () { + // animation loop + this._animId = L.Util.requestAnimFrame(this._animate, this); + this._step(); + }, + + _step: function () { + var elapsed = (+new Date()) - this._startTime, + duration = this._duration * 1000; + + if (elapsed < duration) { + this._runFrame(this._easeOut(elapsed / duration)); + } else { + this._runFrame(1); + this._complete(); + } + }, + + _runFrame: function (progress) { + var pos = this._startPos.add(this._offset.multiplyBy(progress)); + L.DomUtil.setPosition(this._el, pos); + + this.fire('step'); + }, + + _complete: function () { + L.Util.cancelAnimFrame(this._animId); + + this._inProgress = false; + this.fire('end'); + }, + + _easeOut: function (t) { + return 1 - Math.pow(1 - t, this._easeOutPower); + } +}); + + +/* + * Extends L.Map to handle zoom animations. + */ + +L.Map.mergeOptions({ + zoomAnimation: true, + zoomAnimationThreshold: 4 +}); + +if (L.DomUtil.TRANSITION) { + + L.Map.addInitHook(function () { + // don't animate on browsers without hardware-accelerated transitions or old Android/Opera + this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION && + L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera; + + // zoom transitions run with the same duration for all layers, so if one of transitionend events + // happens after starting zoom animation (propagating to the map pane), we know that it ended globally + if (this._zoomAnimated) { + L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this); + } + }); +} + +L.Map.include(!L.DomUtil.TRANSITION ? {} : { + + _catchTransitionEnd: function () { + if (this._animatingZoom) { + this._onZoomTransitionEnd(); + } + }, + + _nothingToAnimate: function () { + return !this._container.getElementsByClassName('leaflet-zoom-animated').length; + }, + + _tryAnimatedZoom: function (center, zoom, options) { + + if (this._animatingZoom) { return true; } + + options = options || {}; + + // don't animate if disabled, not supported or zoom difference is too large + if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || + Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } + + // offset is the pixel coords of the zoom origin relative to the current center + var scale = this.getZoomScale(zoom), + offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale), + origin = this._getCenterLayerPoint()._add(offset); + + // don't animate if the zoom origin isn't within one screen from the current center, unless forced + if (options.animate !== true && !this.getSize().contains(offset)) { return false; } + + this + .fire('movestart') + .fire('zoomstart'); + + this._animateZoom(center, zoom, origin, scale, null, true); + + return true; + }, + + _animateZoom: function (center, zoom, origin, scale, delta, backwards) { + + this._animatingZoom = true; + + // put transform transition on all layers with leaflet-zoom-animated class + L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); + + // remember what center/zoom to set after animation + this._animateToCenter = center; + this._animateToZoom = zoom; + + // disable any dragging during animation + if (L.Draggable) { + L.Draggable._disabled = true; + } + + this.fire('zoomanim', { + center: center, + zoom: zoom, + origin: origin, + scale: scale, + delta: delta, + backwards: backwards + }); + }, + + _onZoomTransitionEnd: function () { + + this._animatingZoom = false; + + L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); + + this._resetView(this._animateToCenter, this._animateToZoom, true, true); + + if (L.Draggable) { + L.Draggable._disabled = false; + } + } +}); + + +/* + Zoom animation logic for L.TileLayer. +*/ + +L.TileLayer.include({ + _animateZoom: function (e) { + if (!this._animating) { + this._animating = true; + this._prepareBgBuffer(); + } + + var bg = this._bgBuffer, + transform = L.DomUtil.TRANSFORM, + initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], + scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); + + bg.style[transform] = e.backwards ? + scaleStr + ' ' + initialTransform : + initialTransform + ' ' + scaleStr; + }, + + _endZoomAnim: function () { + var front = this._tileContainer, + bg = this._bgBuffer; + + front.style.visibility = ''; + front.parentNode.appendChild(front); // Bring to fore + + // force reflow + L.Util.falseFn(bg.offsetWidth); + + this._animating = false; + }, + + _clearBgBuffer: function () { + var map = this._map; + + if (map && !map._animatingZoom && !map.touchZoom._zooming) { + this._bgBuffer.innerHTML = ''; + this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; + } + }, + + _prepareBgBuffer: function () { + + var front = this._tileContainer, + bg = this._bgBuffer; + + // if foreground layer doesn't have many tiles but bg layer does, + // keep the existing bg layer and just zoom it some more + + var bgLoaded = this._getLoadedTilesPercentage(bg), + frontLoaded = this._getLoadedTilesPercentage(front); + + if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { + + front.style.visibility = 'hidden'; + this._stopLoadingImages(front); + return; + } + + // prepare the buffer to become the front tile pane + bg.style.visibility = 'hidden'; + bg.style[L.DomUtil.TRANSFORM] = ''; + + // switch out the current layer to be the new bg layer (and vice-versa) + this._tileContainer = bg; + bg = this._bgBuffer = front; + + this._stopLoadingImages(bg); + + //prevent bg buffer from clearing right after zoom + clearTimeout(this._clearBgBufferTimer); + }, + + _getLoadedTilesPercentage: function (container) { + var tiles = container.getElementsByTagName('img'), + i, len, count = 0; + + for (i = 0, len = tiles.length; i < len; i++) { + if (tiles[i].complete) { + count++; + } + } + return count / len; + }, + + // stops loading all tiles in the background layer + _stopLoadingImages: function (container) { + var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), + i, len, tile; + + for (i = 0, len = tiles.length; i < len; i++) { + tile = tiles[i]; + + if (!tile.complete) { + tile.onload = L.Util.falseFn; + tile.onerror = L.Util.falseFn; + tile.src = L.Util.emptyImageUrl; + + tile.parentNode.removeChild(tile); + } + } + } +}); + + +/* + * Provides L.Map with convenient shortcuts for using browser geolocation features. + */ + +L.Map.include({ + _defaultLocateOptions: { + watch: false, + setView: false, + maxZoom: Infinity, + timeout: 10000, + maximumAge: 0, + enableHighAccuracy: false + }, + + locate: function (/*Object*/ options) { + + options = this._locateOptions = L.extend(this._defaultLocateOptions, options); + + if (!navigator.geolocation) { + this._handleGeolocationError({ + code: 0, + message: 'Geolocation not supported.' + }); + return this; + } + + var onResponse = L.bind(this._handleGeolocationResponse, this), + onError = L.bind(this._handleGeolocationError, this); + + if (options.watch) { + this._locationWatchId = + navigator.geolocation.watchPosition(onResponse, onError, options); + } else { + navigator.geolocation.getCurrentPosition(onResponse, onError, options); + } + return this; + }, + + stopLocate: function () { + if (navigator.geolocation) { + navigator.geolocation.clearWatch(this._locationWatchId); + } + if (this._locateOptions) { + this._locateOptions.setView = false; + } + return this; + }, + + _handleGeolocationError: function (error) { + var c = error.code, + message = error.message || + (c === 1 ? 'permission denied' : + (c === 2 ? 'position unavailable' : 'timeout')); + + if (this._locateOptions.setView && !this._loaded) { + this.fitWorld(); + } + + this.fire('locationerror', { + code: c, + message: 'Geolocation error: ' + message + '.' + }); + }, + + _handleGeolocationResponse: function (pos) { + var lat = pos.coords.latitude, + lng = pos.coords.longitude, + latlng = new L.LatLng(lat, lng), + + latAccuracy = 180 * pos.coords.accuracy / 40075017, + lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat), + + bounds = L.latLngBounds( + [lat - latAccuracy, lng - lngAccuracy], + [lat + latAccuracy, lng + lngAccuracy]), + + options = this._locateOptions; + + if (options.setView) { + var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom); + this.setView(latlng, zoom); + } + + var data = { + latlng: latlng, + bounds: bounds + }; + + for (var i in pos.coords) { + if (typeof pos.coords[i] === 'number') { + data[i] = pos.coords[i]; + } + } + + this.fire('locationfound', data); + } +}); + + +}(window, document)); \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/leaflet/leaflet.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,467 @@ +/* required styles */ + +.leaflet-map-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-pane, +.leaflet-tile-container, +.leaflet-overlay-pane, +.leaflet-shadow-pane, +.leaflet-marker-pane, +.leaflet-popup-pane, +.leaflet-overlay-pane svg, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + -ms-touch-action: none; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container img { + max-width: none !important; + } +/* stupid Android 2 doesn't understand "max-width: none" properly */ +.leaflet-container img.leaflet-image-layer { + max-width: 15000px !important; + } +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-tile-pane { z-index: 2; } +.leaflet-objects-pane { z-index: 3; } +.leaflet-overlay-pane { z-index: 4; } +.leaflet-shadow-pane { z-index: 5; } +.leaflet-marker-pane { z-index: 6; } +.leaflet-popup-pane { z-index: 7; } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 7; + 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, +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-tile-loaded, +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } + +.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); + -o-transition: -o-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, +.leaflet-touching .leaflet-zoom-animated { + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-clickable { + cursor: pointer; + } +.leaflet-container { + cursor: -webkit-grab; + cursor: -moz-grab; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging, +.leaflet-dragging .leaflet-clickable, +.leaflet-dragging .leaflet-container { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + } + + +/* 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 #05f; + background: white; + opacity: 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 7px rgba(0,0,0,0.65); + -webkit-border-radius: 4px; + 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 { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-bottom-right-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 { + -webkit-border-radius: 10px; + border-radius: 10px; + } +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + -webkit-border-top-left-radius: 7px; + border-top-left-radius: 7px; + -webkit-border-top-right-radius: 7px; + border-top-right-radius: 7px; + } +.leaflet-touch .leaflet-bar a:last-child { + -webkit-border-bottom-left-radius: 7px; + border-bottom-left-radius: 7px; + -webkit-border-bottom-right-radius: 7px; + border-bottom-right-radius: 7px; + border-bottom: none; + } + + +/* zoom control */ + +.leaflet-control-zoom-in { + font: bold 18px 'Lucida Console', Monaco, monospace; + } +.leaflet-control-zoom-out { + font: bold 22px 'Lucida Console', Monaco, monospace; + } + +.leaflet-touch .leaflet-control-zoom-in { + font-size: 22px; + line-height: 30px; + } +.leaflet-touch .leaflet-control-zoom-out { + font-size: 28px; + line-height: 30px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 7px rgba(0,0,0,0.4); + background: #f8f8f9; + -webkit-border-radius: 5px; + 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-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; + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background-color: rgba(255, 255, 255, 0.7); + box-shadow: 0 0 5px #bbb; + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.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; + color: black; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + text-shadow: 1px 1px 1px #fff; + background-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 -1px 5px rgba(0, 0, 0, 0.2); + white-space: nowrap; + overflow: hidden; + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); + } +.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: 4px solid rgba(0,0,0,0.3); + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + -webkit-border-radius: 12px; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + margin: 0 auto; + width: 40px; + height: 20px; + position: relative; + overflow: hidden; + } +.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); + -o-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, .leaflet-popup-tip { + background: white; + + 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; + 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; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } +.leaflet-editing-icon { + -webkit-border-radius: 2px; + border-radius: 2px; + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/leaflet/leaflet.ie.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,51 @@ +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + +.leaflet-control { + display: inline; + } + +.leaflet-popup-tip { + width: 21px; + _width: 27px; + margin: 0 auto; + _margin-top: -3px; + + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + } +.leaflet-popup-tip-container { + margin-top: -1px; + } +.leaflet-popup-content-wrapper, .leaflet-popup-tip { + border: 1px solid #999; + } +.leaflet-popup-content-wrapper { + zoom: 1; + } + +.leaflet-control-zoom, +.leaflet-control-layers { + border: 3px solid #999; + } +.leaflet-control-layers-toggle { + } +.leaflet-control-attribution, +.leaflet-control-layers, +.leaflet-control-scale-line { + background: white; + } +.leaflet-zoom-box { + filter: alpha(opacity=50); + } +.leaflet-control-attribution { + border-top: 1px solid #bbb; + border-left: 1px solid #bbb; + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/leaflet/leaflet.js Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,9 @@ +/* + Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com + (c) 2010-2013, Vladimir Agafonkin + (c) 2010-2011, CloudMade +*/ +!function(t,e,i){var n=t.L,o={};o.version="0.6.4","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;i<o.length&&!n;i++)n=t[o[i]+e];return n}function i(e){var i=+new Date,o=Math.max(0,16-(i-n));return n=i+o,t.setTimeout(e,o)}var n=0,s=t.requestAnimationFrame||e("RequestAnimationFrame")||i,a=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};o.Util.requestAnimFrame=function(e,n,a,r){return e=o.bind(e,n),a&&s===i?(e(),void 0):s.call(t,e,r)},o.Util.cancelAnimFrame=function(e){e&&a.call(t,e)}}(),o.extend=o.Util.extend,o.bind=o.Util.bind,o.stamp=o.Util.stamp,o.setOptions=o.Util.setOptions,o.Class=function(){},o.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var n=new i;n.constructor=e,e.prototype=n;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(o.extend(e,t.statics),delete t.statics),t.includes&&(o.Util.extend.apply(null,[n].concat(t.includes)),delete t.includes),t.options&&n.options&&(t.options=o.extend({},n.options,t.options)),o.extend(n,t),n._initHooks=[];var a=this;return e.__super__=a.prototype,n.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=n._initHooks.length;e>t;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],i?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=i&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n=!!t.ActiveXObject,s=n&&!t.XMLHttpRequest,a=n&&!e.querySelector,r=n&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("phantom"),d=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",m=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,L="MozPerspective"in g.style,P="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||L||P)&&!c,w=!t.L_NO_TOUCH&&!c&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ie6:s,ie7:a,ielt9:r,webkit:l,android:d,android23:p,chrome:u,ie3d:v,webkit3d:y,gecko3d:L,opera3d:P,any3d:x,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&y,mobileOpera:_&&t.opera,touch:w,msTouch:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(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},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},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(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 o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement,l=o.Browser.ie7;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var u=o.DomUtil.getStyle(a,"width"),c=o.DomUtil.getStyle(a,"max-width"),d=a.getBoundingClientRect();("none"!==u||"none"!==c)&&(s+=d.left+a.clientLeft),n+=d.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==o.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){return t.className.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){o.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){t.className=o.Util.trim((" "+t.className+" ").replace(" "+e+" "," "))},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;n<t.length;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=o.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",n=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+n},getScaleString:function(t,e){var i=o.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),n=" scale("+t+") ";return i+n},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&o.Browser.any3d?(t.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(e),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},o.DomUtil.TRANSFORM=o.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),o.DomUtil.TRANSITION=o.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),o.DomUtil.TRANSITION_END="webkitTransition"===o.DomUtil.TRANSITION||"OTransition"===o.DomUtil.TRANSITION?o.DomUtil.TRANSITION+"End":"transitionend",function(){var i=o.DomUtil.testProp(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);o.extend(o.DomUtil,{disableTextSelection:function(){if(o.DomEvent.on(t,"selectstart",o.DomEvent.preventDefault),i){var n=e.documentElement.style;this._userSelect=n[i],n[i]="none"}},enableTextSelection:function(){o.DomEvent.off(t,"selectstart",o.DomEvent.preventDefault),i&&(e.documentElement.style[i]=this._userSelect,delete this._userSelect)},disableImageDrag:function(){o.DomEvent.on(t,"dragstart",o.DomEvent.preventDefault)},enableImageDrag:function(){o.DomEvent.off(t,"dragstart",o.DomEvent.preventDefault)}})}(),o.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},o.extend(o.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),o.LatLng.prototype={equals:function(t){if(!t)return!1;t=o.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return e<=o.LatLng.MAX_MARGIN},toString:function(t){return"LatLng("+o.Util.formatNum(this.lat,t)+", "+o.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=o.latLng(t);var e=6378137,i=o.LatLng.DEG_TO_RAD,n=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(n/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?new o.LatLng(t[0],t[1]):t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){return t?(t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this):this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this.setView(this.getCenter(),t,{zoom:e})},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t,e){if(t=o.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this.off("moveend",this._panInsideMaxBounds,this),this;var i=this.getBoundsZoom(t,!0);return this._boundsMinZoom=i,this._loaded&&(this._zoom<i?this.setView(t.getCenter(),i,e):this.panInsideBounds(t)),this.on("moveend",this._panInsideMaxBounds,this),this},panInsideBounds:function(t){t=o.latLngBounds(t);var e=this.getPixelBounds(),i=e.getBottomLeft(),n=e.getTopRight(),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return n.y<a.y&&(h=Math.ceil(a.y-n.y)),n.x>a.x&&(r=Math.floor(a.x-n.x)),i.y>s.y&&(h=Math.floor(s.y-i.y)),i.x<s.x&&(r=Math.ceil(s.x-i.x)),r||h?this.panBy([r,h]):this},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);if(this._layers[e])return this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();if(this._sizeChanged=!0,this.options.maxBounds&&this.setMaxBounds(this.options.maxBounds),!this._loaded)return this;var i=this.getSize(),n=e.subtract(i).divideBy(2).round();return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(e){var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this}},remove:function(){return this._loaded&&this.fire("unload"),this._initEvents("off"),delete this._container._leaflet,this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._moved()?this.layerPointToLatLng(this._getCenterLayerPoint()):this._initialCenter},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){var t=this._layersMinZoom===i?0:this._layersMinZoom,e=this._boundsMinZoom===i?0:this._boundsMinZoom;return this.options.minZoom===i?Math.max(t,e):this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x<r.x||n.y<r.y:r.contains(n);while(u&&a>=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(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 e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&this.dragging&&this.dragging.moved()||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new o.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update() +},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container leaflet-zoom-animated";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||e<this.options.minZoom)){var n=o.bounds(t.min.divideBy(i)._floor(),t.max.divideBy(i)._floor());this._addTilesFromCenterOut(n),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(n)}}},_addTilesFromCenterOut:function(t){var i,n,s,a=[],r=t.getCenter();for(i=t.min.y;i<=t.max.y;i++)for(n=t.min.x;n<=t.max.x;n++)s=new o.Point(n,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,n=0;h>n;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i)||t.y<0||t.y>=i)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(i<t.min.x||i>t.max.x||n<t.min.y||n>t.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs;var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,n=this.options.tileSize,s=t.multiplyBy(n),a=s.add([n,n]),r=this._crs.project(i.unproject(s,e)),h=this._crs.project(i.unproject(a,e)),l=[r.x,h.y,h.x,r.y].join(","),u=o.Util.template(this._url,{s:this._getSubdomain(t)});return u+o.Util.getParamString(this.wmsParams,u,!0)+"&BBOX="+l},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return o.Browser.ie6?(i||(i=e.createElement("div")),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i||(i=e.createElement("img")),i.src=t),i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)o.DomEvent.on(t,e[i],this._fireMouseEvent,this);o.Handler.MarkerDrag&&(this.dragging=new o.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&o.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t,latlng:this._latlng})},_onKeyPress:function(t){13===t.keyCode&&this.fire("click",{originalEvent:t,latlng:this._latlng})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t,latlng:this._latlng}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&o.DomEvent.preventDefault(t),"mousedown"!==t.type?o.DomEvent.stopPropagation(t):o.DomEvent.preventDefault(t)},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){o.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&o.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),o.marker=function(t,e){return new o.Marker(t,e)},o.DivIcon=o.Icon.extend({options:{iconSize:[12,12],className:"leaflet-div-icon",html:!1},createIcon:function(t){var i=t&&"DIV"===t.tagName?t:e.createElement("div"),n=this.options;return i.innerHTML=n.html!==!1?n.html:"",n.bgPos&&(i.style.backgroundPosition=-n.bgPos.x+"px "+-n.bgPos.y+"px"),this._setIconStyles(i,"icon"),i},createShadow:function(){return null}}),o.divIcon=function(t){return new o.DivIcon(t)},o.Map.mergeOptions({closePopupOnClick:!0}),o.Popup=o.Class.extend({includes:o.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:[0,7],autoPanPadding:[5,5],keepInView:!1,className:"",zoomAnimation:!0},initialize:function(t,e){o.setOptions(this,t),this._source=e,this._animated=o.Browser.any3d&&this.options.zoomAnimation,this._isOpen=!1},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&o.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on(this._getEvents(),this),this._update(),e&&o.DomUtil.setOpacity(this._container,1),this.fire("open"),t.fire("popupopen",{popup:this}),this._source&&this._source.fire("popupopen",{popup:this})},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),o.Util.falseFn(this._container.offsetWidth),t.off(this._getEvents(),this),t.options.fadeAnimation&&o.DomUtil.setOpacity(this._container,0),this._map=null,this.fire("close"),t.fire("popupclose",{popup:this}),this._source&&this._source.fire("popupclose",{popup:this})},setLatLng:function(t){return this._latlng=o.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_getEvents:function(){var t={viewreset:this._updatePosition};return this._animated&&(t.zoomanim=this._zoomAnimation),("closeOnClick"in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),n=this._container=o.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=o.DomUtil.create("a",e+"-close-button",n),t.href="#close",t.innerHTML="×",o.DomEvent.disableClickPropagation(t),o.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=o.DomUtil.create("div",e+"-content-wrapper",n);o.DomEvent.disableClickPropagation(s),this._contentNode=o.DomUtil.create("div",e+"-content",s),o.DomEvent.on(this._contentNode,"mousewheel",o.DomEvent.stopPropagation),o.DomEvent.on(this._contentNode,"MozMousePixelScroll",o.DomEvent.stopPropagation),o.DomEvent.on(s,"contextmenu",o.DomEvent.stopPropagation),this._tipContainer=o.DomUtil.create("div",e+"-tip-container",n),this._tip=o.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var n=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&n>s?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=t.getSize(),h=0,l=0;s.x+i>r.x&&(h=s.x+i-r.x+a.x),s.x-h<0&&(h=s.x-a.x),s.y+e>r.y&&(l=s.y+e-r.y+a.y),s.y-l<0&&(l=s.y-a.y),(h||l)&&t.fire("autopanstart").panBy([h,l])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popup||this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:(t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e<t.length;e++)o.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),n=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(n);this.fire(t.type,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&o.DomEvent.preventDefault(t),"mousemove"!==t.type&&o.DomEvent.stopPropagation(t)}}}),o.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=o.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&o.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,n=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;o.Browser.mobileWebkit&&r.removeChild(a),o.DomUtil.setPosition(a,e),a.setAttribute("width",n),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,n,s].join(" ")),o.Browser.mobileWebkit&&r.appendChild(a)}}}),o.Path.include({bindPopup:function(t,e){return t instanceof o.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new o.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),o.Browser.vml=!o.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape"); +o.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.x<e.min.x?i|=1:t.x>e.max.x&&(i|=2),t.y<e.min.y?i|=4:t.y>e.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){var i,n,s;if(o.Polyline.prototype.initialize.call(this,t,e),t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),i=0,n=this._holes.length;n>i;i++)s=this._holes[i]=this._convertLatLngs(this._holes[i]),s[0].equals(s[s.length-1])&&s.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+e<t.min.x||i.y+e<t.min.y}}),o.circle=function(t,e,i){return new o.Circle(t,e,i)},o.CircleMarker=o.Circle.extend({options:{radius:10,weight:2},initialize:function(t,e){o.Circle.prototype.initialize.call(this,t,null,e),this._radius=this.options.radius},projectLatlngs:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_updateStyle:function(){o.Circle.prototype._updateStyle.call(this),this.setRadius(this.options.radius)},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()}}),o.circleMarker=function(t,e){return new o.CircleMarker(t,e)},o.Polyline.include(o.Path.CANVAS?{_containsPoint:function(t,e){var i,n,s,a,r,h,l,u=this.options.weight/2;for(o.Browser.touch&&(u+=10),i=0,a=this._parts.length;a>i;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i){var n,s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return n=i(u),e?e(t,n):new o.Marker(n);case"MultiPoint":for(a=0,r=u.length;r>a;a++)n=i(u[a]),h=e?e(t,n):new o.Marker(n),c.push(h);return new o.FeatureGroup(c);case"LineString":return s=this.coordsToLatLngs(u,0,i),new o.Polyline(s);case"Polygon":return s=this.coordsToLatLngs(u,1,i),new o.Polygon(s);case"MultiLineString":return s=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(s);case"MultiPolygon":return s=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(s);case"GeometryCollection":for(a=0,r=l.geometries.length;r>a;a++)h=this.geometryToLayer({geometry:l.geometries[a],type:"Feature",properties:t.properties},e,i),c.push(h);return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){return[t.lng,t.lat]},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t,e){t.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){t.push(e.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:e,coordinates:t})}})}t(o.MultiPolyline,"MultiLineString"),t(o.MultiPolygon,"MultiPolygon")}(),o.LayerGroup.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){e.toGeoJSON&&t.push(o.GeoJSON.asFeature(e.toGeoJSON()))}),{type:"FeatureCollection",features:t}}}),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.addListener(t,o.Draggable.START[i],e);return o.DomEvent.addListener(t,"click",o.DomEvent._fakeStop).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=o.Browser.ie7,s=e.body,a=e.documentElement,r=t.pageX?t.pageX-s.scrollLeft-a.scrollLeft:t.clientX,h=t.pageY?t.pageY-s.scrollTop-a.scrollTop:t.clientY,l=new o.Point(r,h),u=i.getBoundingClientRect(),c=u.left-i.clientLeft,d=u.top-i.clientTop;return o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!n||(c+=i.scrollWidth-i.clientWidth,n&&"hidden"!==o.DomUtil.getStyle(i,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(i,"overflow")&&(c+=17)),l._subtract(new o.Point(c,d))},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!t.shiftKey&&(1===t.which||1===t.button||t.touches)&&(o.DomEvent.stopPropagation(t),!o.Draggable._disabled)){o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection();var i=t.touches?t.touches[0]:t,n=i.target;o.Browser.touch&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.Browser.touch||o.DomUtil.addClass(e.body,"leaflet-dragging")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.Browser.touch||o.DomUtil.removeClass(e.body,"leaflet-dragging");for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),this._onViewReset())}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)<Math.abs(s+i)?o:s;this._draggable._newPos.x=a},_onDragEnd:function(){var t=this._map,e=t.options,i=+new Date-this._lastTime,n=!e.inertia||i>e.inertiaThreshold||!this._positions[0];if(t.fire("dragend"),n)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),d=u/(e.inertiaDeceleration*r),p=c.multiplyBy(-d/2).round();p.x&&p.y?o.Util.requestAnimFrame(function(){t.panBy(p,{duration:d,easeLinearity:r,noMoveStart:!0})}):t.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setZoomAround(t.containerPoint,this._zoom+1)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&t.setZoomAround(this._lastMousePos,i+e)}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:o.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.msTouch?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.msTouch){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.msTouch){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.msTouch?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;i<a.length;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;e<s.length;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),o.Map.mergeOptions({touchZoom:o.Browser.touch&&!o.Browser.android23}),o.Map.TouchZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){o.DomEvent.off(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 n=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=n.add(s)._divideBy(2),this._startDist=n.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),o.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),o.DomEvent.preventDefault(t)}},_onTouchMove:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&this._zooming){var i=e.mouseEventToLayerPoint(t.touches[0]),n=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(n)/this._startDist,this._delta=i._add(n)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return this._zooming=!1,void 0;var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this) +},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.msTouch&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),this._map.fire("boxzoomstart"),void 0)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._pane.removeChild(this._box),this._container.style.cursor="",o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable()},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},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):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.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,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):(o.DomEvent.disableClickPropagation(e),o.DomEvent.on(e,"mousewheel",o.DomEvent.stopPropagation));var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"';i&&(n+=' checked="checked"'),n+="/>";var o=e.createElement("div");return o.innerHTML=n,o.firstChild},_addItem:function(t){var i,n=e.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?(i=e.createElement("input"),i.type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers",s),i.layerId=o.stamp(t.layer),o.DomEvent.on(i,"click",this._onInputClick,this);var a=e.createElement("span");a.innerHTML=" "+t.name,n.appendChild(i),n.appendChild(a);var r=t.overlay?this._overlaysList:this._baseLayersList;return r.appendChild(n),n},_onInputClick:function(){var t,e,i,n=this._form.getElementsByTagName("input"),o=n.length;for(this._handlingClick=!0,t=0;o>t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=this._limitZoom(e),t=o.latLng(t),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/map.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,70 @@ +#!/usr/bin/env ruby +#coding:utf-8 + +require 'cgi' +c = CGI.new(:accept_charset => "UTF-8") + +#lon = c["lon"].to_f +#lat = c["lat"].to_f + +if ARGV[1] != nil + lon = ARGV[1].to_f + lat = ARGV[0].to_f +else + lat = 38.91525 + lon = 139.83450 +end + +print("Content-type: text/html; charset=UTF-8\n\n") + +printf(<<_EOS_,lat,lon) +<html> +<head> + <title>Simple OSM GPX Track</title> + <script src="http://www.openlayers.org/api/OpenLayers.js"></script> + <script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script> + + <script type="text/javascript"> + lat = %f + lon = %f + var zoom=15 + + var map; + + function init() { + map = new OpenLayers.Map ("map", { + controls:[ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.PanZoomBar(), + new OpenLayers.Control.Attribution() + ], + maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), + maxResolution: 156543.0399, + numZoomLevels: 6, + units: \'m\', + projection: new OpenLayers.Projection("EPSG:900913"), + displayProjection: new OpenLayers.Projection("EPSG:4326") + } ); + + layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); + map.addLayer(layerMapnik); + layerMarkers = new OpenLayers.Layer.Markers("Markers"); + map.addLayer(layerMarkers); + + var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); + map.setCenter(lonLat, zoom); + var size = new OpenLayers.Size(21, 25); + var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); + var icon = new OpenLayers.Icon(\'http://www.openstreetmap.org/openlayers/img/marker.png\',size,offset); + layerMarkers.addMarker(new OpenLayers.Marker(lonLat,icon)); + } + </script> +<meta http-equiv="refresh" content="20;redirect.html"> +</head> + +<body onload="init();"> +_EOS_ +print"<div style=\"width:90\%\; height:90\%\" id=\"map\"></div> +</body> +</html> +"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/redirect.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html> +<head> +<title>たいとる</title> +</head> +<script language="javascript"> + +time = 1; + +url = "http://skip.koeki-prj.org/staff/fujix/leaf.rb"; +curl = "http://skip.koeki-prj.org/staff/fujix/leaf.rb"; + +if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition( + + function (hoge) { + var lon = hoge.coords.latitude; + var lat = hoge.coords.longitude; + url += "?" + lon + "+" + lat; + + }, + + function (error) { + + var message = ""; + + switch (error.code) { + + case error.POSITION_UNAVAILABLE: + message = "位置情報の取得ができませんでした。"; + break; + + case error.PERMISSION_DENIED: + message = "位置情報取得の使用許可がされませんでした。"; + break; + + case error.PERMISSION_DENIED_TIMEOUT: + message = "位置情報取得中にタイムアウトしました。"; + break; + + } + window.alert(message); + } + ); +} + +function jumpPage() { + if (url == curl){ + url += "?error"; + } + location.href = url; +} + +setTimeout("jumpPage()",time*1000) +</script> +<body> +<p>位置情報を取得し直して再表示します</p> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/fujix/sql/dummy.txt Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,1 @@ +hoge
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/.htaccess Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,3 @@ +AddHandler cgi-script .rb +Options +ExecCGI +AddType "text/html; charset=euc-jp" .html .rb \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/.htaccess~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,3 @@ +AddHandler cgi-script .rb +Options +ExecCGI +AddType "text/html; charset=utf-8" .html .rb \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/add.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,25 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> +<title>桼Ͽ</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1>Ͽ</h1> +<div class="center01"> +<div> +<h2>ϤϿܥƤ</h2> +<form method="POST" action="add.rb"> +<p> +<span>ID:</span><input type="text" name="id"><br> +<span>PASS:</span><input type="password" name="pass"><br> +<span>̾:</span><input type="text" name="name"><br> +<span>:</span><input type="radio" name="sex" value="man"><br> +<span></span><input type="radio" name="sex" value="woman"></p> +<button class="css3button" type="submit" name="Battle" value="1">Ͽ</button> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/add.html~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,25 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>ユーザー登録</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1>新規登録</h1> +<div class="center01"> +<div> +<h2>入力したら登録ボタンを押してください</h2> +<form method="POST" action="add.rb"> +<p> +<span>ID:</span><input type="text" name="id"><br> +<span>PASS:</span><input type="password" name="pass"><br> +<span>名前:</span><input type="text" name="name"><br> +<span>性別:</span><input type="radio" name="sex" value="man">男<br> +<span></span><input type="radio" name="sex" value="woman">女</p> +<button class="css3button" type="submit" name="Battle" value="1">登録</button> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/add.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,48 @@ +#!/usr/bin/env ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "euc-jp") +print"Content-type: text/html; charset=euc-jp\n\n" + +number = c["id"] +pswd = c["pass"] +namae = c["name"] +sx = c["sex"] +check = 0 + +begin + conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') + a = "select id from userdata" + ip = conn.exec(a) + ip.each do |row| + if number == row["id"] + check = 1 + end + end + if check == 0 + q = "insert into userdata (id, password, name, sex, level, exp, quest) values ('#{number}', '#{pswd}', '#{namae}', '#{sx}', '1', '0', '0')" + export = conn.exec(q) + end +end +print"<html> +<head> +<meta http-equiv=\"Content-Type\" content=\"text/html; charset=euc-jp\"> +<title>桼Ͽ</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body>\n" +if check == 0 + print"<h1>Ͽλ</h1> +<a href=\"login.html\"> +<button class=\"css3button\"></button>\n" +elsif check == 1 + print"<h1>Error</h1> +<p>IDȤƤޤ</p> +<a href=\"add.html\"> +<button class=\"css3button\">⤦</button>\n" +end +print"</a> +</body> +</html>\n"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/add.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,48 @@ +#!/usr/bin/env ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"Content-type: text/html; charset=utf-8\n\n" + +number = c["id"] +pswd = c["pass"] +namae = c["name"] +sx = c["sex"] +check = 0 + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + a = "select id from userdata" + ip = conn.exec(a) + ip.each do |row| + if number == row["id"] + check = 1 + end + end + if check == 0 + q = "insert into userdata (id, password, name, sex, level, exp, quest) values ('#{number}', '#{pswd}', '#{namae}', '#{sx}', '1', '0', '0')" + export = conn.exec(q) + end +end +print"<html> +<head> +<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> +<title>桼Ͽ</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body>\n" +if check == 0 + print"<h1>Ͽλ</h1> +<a href=\"login.html\"> +<button class=\"css3button\"></button>\n" +elsif check == 1 + print"<h1>Error</h1> +<p>IDȤƤޤ</p> +<a href=\"add.html\"> +<button class=\"css3button\">⤦</button>\n" +end +print"</a> +</body> +</html>\n"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/ans.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,77 @@ +#!/usr/bin/ruby +# coding: utf-8 + +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print "Content-type: text/html; charset=utf-8\n\n" + +check = c["answer"] +quiznum = c["dat"] + +srand +number=rand(1060) +num = 0 +damage = "" +quiz = "" +ansone = "" +anstwo = "" +ansthi = "" +ansfou = "" +anstrue = "" +open("data.txt", "r:utf-8") do |list| + while line = list.gets + if /(\d+),(\S+),(\S+),(\S+),(\S+),(\S+),(\d)/ =~ line + if quiznum.to_i == $1.to_i + if check.to_i == $7.to_i + damage = "攻撃成功!" + else + damage = "攻撃失敗!" + end + end + if number.to_i == $1.to_i + num = $1.to_i + quiz = $2.to_s + ansone = $3.to_s + anstwo = $4.to_s + ansthi = $5.to_s + ansfou = $6.to_s + anstrue = $7.to_i + end + end + end +end + + + +printf("<html> +<head> +<title>きみのこうげきだよ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>きみのこうげきだよ</h1> +<h2>#{damage}</h2> +<p>No.#{number}</p> +<div class=\"main\"> +<div> +<img border=\"1\" src=\"maou.png\" width=\"480\" height=\"320\" +alt=\"まおうのがぞうっぽいよ\" title=\"まおう\"> + +<h2>問題</h2> +<p>%s</p> + +<form method=\"POST\" action=\"ans.rb\"> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"1\">%s</bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"2\">%s</bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"3\">%s<br></bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"4\">%s<br></bu\ +tton> +<input type=\"hidden\" name=\"dat\" value=\"%d\"> +</form> +</div> +</div> +</body> +</html>", quiz, ansone, anstwo, ansthi, ansfou, num)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/battle.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,21 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> +<title>ƥȥ</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1>ƥȥ</h1> +<div class="center01"> +<div> +<img border="1" src="forest.jpg" width="480" height="320" +alt="ط" title="ط"> +<h2>õ褦</h2> +<form method="POST" action="battle.rb"> +<button class="css3button" type="submit" name="Battle" value="1">Start</button> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/battle.html~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,21 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>テストクエスト</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1>テストクエスト</h1> +<div class="center01"> +<div> +<img border="1" src="forest.jpg" width="480" height="320" +alt="背景" title="背景"> +<h2>探索しよう!</h2> +<form method="POST" action="battle.rb"> +<button class="css3button" type="submit" name="Battle" value="1">Start</button> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/battle.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,100 @@ +#!/usr/bin/env ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "euc-jp") +print"ontent-type: text/html; charset=euc-jp\n\n" + +tai = c["hp"] +dhp = c["defohp"] +tekihp = c["thp"] +ct = c["count"] +nn = c["namae"] +lvl = c["level"] +idnum = c["id"] +ep = c["exp"] +cou = ct +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 + +begin + conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +srand +number = rand(x) +check = rand(4) + +printf("<html> +<head> +<title>ߤΤ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>ߤΤ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>ƤHP #{tekihp} / #{tekihp} +<img border=\"1\" src=\"battle.jpg\" width=\"480\" height=\"320\" +alt=\"ط\" title=\"ط\"> +<h1>:#{tai} / #{dhp} +<h2></h2> +<p>%s</p> + +<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) + +if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" +elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" +elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" +elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" +end +printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> +<input type=\"hidden\" name=\"defothp\" value=\"#{tekihp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> +</form> +</div> +</div> +</body> +</html>\n", wordone[number])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/battle.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,100 @@ +#!/usr/bin/ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"ontent-type: text/html; charset=utf-8\n\n" + +tai = c["hp"] +dhp = c["defohp"] +tekihp = c["thp"] +ct = c["count"] +nn = c["namae"] +lvl = c["level"] +idnum = c["id"] +ep = c["exp"] +cou = ct +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +srand +number = rand(x) +check = rand(4) + +printf("<html> +<head> +<title>ߤΤ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>ߤΤ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>ƤHP #{tekihp} / #{tekihp} +<img border=\"1\" src=\"battle.jpg\" width=\"480\" height=\"320\" +alt=\"ط\" title=\"ط\"> +<h1>:#{tai} / #{dhp} +<h2></h2> +<p>%s</p> + +<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) + +if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" +elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" +elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" +elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" +end +printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> +<input type=\"hidden\" name=\"defothp\" value=\"#{tekihp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> +</form> +</div> +</div> +</body> +</html>\n", wordone[number])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/battle2.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,206 @@ +#!/usr/bin/env ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "euc-jp") +print"ontent-type: text/html; charset=euc-jp\n\n" + +kaito = c["answer"] +ans = c["dat"] +ber = c["num"] +tai = c["hp"] +tekihp = c["thp"] +dthp = c["defothp"] +dhp = c["defohp"] +nn = c["namae"] +lvl = c["level"] +ep = c["exp"] +idnum = c["id"] +sum = tai.to_i +tsum = tekihp.to_i +nb = ber.to_i +cu = c["count"] +cou = cu.to_i +ct = cou + 1 +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 +y = 0 + +begin + conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +if ans.to_s == kaito.to_s + srand + attack = rand(90) + 10 + tsum -= attack +else + srand + tekiat = rand(20) + 5 + sum -= tekiat +end + +if tsum >= 0 && sum >= 0 + + srand + number = rand(x) + srand + check = rand(4) + + print"<html> +<head> +<title>ߤΤ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>ߤΤ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>ƤHP #{tsum} / #{dthp}</h1> + +<img border=\"1\" src=\"" + + if ans.to_s == kaito.to_s + print"atack.gif" + else + print"damage.gif" + end +print"\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\">\n" + + + if ans.to_s == kaito.to_s + print"<h1>!</h1>\n" + else + print"<h1>⼺</h1>\n" + end + printf("<h1>:#{sum} / #{dhp} +<h2></h2> +<p>%s</p> +<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) + + if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" + elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" + elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" + elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" + end + printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> +<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> +<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +</form> +</div> +</body> +</html>\n", wordone[number]) + +elsif tsum <= 0 && sum > 0 + if ct == 4 + print"<html> +<head> +<title>ɥ饴!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>ɥ饴!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> +<h1>!</h1> +<h1>:#{sum} / #{dhp}</h1> +<h2>õλ</h2>" +#<form method=\"POST\" action=\"boss.rb\"> +#<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> +#<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"><input type=\"hidden\" name=\"thp\" value=\"500\"> +#<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> +#</form> +print"</div> +</body> +</html>\n" + + else + print"<html> +<head> +<title>ɥ饴!</title> <link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> </head> <body> <h1>ɥ饴!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> +<h1>!</h1> +<h1>:#{sum} / #{dhp}</h1> +<h2>õ³褦!</h2> +<form method=\"POST\" action=\"battle.rb\"> +<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> +<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{dthp}\"> +<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> +<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +</form> +</div> +</body> +</html>\n" + end +else + print"<html><head><title>餱Ƥޤä</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>餱Ƥޤä</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> +<h1>:0 / #{dhp}</h1> +<h2>⤦õ!</h2> +<form method=\"POST\" action=\"login.rb\"> +<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +</form> + +</a> +</div> +</body> +</html>\n" +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/battle2.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,206 @@ +#!/usr/bin/ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"ontent-type: text/html; charset=utf-8\n\n" + +kaito = c["answer"] +ans = c["dat"] +ber = c["num"] +tai = c["hp"] +tekihp = c["thp"] +dthp = c["defothp"] +dhp = c["defohp"] +nn = c["namae"] +lvl = c["level"] +ep = c["exp"] +idnum = c["id"] +sum = tai.to_i +tsum = tekihp.to_i +nb = ber.to_i +cu = c["count"] +cou = cu.to_i +ct = cou + 1 +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 +y = 0 + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +if ans.to_s == kaito.to_s + srand + attack = rand(90) + 10 + tsum -= attack +else + srand + tekiat = rand(20) + 5 + sum -= tekiat +end + +if tsum >= 0 && sum >= 0 + + srand + number = rand(x) + srand + check = rand(4) + + print"<html> +<head> +<title>ߤΤ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>ߤΤ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>ƤHP #{tsum} / #{dthp}</h1> + +<img border=\"1\" src=\"" + + if ans.to_s == kaito.to_s + print"atack.gif" + else + print"damage.gif" + end +print"\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\">\n" + + + if ans.to_s == kaito.to_s + print"<h1>!</h1>\n" + else + print"<h1>⼺</h1>\n" + end + printf("<h1>:#{sum} / #{dhp} +<h2></h2> +<p>%s</p> +<form method=\"POST\" action=\"battle2.rb\">\n", quest[number]) + + if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" + elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" + elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" + elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" + end + printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> +<input type=\"hidden\" name=\"count\" value=\"#{cou}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> +<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +</form> +</div> +</body> +</html>\n", wordone[number]) + +elsif tsum <= 0 && sum > 0 + if ct == 3 + print"<html> +<head> +<title>ɥ饴!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>ɥ饴!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> +<h1>!</h1> +<h1>:#{sum} / #{dhp}</h1> +<h2>õλ</h2>" +#<form method=\"POST\" action=\"boss.rb\"> +#<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> +#<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"><input type=\"hidden\" name=\"thp\" value=\"500\"> +#<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> +#</form> +print"</div> +</body> +</html>\n" + + else + print"<html> +<head> +<title>ɥ饴!</title> <link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> </head> <body> <h1>ɥ饴!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> +<h1>!</h1> +<h1>:#{sum} / #{dhp}</h1> +<h2>õ³褦!</h2> +<form method=\"POST\" action=\"battle.rb\"> +<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> +<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{dthp}\"> +<input type=\"hidden\" name=\"count\" value=\"#{ct}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{dhp}\"> +<input type=\"hidden\" name=\"defothp\" value=\"#{dthp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{nn}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +</form> +</div> +</body> +</html>\n" + end +else + print"<html><head><title>餱Ƥޤä</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>餱Ƥޤä</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"ط\" title=\"ط\"> +<h1>:#{sum} / #{dhp}</h1> +<h2>⤦õ!</h2> +<form method=\"POST\" action=\"login.rb\"> +<button class=\"css3button\" type=\"submit\" name=\"Battle\" value=\"1\">Start</button> +<input type=\"hidden\" name=\"id\" value=\"#{idnum}\"> +</form> + +</a> +</div> +</body> +</html>\n" +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/boss.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,91 @@ +#!/usr/bin/ruby +# coding: utf-8 +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"ontent-type: text/html; charset=utf-8\n\n" + +tai = c["hp"] +dh = c["defohp"] +tekihp = c["thp"] +nn = c["namae"] +lvl = c["level"] +number = c["id"] +ep = c["exp"] +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +srand +number = rand(x) +check = rand(4) + +printf("<html> +<head> +<title>きみのこうげきだよ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>きみのこうげきだよ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>BOSS HP #{tekihp} / 500 +<img border=\"1\" src=\"boss.jpg\" width=\"480\" height=\"320\" +alt=\"背景\" title=\"背景\"> +<h1>体力: #{tai} / 999 +<h2>問題</h2> +<p>%s</p> + +<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) + +if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" +elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" +elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" +elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" +end +printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> +</form> +</div> +</div> +</body> +</html>\n", wordone[number])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/boss.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,90 @@ +#!/usr/bin/ruby +# coding: utf-8 +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"ontent-type: text/html; charset=utf-8\n\n" + +tai = c["hp"] +tekihp = c["thp"] +nn = c["namae"] +lvl = c["level"] +number = c["id"] +ep = c["exp"] +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +srand +number = rand(x) +check = rand(4) + +printf("<html> +<head> +<title>きみのこうげきだよ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>きみのこうげきだよ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>BOSS HP #{tekihp} / 500 +<img border=\"1\" src=\"boss.jpg\" width=\"480\" height=\"320\" +alt=\"背景\" title=\"背景\"> +<h1>体力: #{tai} / 999 +<h2>問題</h2> +<p>%s</p> + +<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) + +if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" +elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" +elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" +elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button>\n" +end +printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{tai}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tekihp}\"> +</form> +</div> +</div> +</body> +</html>\n", wordone[number])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/boss2.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,154 @@ +#!/usr/bin/ruby +# coding: utf-8 +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"ontent-type: text/html; charset=utf-8\n\n" + +kaito = c["answer"] +ans = c["dat"] +ber = c["num"] +tai = c["hp"] +tekihp = c["thp"] +sum = tai.to_i +tsum = tekihp.to_i +nb = ber.to_i +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 +y = 0 + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +if ans.to_s == kaito.to_s + srand + attack = rand(90) + 100 + tsum -= attack +else + srand + tekiat = rand(60) + 60 + sum -= tekiat +end + +if tsum >= 0 && sum >= 0 + + srand + number = rand(x) + srand + check = rand(4) + + print"<html> +<head> +<title>きみのこうげきだよ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>きみのこうげきだよ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>BOSS HP #{tsum} / 500</h1> +<img border=\"1\" src=\"boss.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\">\n" + + if ans.to_s == kaito.to_s + print"<h1>攻撃成功!</h1>\n" + else + print"<h1>攻撃失敗</h1>\n" + end + + printf("<h1>体力: #{sum} / 999 +<h2>問題</h2> +<p>%s</p> +<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) + + if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" + elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" + elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" + elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" + end + printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> +</form> +</div> +</div> +</body> +</html>\n", wordone[number]) + +elsif tsum <= 0 && sum > 0 + print"<html> +<head> +<title>BOSSをたおした!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>BOSSをたおした!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\"> +<h1>攻撃成功!</h1> +<h1>体力: #{sum} / 999</h1> +<h2>探索完了!</h2> +<a href=\"quest.html\"> +<button class=\"css3button\">Start</button> +</a> +</div> +</body> +</html>\n" +else + print"<html> +<head> +<title>BOSSをたおした!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>BOSSをたおした!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"\\ +背景\"> +<h1>体力: #{sum} / 999</h1> +<h2>もう一度探索!</h2> +<a href=\"quest.html\"> +<button class=\"css3button\">Start</button> +</a> +</div> +</body> +</html>\n" + +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/boss2.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,154 @@ +#!/usr/bin/ruby +# coding: utf-8 +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"ontent-type: text/html; charset=utf-8\n\n" + +kaito = c["answer"] +ans = c["dat"] +ber = c["num"] +tai = c["hp"] +tekihp = c["thp"] +sum = tai.to_i +tsum = tekihp.to_i +nb = ber.to_i +quest = [] +wordone = [] +wordtwo = [] +wordthi = [] +wordfou = [] +subject = [] +x = 0 +y = 0 + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + quest << row["question"].to_s + wordone << row["word1"].to_s + wordtwo << row["word2"].to_s + wordthi << row["word3"].to_s + wordfou << row["word4"].to_s + x += 1 + end +end + +if ans.to_s == kaito.to_s + srand + attack = rand(90) + 100 + tsum -= attack +else + srand + tekiat = rand(60) + 60 + sum -= tekiat +end + +if tsum >= 0 && sum >= 0 + + srand + number = rand(x) + srand + check = rand(4) + + print"<html> +<head> +<title>きみのこうげきだよ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>きみのこうげきだよ</h1> +<p>No.#{number}</p> +<div class=\"center01\"> +<div> +<h1>BOSS HP #{tsum} / 500</h1> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\">\n" + + if ans.to_s == kaito.to_s + print"<h1>攻撃成功!</h1>\n" + else + print"<h1>攻撃失敗</h1>\n" + end + + printf("<h1>体力: #{sum} / 999 +<h2>問題</h2> +<p>%s</p> +<form method=\"POST\" action=\"boss2.rb\">\n", quest[number]) + + if check == 0 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></bu\ +tton>\n" + elsif check == 1 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}<br></button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}<br></button>\n" + elsif check == 2 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button>\n" + elsif check == 3 + print"<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordfou[number]}\">#{wordfou[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordthi[number]}\">#{wordthi[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordtwo[number]}\">#{wordtwo[number]}</button> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"#{wordone[number]}\">#{wordone[number]}</button>\n" + end + printf("<input type=\"hidden\" name=\"dat\" value=\"%s\"> +<input type=\"hidden\" name=\"num\" value=\"#{number}\"> +<input type=\"hidden\" name=\"hp\" value=\"#{sum}\"> +<input type=\"hidden\" name=\"thp\" value=\"#{tsum}\"> +</form> +</div> +</div> +</body> +</html>\n", wordone[number]) + +elsif tsum <= 0 && sum > 0 + print"<html> +<head> +<title>BOSSをたおした!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>BOSSをたおした!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"背景\"> +<h1>攻撃成功!</h1> +<h1>体力: #{sum} / 999</h1> +<h2>探索完了!</h2> +<a href=\"quest.html\"> +<button class=\"css3button\">Start</button> +</a> +</div> +</body> +</html>\n" +else + print"<html> +<head> +<title>BOSSをたおした!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>BOSSをたおした!</h1> +<div class=\"center01\"> +<div> +<img border=\"1\" src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"背景\" title=\"\\ +背景\"> +<h1>体力: #{sum} / 999</h1> +<h2>もう一度探索!</h2> +<a href=\"quest.html\"> +<button class=\"css3button\">Start</button> +</a> +</div> +</body> +</html>\n" + +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/damage.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,19 @@ +#!/usr/bin/ruby +# coding: utf-8 +def damage() + srand + check = rand(4) + if check == 0 + point = 100 + point + elsif check == 1 + point = 126 + point + elsif check == 2 + point = 87 + point + elsif check == 3 + point == 199 + point + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/data.txt Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,2063 @@ +0,1+1=?,1,2,3,4,2 +1,日本<=なんと読む?,いっぽん,にほん,さんほん,よんほん,2 +2,選択肢の中で仲間はずれは?,イワシ,クロマグロ,サンマ,タカミダイ,4 +3,水の化学式H2Oの1molあたりの量は?,16,17,18,19,3 +4,「水兵リーベ僕の船」の兵は何を示している?,水素,リチウム,ヘリウム,ベリ +リウム,2 +5,群馬県の県庁所在地は?,高崎市,桐生市,群馬市,前橋市,4 +6,福岡県の県庁所在地は?,博多市,福岡市,小倉市,酒田市,2 +7,人は生物学上何に分類される?,霊長類,魚類,鳥類,哺乳類,4 +8,「忄」は何へん?,りっしんべん,のぎへん,しめすへん,にんべん,1 +9,「胡座」なんと読む?,ござ,あぐら,あくび,ぎょうざ,2 +10,角度30度の時、1/2なのはどれ?,sin,cos,tan,どれでもない,1 +11,三角形の比率で存在するのは3:4::?,5,6,7,8,1 +12,ギターの英語のスペルは?,gitar,guiter,guitar,giter,3 +13,北海道の県庁所在地は?,札幌市,青森市,盛岡市,仙台市,1 +14,青森県の県庁所在地は?,青森市,盛岡市,仙台市,秋田市,1 +15,岩手県の県庁所在地は?,盛岡市,仙台市,秋田市,山形市,1 +16,宮城県の県庁所在地は?,仙台市,秋田市,山形市,福島市,1 +17,秋田県の県庁所在地は?,秋田市,山形市,福島市,水戸市,1 +18,山形県の県庁所在地は?,山形市,福島市,水戸市,宇都宮市,1 +19,福島県の県庁所在地は?,福島市,水戸市,宇都宮市,前橋市,1 +20,茨城県の県庁所在地は?,水戸市,宇都宮市,前橋市,さいたま市,1 +21,栃木県の県庁所在地は?,宇都宮市,前橋市,さいたま市,千葉市,1 +22,群馬県の県庁所在地は?,前橋市,さいたま市,千葉市,東京,1 +23,埼玉県の県庁所在地は?,さいたま市,千葉市,東京,横浜市,1 +24,千葉県の県庁所在地は?,千葉市,東京,横浜市,新潟,1 +25,東京都の県庁所在地は?,東京,横浜市,新潟,富山市,1 +26,神奈川県の県庁所在地は?,横浜市,新潟,富山市,金沢市,1 +27,新潟県の県庁所在地は?,新潟,富山市,金沢市,福井市,1 +28,富山県の県庁所在地は?,富山市,金沢市,福井市,甲府市,1 +29,石川県の県庁所在地は?,金沢市,福井市,甲府市,長野市,1 +30,福井県の県庁所在地は?,福井市,甲府市,長野市,岐阜市,1 +31,山梨県の県庁所在地は?,甲府市,長野市,岐阜市,静岡市,1 +32,長野県の県庁所在地は?,長野市,岐阜市,静岡市,名古屋市,1 +33,岐阜県の県庁所在地は?,岐阜市,静岡市,名古屋市,津市,1 +34,静岡県の県庁所在地は?,静岡市,名古屋市,津市,大津市,1 +35,愛知県の県庁所在地は?,名古屋市,津市,大津市,京都市,1 +36,三重県の県庁所在地は?,津市,大津市,京都市,大阪市,1 +37,滋賀県の県庁所在地は?,大津市,京都市,大阪市,神戸市,1 +38,京都府の県庁所在地は?,京都市,大阪市,神戸市,奈良市,1 +39,大阪府の県庁所在地は?,大阪市,神戸市,奈良市,和歌山市,1 +40,兵庫県の県庁所在地は?,神戸市,奈良市,和歌山市,鳥取市,1 +41,奈良県の県庁所在地は?,奈良市,和歌山市,鳥取市,松江市,1 +42,和歌山県の県庁所在地は?,和歌山市,鳥取市,松江市,岡山市,1 +43,鳥取県の県庁所在地は?,鳥取市,松江市,岡山市,広島市,1 +44,島根県の県庁所在地は?,松江市,岡山市,広島市,山口市,1 +45,岡山県の県庁所在地は?,岡山市,広島市,山口市,徳島市,1 +46,広島県の県庁所在地は?,広島市,山口市,徳島市,高松市,1 +47,山口県の県庁所在地は?,山口市,徳島市,高松市,松山市,1 +48,徳島県の県庁所在地は?,徳島市,高松市,松山市,高知市,1 +49,香川県の県庁所在地は?,高松市,松山市,高知市,福岡市,1 +50,愛媛県の県庁所在地は?,松山市,高知市,福岡市,佐賀市,1 +51,高知県の県庁所在地は?,高知市,福岡市,佐賀市,長崎市,1 +52,福岡県の県庁所在地は?,福岡市,佐賀市,長崎市,熊本市,1 +53,佐賀県の県庁所在地は?,佐賀市,長崎市,熊本市,大分市,1 +54,長崎県の県庁所在地は?,長崎市,熊本市,大分市,宮崎市,1 +55,熊本県の県庁所在地は?,熊本市,大分市,宮崎市,鹿児島市1 +56,大分県の県庁所在地は?,大分市,宮崎市,鹿児島市,那覇市,1 +57,宮崎県の県庁所在地は?,宮崎市,鹿児島市,那覇市,福岡市,1 +58,鹿児島県の県庁所在地は?,鹿児島市,宮崎市,大分市,熊本市,1 +59,沖縄県の県庁所在地は?,那覇市,鹿児島市,宮崎市,大分市,1 +60,1年生の漢字[子]の読みは?,こ,おう,き,そら,1 +61,1年生の漢字[一]の読みは?,いち,おと,きゅう,つき,1 +62,1年生の漢字[右]の読みは?,みぎ,した,きゅう,いぬ,1 +63,1年生の漢字[雨]の読みは?,あめ,はな,たま,けん,1 +64,1年生の漢字[円]の読みは?,えん,がく,きん,ご,1 +65,1年生の漢字[王]の読みは?,おう,き,そら,くち,1 +66,1年生の漢字[音]の読みは?,おと,きゅう,つき,こう,1 +67,1年生の漢字[下]の読みは?,した,きゅう,いぬ,ひだり,1 +68,1年生の漢字[花]の読みは?,はな,たま,けん,さん,1 +69,1年生の漢字[学]の読みは?,がく,きん,ご,やま,1 +70,1年生の漢字[気]の読みは?,き,そら,くち,よん,1 +71,1年生の漢字[九]の読みは?,きゅう,つき,こう,いと,1 +72,1年生の漢字[休]の読みは?,きゅう,いぬ,ひだり,じ,1 +73,1年生の漢字[玉]の読みは?,たま,けん,さん,みみ,1 +74,1年生の漢字[金]の読みは?,きん,ご,やま,なな,1 +75,1年生の漢字[空]の読みは?,そら,くち,よん,くるま,1 +76,1年生の漢字[月]の読みは?,つき,こう,いと,て,1 +77,1年生の漢字[犬]の読みは?,いぬ,ひだり,じ,じゅう,1 +78,1年生の漢字[見]の読みは?,けん,さん,みみ,しゅつ,1 +79,1年生の漢字[五]の読みは?,ご,やま,なな,おんな,1 +80,1年生の漢字[口]の読みは?,くち,よん,くるま,しょう,1 +81,1年生の漢字[校]の読みは?,こう,いと,て,うえ,1 +82,1年生の漢字[左]の読みは?,ひだり,じ,じゅう,もり,1 +83,1年生の漢字[三]の読みは?,さん,みみ,しゅつ,ひと,1 +84,1年生の漢字[山]の読みは?,やま,なな,おんな,みず,1 +85,1年生の漢字[四]の読みは?,よん,くるま,しょう,しょう,1 +86,1年生の漢字[糸]の読みは?,いと,て,うえ,しょう,1 +87,1年生の漢字[字]の読みは?,じ,じゅう,もり,あお,1 +88,1年生の漢字[耳]の読みは?,みみ,しゅつ,ひと,ゆう,1 +89,1年生の漢字[七]の読みは?,なな,おんな,みず,いし,1 +90,1年生の漢字[車]の読みは?,くるま,しょう,しょう,あか,1 +91,1年生の漢字[手]の読みは?,て,うえ,しょう,せん,1 +92,1年生の漢字[十]の読みは?,じゅう,もり,あお,かわ,1 +93,1年生の漢字[出]の読みは?,しゅつ,ひと,ゆう,さき,1 +94,1年生の漢字[女]の読みは?,おんな,みず,いし,そう,1 +95,1年生の漢字[小]の読みは?,しょう,しょう,あか,そう,1 +96,1年生の漢字[上]の読みは?,うえ,しょう,せん,あし,1 +97,1年生の漢字[森]の読みは?,もり,あお,かわ,むら,1 +98,1年生の漢字[人]の読みは?,ひと,ゆう,さき,だい,1 +99,1年生の漢字[水]の読みは?,みず,いし,そう,おとこ,1 +100,1年生の漢字[正]の読みは?,しょう,あか,そう,たけ,1 +101,1年生の漢字[生]の読みは?,しょう,せん,あし,ちゅう,1 +102,1年生の漢字[青]の読みは?,あお,かわ,むら,むし,1 +103,1年生の漢字[夕]の読みは?,ゆう,さき,だい,まち,1 +104,1年生の漢字[石]の読みは?,いし,そう,おとこ,てん,1 +105,1年生の漢字[赤]の読みは?,あか,そう,たけ,た,1 +106,1年生の漢字[千]の読みは?,せん,あし,ちゅう,つち,1 +107,1年生の漢字[川]の読みは?,かわ,むら,むし,に,1 +108,1年生の漢字[先]の読みは?,さき,だい,まち,にち,1 +109,1年生の漢字[早]の読みは?,そう,おとこ,てん,にゅう,1 +110,1年生の漢字[草]の読みは?,そう,たけ,た,とし,1 +111,1年生の漢字[足]の読みは?,あし,ちゅう,つち,しろ,1 +112,1年生の漢字[村]の読みは?,むら,むし,に,はち,1 +113,1年生の漢字[大]の読みは?,だい,まち,にち,ひゃく,1 +114,1年生の漢字[男]の読みは?,おとこ,てん,にゅう,ぶん,1 +115,1年生の漢字[竹]の読みは?,たけ,た,とし,き,1 +116,1年生の漢字[中]の読みは?,ちゅう,つち,しろ,ほん,1 +117,1年生の漢字[虫]の読みは?,むし,に,はち,めい,1 +118,1年生の漢字[町]の読みは?,まち,にち,ひゃく,め,1 +119,1年生の漢字[天]の読みは?,てん,にゅう,ぶん,りつ,1 +120,1年生の漢字[田]の読みは?,た,とし,き,ちから,1 +121,1年生の漢字[土]の読みは?,つち,しろ,ほん,はやし,1 +122,1年生の漢字[二]の読みは?,に,はち,めい,ろく,1 +123,1年生の漢字[日]の読みは?,にち,ひゃく,め,いん,1 +124,1年生の漢字[入]の読みは?,にゅう,ぶん,りつ,はね,1 +125,1年生の漢字[年]の読みは?,とし,き,ちから,くも,1 +126,1年生の漢字[白]の読みは?,しろ,ほん,はやし,えん,1 +127,1年生の漢字[八]の読みは?,はち,めい,ろく,えん,1 +128,1年生の漢字[百]の読みは?,ひゃく,め,いん,なに,1 +129,1年生の漢字[文]の読みは?,ぶん,りつ,はね,か,1 +130,1年生の漢字[木]の読みは?,き,ちから,くも,なつ,1 +131,1年生の漢字[本]の読みは?,ほん,はやし,えん,いえ,1 +132,1年生の漢字[名]の読みは?,めい,ろく,えん,うた,1 +133,1年生の漢字[目]の読みは?,め,いん,なに,が,1 +134,1年生の漢字[立]の読みは?,りつ,はね,か,かい,1 +135,1年生の漢字[力]の読みは?,ちから,くも,なつ,かい,1 +136,1年生の漢字[林]の読みは?,はやし,えん,いえ,うみ,1 +137,1年生の漢字[六]の読みは?,ろく,えん,うた,え,1 +138,2年生の漢字[引]の読みは?,いん,なに,が,そと,1 +139,2年生の漢字[羽]の読みは?,はね,か,かい,かく,1 +140,2年生の漢字[雲]の読みは?,くも,なつ,かい,らく,1 +141,2年生の漢字[園]の読みは?,えん,いえ,うみ,かつ,1 +142,2年生の漢字[遠]の読みは?,えん,うた,え,あいだ,1 +143,2年生の漢字[何]の読みは?,なに,が,そと,いわ,1 +144,2年生の漢字[科]の読みは?,か,かい,かく,かお,1 +145,2年生の漢字[夏]の読みは?,なつ,かい,らく,き,1 +146,2年生の漢字[家]の読みは?,いえ,うみ,かつ,き,1 +147,2年生の漢字[歌]の読みは?,うた,え,あいだ,き,1 +148,2年生の漢字[画]の読みは?,が,そと,いわ,ゆみ,1 +149,2年生の漢字[回]の読みは?,かい,かく,かお,うし,1 +150,2年生の漢字[会]の読みは?,かい,らく,き,さかな,1 +151,2年生の漢字[海]の読みは?,うみ,かつ,き,けい,1 +152,2年生の漢字[絵]の読みは?,え,あいだ,き,きょう,1 +153,2年生の漢字[外]の読みは?,そと,いわ,ゆみ,きょう,1 +154,2年生の漢字[角]の読みは?,かく,かお,うし,きん,1 +155,2年生の漢字[楽]の読みは?,らく,き,さかな,あに,1 +156,2年生の漢字[活]の読みは?,かつ,き,けい,かたち,1 +157,2年生の漢字[間]の読みは?,あいだ,き,きょう,けい,1 +158,2年生の漢字[岩]の読みは?,いわ,ゆみ,きょう,もと,1 +159,2年生の漢字[顔]の読みは?,かお,うし,きん,げん,1 +160,2年生の漢字[汽]の読みは?,き,さかな,あに,げん,1 +161,2年生の漢字[記]の読みは?,き,けい,かたち,と,1 +162,2年生の漢字[帰]の読みは?,き,きょう,けい,こ,1 +163,2年生の漢字[弓]の読みは?,ゆみ,きょう,もと,うし,1 +164,2年生の漢字[牛]の読みは?,うし,きん,げん,あと,1 +165,2年生の漢字[魚]の読みは?,さかな,あに,げん,ご,1 +166,2年生の漢字[京]の読みは?,けい,かたち,と,こう,1 +167,2年生の漢字[強]の読みは?,きょう,けい,こ,こう,1 +168,2年生の漢字[教]の読みは?,きょう,もと,うし,こう,1 +169,2年生の漢字[近]の読みは?,きん,げん,あと,こう,1 +170,2年生の漢字[兄]の読みは?,あに,げん,ご,ひかり,1 +171,2年生の漢字[形]の読みは?,かたち,と,こう,こう,1 +172,2年生の漢字[計]の読みは?,けい,こ,こう,ぎょう,1 +173,2年生の漢字[元]の読みは?,もと,うし,こう,こう,1 +174,2年生の漢字[言]の読みは?,げん,あと,こう,き,1 +175,2年生の漢字[原]の読みは?,げん,ご,ひかり,ごう,1 +176,2年生の漢字[戸]の読みは?,と,こう,こう,たに,1 +177,2年生の漢字[古]の読みは?,こ,こう,ぎょう,くに,1 +178,2年生の漢字[牛]の読みは?,うし,こう,こう,くろ,1 +179,2年生の漢字[後]の読みは?,あと,こう,き,いま,1 +180,2年生の漢字[語]の読みは?,ご,ひかり,ごう,さい,1 +181,2年生の漢字[工]の読みは?,こう,こう,たに,さい,1 +182,2年生の漢字[公]の読みは?,こう,ぎょう,くに,さく,1 +183,2年生の漢字[広]の読みは?,こう,こう,くろ,さん,1 +184,2年生の漢字[交]の読みは?,こう,き,いま,し,1 +185,2年生の漢字[光]の読みは?,ひかり,ごう,さい,し,1 +186,2年生の漢字[考]の読みは?,こう,たに,さい,や,1 +187,2年生の漢字[行]の読みは?,ぎょう,くに,さく,あね,1 +188,2年生の漢字[高]の読みは?,こう,くろ,さん,し,1 +189,2年生の漢字[黄]の読みは?,き,いま,し,かみ,1 +190,2年生の漢字[合]の読みは?,ごう,さい,し,てら,1 +191,2年生の漢字[谷]の読みは?,たに,さい,や,じ,1 +192,2年生の漢字[国]の読みは?,くに,さく,あね,じ,1 +193,2年生の漢字[黒]の読みは?,くろ,さん,し,しつ,1 +194,2年生の漢字[今]の読みは?,いま,し,かみ,しゃ,1 +195,2年生の漢字[才]の読みは?,さい,し,てら,じゃく,1 +196,2年生の漢字[細]の読みは?,さい,や,じ,くび,1 +197,2年生の漢字[作]の読みは?,さく,あね,じ,あき,1 +198,2年生の漢字[算]の読みは?,さん,し,しつ,しゅう,1 +199,2年生の漢字[止]の読みは?,し,かみ,しゃ,はる,1 +200,2年生の漢字[市]の読みは?,し,てら,じゃく,しょ,1 +201,2年生の漢字[矢]の読みは?,や,じ,くび,しょう,1 +202,2年生の漢字[姉]の読みは?,あね,じ,あき,ば,1 +203,2年生の漢字[思]の読みは?,し,しつ,しゅう,いろ,1 +204,2年生の漢字[紙]の読みは?,かみ,しゃ,はる,こころ,1 +205,2年生の漢字[寺]の読みは?,てら,じゃく,しょ,しょく,1 +206,2年生の漢字[自]の読みは?,じ,くび,しょう,しん,1 +207,2年生の漢字[時]の読みは?,じ,あき,ば,おや,1 +208,2年生の漢字[室]の読みは?,しつ,しゅう,いろ,ず,1 +209,2年生の漢字[社]の読みは?,しゃ,はる,こころ,かず,1 +210,2年生の漢字[弱]の読みは?,じゃく,しょ,しょく,にし,1 +211,2年生の漢字[首]の読みは?,くび,しょう,しん,こえ,1 +212,2年生の漢字[秋]の読みは?,あき,ば,おや,ほし,1 +213,2年生の漢字[週]の読みは?,しゅう,いろ,ず,はれ,1 +214,2年生の漢字[春]の読みは?,はる,こころ,かず,せつ,1 +215,2年生の漢字[書]の読みは?,しょ,しょく,にし,ゆき,1 +216,2年生の漢字[少]の読みは?,しょう,しん,こえ,ふね,1 +217,2年生の漢字[場]の読みは?,ば,おや,ほし,せん,1 +218,2年生の漢字[色]の読みは?,いろ,ず,はれ,まえ,1 +219,2年生の漢字[心]の読みは?,こころ,かず,せつ,くみ,1 +220,2年生の漢字[食]の読みは?,しょく,にし,ゆき,そう,1 +221,2年生の漢字[新]の読みは?,しん,こえ,ふね,た,1 +222,2年生の漢字[親]の読みは?,おや,ほし,せん,た,1 +223,2年生の漢字[図]の読みは?,ず,はれ,まえ,たい,1 +224,2年生の漢字[数]の読みは?,かず,せつ,くみ,だい,1 +225,2年生の漢字[西]の読みは?,にし,ゆき,そう,ち,1 +226,2年生の漢字[声]の読みは?,こえ,ふね,た,いけ,1 +227,2年生の漢字[星]の読みは?,ほし,せん,た,ち,1 +228,2年生の漢字[晴]の読みは?,はれ,まえ,たい,ちゃ,1 +229,2年生の漢字[切]の読みは?,せつ,くみ,だい,ひる,1 +230,2年生の漢字[雪]の読みは?,ゆき,そう,ち,ちょう,1 +231,2年生の漢字[船]の読みは?,ふね,た,いけ,とり,1 +232,2年生の漢字[線]の読みは?,せん,た,ち,あさ,1 +233,2年生の漢字[前]の読みは?,まえ,たい,ちゃ,ちょく,1 +234,2年生の漢字[組]の読みは?,くみ,だい,ひる,つう,1 +235,2年生の漢字[走]の読みは?,そう,ち,ちょう,おとうと,1 +236,2年生の漢字[多]の読みは?,た,いけ,とり,みせ,1 +237,2年生の漢字[太]の読みは?,た,ち,あさ,てん,1 +238,2年生の漢字[体]の読みは?,たい,ちゃ,ちょく,でん,1 +239,2年生の漢字[台]の読みは?,だい,ひる,つう,かたな,1 +240,2年生の漢字[地]の読みは?,ち,ちょう,おとうと,ふゆ,1 +241,2年生の漢字[池]の読みは?,いけ,とり,みせ,とう,1 +242,2年生の漢字[知]の読みは?,ち,あさ,てん,ひがし,1 +243,2年生の漢字[茶]の読みは?,ちゃ,ちょく,でん,とう,1 +244,2年生の漢字[昼]の読みは?,ひる,つう,かたな,あたま,1 +245,2年生の漢字[長]の読みは?,ちょう,おとうと,ふゆ,どう,1 +246,2年生の漢字[鳥]の読みは?,とり,みせ,とう,みち,1 +247,2年生の漢字[朝]の読みは?,あさ,てん,ひがし,どく,1 +248,2年生の漢字[直]の読みは?,ちょく,でん,とう,うち,1 +249,2年生の漢字[通]の読みは?,つう,かたな,あたま,みなみ,1 +250,2年生の漢字[弟]の読みは?,おとうと,ふゆ,どう,にく,1 +251,2年生の漢字[店]の読みは?,みせ,とう,みち,うま,1 +252,2年生の漢字[点]の読みは?,てん,ひがし,どく,ばい,1 +253,2年生の漢字[電]の読みは?,でん,とう,うち,ばい,1 +254,2年生の漢字[刀]の読みは?,かたな,あたま,みなみ,むぎ,1 +255,2年生の漢字[冬]の読みは?,ふゆ,どう,にく,はん,1 +256,2年生の漢字[当]の読みは?,とう,みち,うま,ばん,1 +257,2年生の漢字[東]の読みは?,ひがし,どく,ばい,ちち,1 +258,2年生の漢字[答]の読みは?,とう,うち,ばい,かぜ,1 +259,2年生の漢字[頭]の読みは?,あたま,みなみ,むぎ,ぶん,1 +260,2年生の漢字[同]の読みは?,どう,にく,はん,ぶん,1 +261,2年生の漢字[道]の読みは?,みち,うま,ばん,こめ,1 +262,2年生の漢字[読]の読みは?,どく,ばい,ちち,ほ,1 +263,2年生の漢字[内]の読みは?,うち,ばい,かぜ,はは,1 +264,2年生の漢字[南]の読みは?,みなみ,むぎ,ぶん,ほう,1 +265,2年生の漢字[肉]の読みは?,にく,はん,ぶん,きた,1 +266,2年生の漢字[馬]の読みは?,うま,ばん,こめ,ごと,1 +267,2年生の漢字[売]の読みは?,ばい,ちち,ほ,いもうと,1 +268,2年生の漢字[買]の読みは?,ばい,かぜ,はは,まん,1 +269,2年生の漢字[麦]の読みは?,むぎ,ぶん,ほう,みょう,1 +270,2年生の漢字[半]の読みは?,はん,ぶん,きた,なる,1 +271,2年生の漢字[番]の読みは?,ばん,こめ,ごと,け,1 +272,2年生の漢字[父]の読みは?,ちち,ほ,いもうと,もん,1 +273,2年生の漢字[風]の読みは?,かぜ,はは,まん,よる,1 +274,2年生の漢字[分]の読みは?,ぶん,ほう,みょう,の,1 +275,2年生の漢字[聞]の読みは?,ぶん,きた,なる,とも,1 +276,2年生の漢字[米]の読みは?,こめ,ごと,け,よう,1 +277,2年生の漢字[歩]の読みは?,ほ,いもうと,もん,よう,1 +278,2年生の漢字[母]の読みは?,はは,まん,よる,らい,1 +279,2年生の漢字[方]の読みは?,ほう,みょう,の,さと,1 +280,2年生の漢字[北]の読みは?,きた,なる,とも,ことわり,1 +281,2年生の漢字[毎]の読みは?,ごと,け,よう,はなし,1 +282,2年生の漢字[妹]の読みは?,いもうと,もん,よう,あく,1 +283,2年生の漢字[万]の読みは?,まん,よる,らい,あん,1 +284,2年生の漢字[明]の読みは?,みょう,の,さと,あん,1 +285,2年生の漢字[鳴]の読みは?,なる,とも,ことわり,い,1 +286,2年生の漢字[毛]の読みは?,け,よう,はなし,い,1 +287,2年生の漢字[門]の読みは?,もん,よう,あく,い,1 +288,2年生の漢字[夜]の読みは?,よる,らい,あん,いく,1 +289,2年生の漢字[野]の読みは?,の,さと,あん,いん,1 +290,2年生の漢字[友]の読みは?,とも,ことわり,い,いん,1 +291,2年生の漢字[用]の読みは?,よう,はなし,い,いん,1 +292,2年生の漢字[曜]の読みは?,よう,あく,い,うん,1 +293,2年生の漢字[来]の読みは?,らい,あん,いく,えい,1 +294,2年生の漢字[里]の読みは?,さと,あん,いん,えき,1 +295,2年生の漢字[理]の読みは?,ことわり,い,いん,おう,1 +296,2年生の漢字[話]の読みは?,はなし,い,いん,よこ,1 +297,3年生の漢字[悪]の読みは?,あく,い,うん,おく,1 +298,3年生の漢字[安]の読みは?,あん,いく,えい,おん,1 +299,3年生の漢字[暗]の読みは?,あん,いん,えき,か,1 +300,3年生の漢字[医]の読みは?,い,いん,おう,に,1 +301,3年生の漢字[委]の読みは?,い,いん,よこ,かい,1 +302,3年生の漢字[意]の読みは?,い,うん,おく,かい,1 +303,3年生の漢字[育]の読みは?,いく,えい,おん,かい,1 +304,3年生の漢字[員]の読みは?,いん,えき,か,かん,1 +305,3年生の漢字[院]の読みは?,いん,おう,に,かん,1 +306,3年生の漢字[飲]の読みは?,いん,よこ,かい,かん,1 +307,3年生の漢字[運]の読みは?,うん,おく,かい,やかた,1 +308,3年生の漢字[泳]の読みは?,えい,おん,かい,きし,1 +309,3年生の漢字[駅]の読みは?,えき,か,かん,き,1 +310,3年生の漢字[央]の読みは?,おう,に,かん,き,1 +311,3年生の漢字[横]の読みは?,よこ,かい,かん,きゃく,1 +312,3年生の漢字[屋]の読みは?,おく,かい,やかた,きゅう,1 +313,3年生の漢字[温]の読みは?,おん,かい,きし,きゅう,1 +314,3年生の漢字[化]の読みは?,か,かん,き,きゅう,1 +315,3年生の漢字[荷]の読みは?,に,かん,き,みや,1 +316,3年生の漢字[界]の読みは?,かい,かん,きゃく,たま,1 +317,3年生の漢字[開]の読みは?,かい,やかた,きゅう,きょ,1 +318,3年生の漢字[階]の読みは?,かい,きし,きゅう,はし,1 +319,3年生の漢字[寒]の読みは?,かん,き,きゅう,わざ,1 +320,3年生の漢字[感]の読みは?,かん,き,みや,きょく,1 +321,3年生の漢字[漢]の読みは?,かん,きゃく,たま,きょく,1 +322,3年生の漢字[館]の読みは?,やかた,きゅう,きょ,ぎん,1 +323,3年生の漢字[岸]の読みは?,きし,きゅう,はし,く,1 +324,3年生の漢字[起]の読みは?,き,きゅう,わざ,く,1 +325,3年生の漢字[期]の読みは?,き,みや,きょく,ぐ,1 +326,3年生の漢字[客]の読みは?,きゃく,たま,きょく,きみ,1 +327,3年生の漢字[究]の読みは?,きゅう,きょ,ぎん,かかり,1 +328,3年生の漢字[急]の読みは?,きゅう,はし,く,けい,1 +329,3年生の漢字[級]の読みは?,きゅう,わざ,く,ち,1 +330,3年生の漢字[宮]の読みは?,みや,きょく,ぐ,けつ,1 +331,3年生の漢字[球]の読みは?,たま,きょく,きみ,けん,1 +332,3年生の漢字[去]の読みは?,きょ,ぎん,かかり,けん,1 +333,3年生の漢字[橋]の読みは?,はし,く,けい,こ,1 +334,3年生の漢字[業]の読みは?,わざ,く,ち,みずうみ,1 +335,3年生の漢字[曲]の読みは?,きょく,ぐ,けつ,むこう,1 +336,3年生の漢字[局]の読みは?,きょく,きみ,けん,さち,1 +337,3年生の漢字[銀]の読みは?,ぎん,かかり,けん,みなと,1 +338,3年生の漢字[区]の読みは?,く,けい,こ,ごう,1 +339,3年生の漢字[苦]の読みは?,く,ち,みずうみ,ね,1 +340,3年生の漢字[具]の読みは?,ぐ,けつ,むこう,まつり,1 +341,3年生の漢字[君]の読みは?,きみ,けん,さち,さら,1 +342,3年生の漢字[係]の読みは?,かかり,けん,みなと,し,1 +343,3年生の漢字[軽]の読みは?,けい,こ,ごう,し,1 +344,3年生の漢字[血]の読みは?,ち,みずうみ,ね,し,1 +345,3年生の漢字[決]の読みは?,けつ,むこう,まつり,し,1 +346,3年生の漢字[研]の読みは?,けん,さち,さら,ゆび,1 +347,3年生の漢字[県]の読みは?,けん,みなと,し,は,1 +348,3年生の漢字[庫]の読みは?,こ,ごう,し,し,1 +349,3年生の漢字[湖]の読みは?,みずうみ,ね,し,つぎ,1 +350,3年生の漢字[向]の読みは?,むこう,まつり,し,こと,1 +351,3年生の漢字[幸]の読みは?,さち,さら,ゆび,じ,1 +352,3年生の漢字[港]の読みは?,みなと,し,は,しき,1 +353,3年生の漢字[号]の読みは?,ごう,し,し,じつ,1 +354,3年生の漢字[根]の読みは?,ね,し,つぎ,しゃ,1 +355,3年生の漢字[祭]の読みは?,まつり,し,こと,しゃ,1 +356,3年生の漢字[皿]の読みは?,さら,ゆび,じ,しゅ,1 +357,3年生の漢字[仕]の読みは?,し,は,しき,しゅ,1 +358,3年生の漢字[死]の読みは?,し,し,じつ,しゅ,1 +359,3年生の漢字[使]の読みは?,し,つぎ,しゃ,しゅ,1 +360,3年生の漢字[始]の読みは?,し,こと,しゃ,じゅ,1 +361,3年生の漢字[指]の読みは?,ゆび,じ,しゅ,しゅう,1 +362,3年生の漢字[歯]の読みは?,は,しき,しゅ,しゅう,1 +363,3年生の漢字[詩]の読みは?,し,じつ,しゅ,しゅう,1 +364,3年生の漢字[次]の読みは?,つぎ,しゃ,しゅ,しゅう,1 +365,3年生の漢字[事]の読みは?,こと,しゃ,じゅ,しゅう,1 +366,3年生の漢字[持]の読みは?,じ,しゅ,しゅう,じゅう,1 +367,3年生の漢字[式]の読みは?,しき,しゅ,しゅう,じゅう,1 +368,3年生の漢字[実]の読みは?,じつ,しゅ,しゅう,やど,1 +369,3年生の漢字[写]の読みは?,しゃ,しゅ,しゅう,ところ,1 +370,3年生の漢字[者]の読みは?,しゃ,じゅ,しゅう,しょ,1 +371,3年生の漢字[主]の読みは?,しゅ,しゅう,じゅう,じょ,1 +372,3年生の漢字[守]の読みは?,しゅ,しゅう,じゅう,しょう,1 +373,3年生の漢字[取]の読みは?,しゅ,しゅう,やど,しょう,1 +374,3年生の漢字[酒]の読みは?,しゅ,しゅう,ところ,あきない,1 +375,3年生の漢字[受]の読みは?,じゅ,しゅう,しょ,しょう,1 +376,3年生の漢字[州]の読みは?,しゅう,じゅう,じょ,しょう,1 +377,3年生の漢字[拾]の読みは?,しゅう,じゅう,しょう,じょう,1 +378,3年生の漢字[終]の読みは?,しゅう,やど,しょう,しょく,1 +379,3年生の漢字[習]の読みは?,しゅう,ところ,あきない,しん,1 +380,3年生の漢字[集]の読みは?,しゅう,しょ,しょう,しん,1 +381,3年生の漢字[住]の読みは?,じゅう,じょ,しょう,かみ,1 +382,3年生の漢字[重]の読みは?,じゅう,しょう,じょう,しん,1 +383,3年生の漢字[宿]の読みは?,やど,しょう,しょく,しん,1 +384,3年生の漢字[所]の読みは?,ところ,あきない,しん,しん,1 +385,3年生の漢字[暑]の読みは?,しょ,しょう,しん,よ,1 +386,3年生の漢字[助]の読みは?,じょ,しょう,かみ,せい,1 +387,3年生の漢字[昭]の読みは?,しょう,じょう,しん,むかし,1 +388,3年生の漢字[消]の読みは?,しょう,しょく,しん,ぜん,1 +389,3年生の漢字[商]の読みは?,あきない,しん,しん,そう,1 +390,3年生の漢字[章]の読みは?,しょう,しん,よ,そう,1 +391,3年生の漢字[勝]の読みは?,しょう,かみ,せい,そう,1 +392,3年生の漢字[乗]の読みは?,じょう,しん,むかし,いき,1 +393,3年生の漢字[植]の読みは?,しょく,しん,ぜん,そく,1 +394,3年生の漢字[申]の読みは?,しん,しん,そう,ぞく,1 +395,3年生の漢字[身]の読みは?,しん,よ,そう,た,1 +396,3年生の漢字[神]の読みは?,かみ,せい,そう,だ,1 +397,3年生の漢字[真]の読みは?,しん,むかし,いき,たい,1 +398,3年生の漢字[深]の読みは?,しん,ぜん,そく,たい,1 +399,3年生の漢字[進]の読みは?,しん,そう,ぞく,だい,1 +400,3年生の漢字[世]の読みは?,よ,そう,た,だい,1 +401,3年生の漢字[整]の読みは?,せい,そう,だ,だい,1 +402,3年生の漢字[昔]の読みは?,むかし,いき,たい,たん,1 +403,3年生の漢字[全]の読みは?,ぜん,そく,たい,たん,1 +404,3年生の漢字[相]の読みは?,そう,ぞく,だい,だん,1 +405,3年生の漢字[送]の読みは?,そう,た,だい,ちゃく,1 +406,3年生の漢字[想]の読みは?,そう,だ,だい,ちゅう,1 +407,3年生の漢字[息]の読みは?,いき,たい,たん,はしら,1 +408,3年生の漢字[速]の読みは?,そく,たい,たん,ちょう,1 +409,3年生の漢字[族]の読みは?,ぞく,だい,だん,ちょう,1 +410,3年生の漢字[他]の読みは?,た,だい,ちゃく,ちょう,1 +411,3年生の漢字[打]の読みは?,だ,だい,ちゅう,つい,1 +412,3年生の漢字[対]の読みは?,たい,たん,はしら,じょう,1 +413,3年生の漢字[待]の読みは?,たい,たん,ちょう,にわ,1 +414,3年生の漢字[代]の読みは?,だい,だん,ちょう,ふえ,1 +415,3年生の漢字[第]の読みは?,だい,ちゃく,ちょう,てつ,1 +416,3年生の漢字[題]の読みは?,だい,ちゅう,つい,てん,1 +417,3年生の漢字[炭]の読みは?,たん,はしら,じょう,みやこ,1 +418,3年生の漢字[短]の読みは?,たん,ちょう,にわ,たび,1 +419,3年生の漢字[談]の読みは?,だん,ちょう,ふえ,とう,1 +420,3年生の漢字[着]の読みは?,ちゃく,ちょう,てつ,まめ,1 +421,3年生の漢字[注]の読みは?,ちゅう,つい,てん,しま,1 +422,3年生の漢字[柱]の読みは?,はしら,じょう,みやこ,ゆ,1 +423,3年生の漢字[丁]の読みは?,ちょう,にわ,たび,とう,1 +424,3年生の漢字[帳]の読みは?,ちょう,ふえ,とう,とう,1 +425,3年生の漢字[調]の読みは?,ちょう,てつ,まめ,どう,1 +426,3年生の漢字[追]の読みは?,つい,てん,しま,どう,1 +427,3年生の漢字[定]の読みは?,じょう,みやこ,ゆ,のう,1 +428,3年生の漢字[庭]の読みは?,にわ,たび,とう,なみ,1 +429,3年生の漢字[笛]の読みは?,ふえ,とう,とう,はい,1 +430,3年生の漢字[鉄]の読みは?,てつ,まめ,どう,ばい,1 +431,3年生の漢字[転]の読みは?,てん,しま,どう,はこ,1 +432,3年生の漢字[都]の読みは?,みやこ,ゆ,のう,はたけ,1 +433,3年生の漢字[度]の読みは?,たび,とう,なみ,はつ,1 +434,3年生の漢字[投]の読みは?,とう,とう,はい,はん,1 +435,3年生の漢字[豆]の読みは?,まめ,どう,ばい,さか,1 +436,3年生の漢字[島]の読みは?,しま,どう,はこ,いた,1 +437,3年生の漢字[湯]の読みは?,ゆ,のう,はたけ,かわ,1 +438,3年生の漢字[登]の読みは?,とう,なみ,はつ,ひ,1 +439,3年生の漢字[等]の読みは?,とう,はい,はん,び,1 +440,3年生の漢字[動]の読みは?,どう,ばい,さか,はな,1 +441,3年生の漢字[童]の読みは?,どう,はこ,いた,ふで,1 +442,3年生の漢字[農]の読みは?,のう,はたけ,かわ,こおり,1 +443,3年生の漢字[波]の読みは?,なみ,はつ,ひ,おもて,1 +444,3年生の漢字[配]の読みは?,はい,はん,び,びょう,1 +445,3年生の漢字[倍]の読みは?,ばい,さか,はな,やまい,1 +446,3年生の漢字[箱]の読みは?,はこ,いた,ふで,しな,1 +447,3年生の漢字[畑]の読みは?,はたけ,かわ,こおり,ふ,1 +448,3年生の漢字[発]の読みは?,はつ,ひ,おもて,ぶ,1 +449,3年生の漢字[反]の読みは?,はん,び,びょう,ふく,1 +450,3年生の漢字[坂]の読みは?,さか,はな,やまい,ふく,1 +451,3年生の漢字[板]の読みは?,いた,ふで,しな,ぶつ,1 +452,3年生の漢字[皮]の読みは?,かわ,こおり,ふ,ひら,1 +453,3年生の漢字[悲]の読みは?,ひ,おもて,ぶ,へん,1 +454,3年生の漢字[美]の読みは?,び,びょう,ふく,べん,1 +455,3年生の漢字[鼻]の読みは?,はな,やまい,ふく,ほう,1 +456,3年生の漢字[筆]の読みは?,ふで,しな,ぶつ,あじ,1 +457,3年生の漢字[氷]の読みは?,こおり,ふ,ひら,いのち,1 +458,3年生の漢字[表]の読みは?,おもて,ぶ,へん,めん,1 +459,3年生の漢字[秒]の読みは?,びょう,ふく,べん,もん,1 +460,3年生の漢字[病]の読みは?,やまい,ふく,ほう,やく,1 +461,3年生の漢字[品]の読みは?,しな,ぶつ,あじ,くすり,1 +462,3年生の漢字[負]の読みは?,ふ,ひら,いのち,ゆ,1 +463,3年生の漢字[部]の読みは?,ぶ,へん,めん,あぶら,1 +464,3年生の漢字[服]の読みは?,ふく,べん,もん,ゆう,1 +465,3年生の漢字[福]の読みは?,ふく,ほう,やく,ゆう,1 +466,3年生の漢字[物]の読みは?,ぶつ,あじ,くすり,よ,1 +467,3年生の漢字[平]の読みは?,ひら,いのち,ゆ,ひつじ,1 +468,3年生の漢字[返]の読みは?,へん,めん,あぶら,よう,1 +469,3年生の漢字[勉]の読みは?,べん,もん,ゆう,は,1 +470,3年生の漢字[放]の読みは?,ほう,やく,ゆう,よう,1 +471,3年生の漢字[味]の読みは?,あじ,くすり,よ,さま,1 +472,3年生の漢字[命]の読みは?,いのち,ゆ,ひつじ,らく,1 +473,3年生の漢字[面]の読みは?,めん,あぶら,よう,りゅう,1 +474,3年生の漢字[問]の読みは?,もん,ゆう,は,たび,1 +475,3年生の漢字[役]の読みは?,やく,ゆう,よう,りょう,1 +476,3年生の漢字[薬]の読みは?,くすり,よ,さま,みどり,1 +477,3年生の漢字[由]の読みは?,ゆ,ひつじ,らく,れい,1 +478,3年生の漢字[油]の読みは?,あぶら,よう,りゅう,れつ,1 +479,3年生の漢字[有]の読みは?,ゆう,は,たび,れん,1 +480,3年生の漢字[遊]の読みは?,ゆう,よう,りょう,ろ,1 +481,3年生の漢字[予]の読みは?,よ,さま,みどり,わ,1 +482,3年生の漢字[羊]の読みは?,ひつじ,らく,れい,あい,1 +483,3年生の漢字[洋]の読みは?,よう,りゅう,れつ,あん,1 +484,3年生の漢字[葉]の読みは?,は,たび,れん,い,1 +485,3年生の漢字[陽]の読みは?,よう,りょう,ろ,ころも,1 +486,3年生の漢字[様]の読みは?,さま,みどり,わ,くらい,1 +487,3年生の漢字[落]の読みは?,らく,れい,あい,い,1 +488,3年生の漢字[流]の読みは?,りゅう,れつ,あん,い,1 +489,3年生の漢字[旅]の読みは?,たび,れん,い,しるし,1 +490,3年生の漢字[両]の読みは?,りょう,ろ,ころも,えい,1 +491,3年生の漢字[緑]の読みは?,みどり,わ,くらい,えい,1 +492,3年生の漢字[礼]の読みは?,れい,あい,い,しお,1 +493,3年生の漢字[列]の読みは?,れつ,あん,い,おく,1 +494,3年生の漢字[練]の読みは?,れん,い,しるし,か,1 +495,3年生の漢字[路]の読みは?,ろ,ころも,えい,か,1 +496,3年生の漢字[和]の読みは?,わ,くらい,えい,か,1 +497,4年生の漢字[愛]の読みは?,あい,い,しお,か,1 +498,4年生の漢字[案]の読みは?,あん,い,おく,め,1 +499,4年生の漢字[以]の読みは?,い,しるし,か,かい,1 +500,4年生の漢字[衣]の読みは?,ころも,えい,か,かい,1 +501,4年生の漢字[位]の読みは?,くらい,えい,か,がい,1 +502,4年生の漢字[囲]の読みは?,い,しお,か,まち,1 +503,4年生の漢字[胃]の読みは?,い,おく,め,かく,1 +504,4年生の漢字[印]の読みは?,しるし,か,かい,かく,1 +505,4年生の漢字[英]の読みは?,えい,か,かい,かん,1 +506,4年生の漢字[栄]の読みは?,えい,か,がい,かん,1 +507,4年生の漢字[塩]の読みは?,しお,か,まち,かん,1 +508,4年生の漢字[億]の読みは?,おく,め,かく,かん,1 +509,4年生の漢字[加]の読みは?,か,かい,かく,かん,1 +510,4年生の漢字[果]の読みは?,か,かい,かん,がん,1 +511,4年生の漢字[貨]の読みは?,か,がい,かん,き,1 +512,4年生の漢字[課]の読みは?,か,まち,かん,き,1 +513,4年生の漢字[芽]の読みは?,め,かく,かん,き,1 +514,4年生の漢字[改]の読みは?,かい,かく,かん,き,1 +515,4年生の漢字[械]の読みは?,かい,かん,がん,はた,1 +516,4年生の漢字[害]の読みは?,がい,かん,き,うつわ,1 +517,4年生の漢字[街]の読みは?,まち,かん,き,き,1 +518,4年生の漢字[各]の読みは?,かく,かん,き,ぎ,1 +519,4年生の漢字[覚]の読みは?,かく,かん,き,きゅう,1 +520,4年生の漢字[完]の読みは?,かん,がん,はた,きゅう,1 +521,4年生の漢字[官]の読みは?,かん,き,うつわ,きゅう,1 +522,4年生の漢字[管]の読みは?,かん,き,き,きゅう,1 +523,4年生の漢字[関]の読みは?,かん,き,ぎ,きょ,1 +524,4年生の漢字[観]の読みは?,かん,き,きゅう,りょう,1 +525,4年生の漢字[願]の読みは?,がん,はた,きゅう,きょう,1 +526,4年生の漢字[希]の読みは?,き,うつわ,きゅう,きょう,1 +527,4年生の漢字[季]の読みは?,き,き,きゅう,きょう,1 +528,4年生の漢字[紀]の読みは?,き,ぎ,きょ,きょう,1 +529,4年生の漢字[喜]の読みは?,き,きゅう,りょう,きょく,1 +530,4年生の漢字[旗]の読みは?,はた,きゅう,きょう,くん,1 +531,4年生の漢字[器]の読みは?,うつわ,きゅう,きょう,ぐん,1 +532,4年生の漢字[機]の読みは?,き,きゅう,きょう,ぐん,1 +533,4年生の漢字[議]の読みは?,ぎ,きょ,きょう,けい,1 +534,4年生の漢字[求]の読みは?,きゅう,りょう,きょく,けい,1 +535,4年生の漢字[泣]の読みは?,きゅう,きょう,くん,けい,1 +536,4年生の漢字[救]の読みは?,きゅう,きょう,ぐん,げい,1 +537,4年生の漢字[給]の読みは?,きゅう,きょう,ぐん,けつ,1 +538,4年生の漢字[挙]の読みは?,きょ,きょう,けい,けつ,1 +539,4年生の漢字[漁]の読みは?,りょう,きょく,けい,けん,1 +540,4年生の漢字[共]の読みは?,きょう,くん,けい,けん,1 +541,4年生の漢字[協]の読みは?,きょう,ぐん,げい,けん,1 +542,4年生の漢字[鏡]の読みは?,きょう,ぐん,けつ,こ,1 +543,4年生の漢字[竸]の読みは?,きょう,けい,けつ,こう,1 +544,4年生の漢字[極]の読みは?,きょく,けい,けん,こう,1 +545,4年生の漢字[訓]の読みは?,くん,けい,けん,そうろう,1 +546,4年生の漢字[軍]の読みは?,ぐん,げい,けん,こう,1 +547,4年生の漢字[郡]の読みは?,ぐん,けつ,こ,こう,1 +548,4年生の漢字[径]の読みは?,けい,けつ,こう,こく,1 +549,4年生の漢字[型]の読みは?,けい,けん,こう,さ,1 +550,4年生の漢字[景]の読みは?,けい,けん,そうろう,さい,1 +551,4年生の漢字[芸]の読みは?,げい,けん,こう,さい,1 +552,4年生の漢字[欠]の読みは?,けつ,こ,こう,ざい,1 +553,4年生の漢字[結]の読みは?,けつ,こう,こく,さく,1 +554,4年生の漢字[建]の読みは?,けん,こう,さ,さつ,1 +555,4年生の漢字[健]の読みは?,けん,そうろう,さい,さつ,1 +556,4年生の漢字[験]の読みは?,けん,こう,さい,さつ,1 +557,4年生の漢字[固]の読みは?,こ,こう,ざい,さつ,1 +558,4年生の漢字[功]の読みは?,こう,こく,さく,さん,1 +559,4年生の漢字[好]の読みは?,こう,さ,さつ,さん,1 +560,4年生の漢字[候]の読みは?,そうろう,さい,さつ,さん,1 +561,4年生の漢字[航]の読みは?,こう,さい,さつ,ざん,1 +562,4年生の漢字[康]の読みは?,こう,ざい,さつ,し,1 +563,4年生の漢字[告]の読みは?,こく,さく,さん,し,1 +564,4年生の漢字[差]の読みは?,さ,さつ,さん,し,1 +565,4年生の漢字[菜]の読みは?,さい,さつ,さん,し,1 +566,4年生の漢字[最]の読みは?,さい,さつ,ざん,し,1 +567,4年生の漢字[材]の読みは?,ざい,さつ,し,じ,1 +568,4年生の漢字[昨]の読みは?,さく,さん,し,じ,1 +569,4年生の漢字[札]の読みは?,さつ,さん,し,じ,1 +570,4年生の漢字[刷]の読みは?,さつ,さん,し,しつ,1 +571,4年生の漢字[殺]の読みは?,さつ,ざん,し,しゃく,1 +572,4年生の漢字[察]の読みは?,さつ,し,じ,しゅ,1 +573,4年生の漢字[参]の読みは?,さん,し,じ,しゅう,1 +574,4年生の漢字[産]の読みは?,さん,し,じ,しゅく,1 +575,4年生の漢字[散]の読みは?,さん,し,しつ,じゅん,1 +576,4年生の漢字[残]の読みは?,ざん,し,しゃく,しょ,1 +577,4年生の漢字[士]の読みは?,し,じ,しゅ,まつ,1 +578,4年生の漢字[氏]の読みは?,し,じ,しゅう,しょう,1 +579,4年生の漢字[史]の読みは?,し,じ,しゅく,しょう,1 +580,4年生の漢字[司]の読みは?,し,しつ,じゅん,しょう,1 +581,4年生の漢字[試]の読みは?,し,しゃく,しょ,しょう,1 +582,4年生の漢字[児]の読みは?,じ,しゅ,まつ,しょう,1 +583,4年生の漢字[治]の読みは?,じ,しゅう,しょう,しょう,1 +584,4年生の漢字[辞]の読みは?,じ,しゅく,しょう,しん,1 +585,4年生の漢字[失]の読みは?,しつ,じゅん,しょう,しん,1 +586,4年生の漢字[借]の読みは?,しゃく,しょ,しょう,せい,1 +587,4年生の漢字[種]の読みは?,しゅ,まつ,しょう,しょう,1 +588,4年生の漢字[周]の読みは?,しゅう,しょう,しょう,せい,1 +589,4年生の漢字[祝]の読みは?,しゅく,しょう,しん,せい,1 +590,4年生の漢字[順]の読みは?,じゅん,しょう,しん,せき,1 +591,4年生の漢字[初]の読みは?,しょ,しょう,せい,せき,1 +592,4年生の漢字[松]の読みは?,まつ,しょう,しょう,せつ,1 +593,4年生の漢字[笑]の読みは?,しょう,しょう,せい,せつ,1 +594,4年生の漢字[唱]の読みは?,しょう,しん,せい,せつ,1 +595,4年生の漢字[焼]の読みは?,しょう,しん,せき,せん,1 +596,4年生の漢字[象]の読みは?,しょう,せい,せき,せん,1 +597,4年生の漢字[照]の読みは?,しょう,しょう,せつ,せん,1 +598,4年生の漢字[賞]の読みは?,しょう,せい,せつ,ねん,1 +599,4年生の漢字[臣]の読みは?,しん,せい,せつ,そう,1 +600,4年生の漢字[信]の読みは?,しん,せき,せん,そう,1 +601,4年生の漢字[成]の読みは?,せい,せき,せん,す,1 +602,4年生の漢字[省]の読みは?,しょう,せつ,せん,つか,1 +603,4年生の漢字[清]の読みは?,せい,せつ,ねん,がわ,1 +604,4年生の漢字[静]の読みは?,せい,せつ,そう,ぞく,1 +605,4年生の漢字[席]の読みは?,せき,せん,そう,そつ,1 +606,4年生の漢字[積]の読みは?,せき,せん,す,まご,1 +607,4年生の漢字[折]の読みは?,せつ,せん,つか,おび,1 +608,4年生の漢字[節]の読みは?,せつ,ねん,がわ,たい,1 +609,4年生の漢字[説]の読みは?,せつ,そう,ぞく,たち,1 +610,4年生の漢字[浅]の読みは?,せん,そう,そつ,たん,1 +611,4年生の漢字[戦]の読みは?,せん,す,まご,ち,1 +612,4年生の漢字[選]の読みは?,せん,つか,おび,ちゅう,1 +613,4年生の漢字[然]の読みは?,ねん,がわ,たい,ちょ,1 +614,4年生の漢字[争]の読みは?,そう,ぞく,たち,ちょう,1 +615,4年生の漢字[倉]の読みは?,そう,そつ,たん,ちょう,1 +616,4年生の漢字[巣]の読みは?,す,まご,ち,てい,1 +617,4年生の漢字[束]の読みは?,つか,おび,ちゅう,てい,1 +618,4年生の漢字[側]の読みは?,がわ,たい,ちょ,てい,1 +619,4年生の漢字[続]の読みは?,ぞく,たち,ちょう,まと,1 +620,4年生の漢字[卒]の読みは?,そつ,たん,ちょう,てん,1 +621,4年生の漢字[孫]の読みは?,まご,ち,てい,でん,1 +622,4年生の漢字[帯]の読みは?,おび,ちゅう,てい,と,1 +623,4年生の漢字[隊]の読みは?,たい,ちょ,てい,ど,1 +624,4年生の漢字[達]の読みは?,たち,ちょう,まと,とう,1 +625,4年生の漢字[単]の読みは?,たん,ちょう,てん,どう,1 +626,4年生の漢字[置]の読みは?,ち,てい,でん,どう,1 +627,4年生の漢字[仲]の読みは?,ちゅう,てい,と,とく,1 +628,4年生の漢字[貯]の読みは?,ちょ,てい,ど,とく,1 +629,4年生の漢字[兆]の読みは?,ちょう,まと,とう,どく,1 +630,4年生の漢字[腸]の読みは?,ちょう,てん,どう,ねつ,1 +631,4年生の漢字[低]の読みは?,てい,でん,どう,ねん,1 +632,4年生の漢字[底]の読みは?,てい,と,とく,はい,1 +633,4年生の漢字[停]の読みは?,てい,ど,とく,ばい,1 +634,4年生の漢字[的]の読みは?,まと,とう,どく,はく,1 +635,4年生の漢字[典]の読みは?,てん,どう,ねつ,めし,1 +636,4年生の漢字[伝]の読みは?,でん,どう,ねん,ひ,1 +637,4年生の漢字[徒]の読みは?,と,とく,はい,ひ,1 +638,4年生の漢字[努]の読みは?,ど,とく,ばい,ひつ,1 +639,4年生の漢字[灯]の読みは?,とう,どく,はく,ひょう,1 +640,4年生の漢字[堂]の読みは?,どう,ねつ,めし,ひょう,1 +641,4年生の漢字[働]の読みは?,どう,ねん,ひ,ふ,1 +642,4年生の漢字[特]の読みは?,とく,はい,ひ,ふ,1 +643,4年生の漢字[得]の読みは?,とく,ばい,ひつ,ふ,1 +644,4年生の漢字[毒]の読みは?,どく,はく,ひょう,ふ,1 +645,4年生の漢字[熱]の読みは?,ねつ,めし,ひょう,ふく,1 +646,4年生の漢字[念]の読みは?,ねん,ひ,ふ,ふん,1 +647,4年生の漢字[敗]の読みは?,はい,ひ,ふ,へい,1 +648,4年生の漢字[梅]の読みは?,ばい,ひつ,ふ,べつ,1 +649,4年生の漢字[博]の読みは?,はく,ひょう,ふ,へん,1 +650,4年生の漢字[飯]の読みは?,めし,ひょう,ふく,へん,1 +651,4年生の漢字[飛]の読みは?,ひ,ふ,ふん,べん,1 +652,4年生の漢字[費]の読みは?,ひ,ふ,へい,ほう,1 +653,4年生の漢字[必]の読みは?,ひつ,ふ,べつ,ほう,1 +654,4年生の漢字[票]の読みは?,ひょう,ふ,へん,ぼう,1 +655,4年生の漢字[標]の読みは?,ひょう,ふく,へん,ぼく,1 +656,4年生の漢字[不]の読みは?,ふ,ふん,べん,すえ,1 +657,4年生の漢字[夫]の読みは?,ふ,へい,ほう,みつ,1 +658,4年生の漢字[付]の読みは?,ふ,べつ,ほう,み,1 +659,4年生の漢字[府]の読みは?,ふ,へん,ぼう,みゃく,1 +660,4年生の漢字[副]の読みは?,ふく,へん,ぼく,みん,1 +661,4年生の漢字[粉]の読みは?,ふん,べん,すえ,む,1 +662,4年生の漢字[兵]の読みは?,へい,ほう,みつ,やく,1 +663,4年生の漢字[別]の読みは?,べつ,ほう,み,ゆう,1 +664,4年生の漢字[辺]の読みは?,へん,ぼう,みゃく,よう,1 +665,4年生の漢字[変]の読みは?,へん,ぼく,みん,よう,1 +666,4年生の漢字[便]の読みは?,べん,すえ,む,よく,1 +667,4年生の漢字[包]の読みは?,ほう,みつ,やく,り,1 +668,4年生の漢字[法]の読みは?,ほう,み,ゆう,りく,1 +669,4年生の漢字[望]の読みは?,ぼう,みゃく,よう,りょう,1 +670,4年生の漢字[牧]の読みは?,ぼく,みん,よう,りょう,1 +671,4年生の漢字[末]の読みは?,すえ,む,よく,りょう,1 +672,4年生の漢字[満]の読みは?,みつ,やく,り,りん,1 +673,4年生の漢字[未]の読みは?,み,ゆう,りく,るい,1 +674,4年生の漢字[脈]の読みは?,みゃく,よう,りょう,れい,1 +675,4年生の漢字[民]の読みは?,みん,よう,りょう,れい,1 +676,4年生の漢字[無]の読みは?,む,よく,りょう,れい,1 +677,4年生の漢字[約]の読みは?,やく,り,りん,れき,1 +678,4年生の漢字[勇]の読みは?,ゆう,りく,るい,れん,1 +679,4年生の漢字[要]の読みは?,よう,りょう,れい,ろう,1 +680,4年生の漢字[養]の読みは?,よう,りょう,れい,ろう,1 +681,4年生の漢字[浴]の読みは?,よく,りょう,れい,ろく,1 +682,4年生の漢字[利]の読みは?,り,りん,れき,あつ,1 +683,4年生の漢字[陸]の読みは?,りく,るい,れん,い,1 +684,4年生の漢字[良]の読みは?,りょう,れい,ろう,いん,1 +685,4年生の漢字[料]の読みは?,りょう,れい,ろう,えい,1 +686,4年生の漢字[量]の読みは?,りょう,れい,ろく,えい,1 +687,4年生の漢字[輪]の読みは?,りん,れき,あつ,えい,1 +688,4年生の漢字[類]の読みは?,るい,れん,い,えき,1 +689,4年生の漢字[令]の読みは?,れい,ろう,いん,えき,1 +690,4年生の漢字[冷]の読みは?,れい,ろう,えい,えき,1 +691,4年生の漢字[例]の読みは?,れい,ろく,えい,えん,1 +692,4年生の漢字[歴]の読みは?,れき,あつ,えい,おう,1 +693,4年生の漢字[連]の読みは?,れん,い,えき,おう,1 +694,4年生の漢字[老]の読みは?,ろう,いん,えき,さくら,1 +695,4年生の漢字[労]の読みは?,ろう,えい,えき,おん,1 +696,4年生の漢字[録]の読みは?,ろく,えい,えん,か,1 +697,5年生の漢字[圧]の読みは?,あつ,えい,おう,かり,1 +698,5年生の漢字[移]の読みは?,い,えき,おう,か,1 +699,5年生の漢字[因]の読みは?,いん,えき,さくら,かわ,1 +700,5年生の漢字[永]の読みは?,えい,えき,おん,か,1 +701,5年生の漢字[営]の読みは?,えい,えん,か,が,1 +702,5年生の漢字[衞]の読みは?,えい,おう,かり,かい,1 +703,5年生の漢字[易]の読みは?,えき,おう,か,かい,1 +704,5年生の漢字[益]の読みは?,えき,さくら,かわ,かく,1 +705,5年生の漢字[液]の読みは?,えき,おん,か,かく,1 +706,5年生の漢字[演]の読みは?,えん,か,が,がく,1 +707,5年生の漢字[応]の読みは?,おう,かり,かい,かん,1 +708,5年生の漢字[往]の読みは?,おう,か,かい,かん,1 +709,5年生の漢字[桜]の読みは?,さくら,かわ,かく,かん,1 +710,5年生の漢字[恩]の読みは?,おん,か,かく,がん,1 +711,5年生の漢字[可]の読みは?,か,が,がく,もと,1 +712,5年生の漢字[仮]の読みは?,かり,かい,かん,き,1 +713,5年生の漢字[価]の読みは?,か,かい,かん,き,1 +714,5年生の漢字[河]の読みは?,かわ,かく,かん,ぎ,1 +715,5年生の漢字[過]の読みは?,か,かく,がん,ぎ,1 +716,5年生の漢字[賀]の読みは?,が,がく,もと,ぎゃく,1 +717,5年生の漢字[快]の読みは?,かい,かん,き,きゅう,1 +718,5年生の漢字[解]の読みは?,かい,かん,き,きゅう,1 +719,5年生の漢字[格]の読みは?,かく,かん,ぎ,きょ,1 +720,5年生の漢字[確]の読みは?,かく,がん,ぎ,きょ,1 +721,5年生の漢字[額]の読みは?,がく,もと,ぎゃく,きょう,1 +722,5年生の漢字[刊]の読みは?,かん,き,きゅう,きん,1 +723,5年生の漢字[幹]の読みは?,かん,き,きゅう,きん,1 +724,5年生の漢字[慣]の読みは?,かん,ぎ,きょ,く,1 +725,5年生の漢字[眼]の読みは?,がん,ぎ,きょ,ぐん,1 +726,5年生の漢字[基]の読みは?,もと,ぎゃく,きょう,けい,1 +727,5年生の漢字[寄]の読みは?,き,きゅう,きん,けつ,1 +728,5年生の漢字[規]の読みは?,き,きゅう,きん,けん,1 +729,5年生の漢字[技]の読みは?,ぎ,きょ,く,けん,1 +730,5年生の漢字[義]の読みは?,ぎ,きょ,ぐん,けん,1 +731,5年生の漢字[逆]の読みは?,ぎゃく,きょう,けい,けん,1 +732,5年生の漢字[久]の読みは?,きゅう,きん,けつ,げん,1 +733,5年生の漢字[旧]の読みは?,きゅう,きん,けん,げん,1 +734,5年生の漢字[居]の読みは?,きょ,く,けん,げん,1 +735,5年生の漢字[許]の読みは?,きょ,ぐん,けん,ゆえ,1 +736,5年生の漢字[境]の読みは?,きょう,けい,けん,こ,1 +737,5年生の漢字[均]の読みは?,きん,けつ,げん,ご,1 +738,5年生の漢字[禁]の読みは?,きん,けん,げん,こう,1 +739,5年生の漢字[句]の読みは?,く,けん,げん,こう,1 +740,5年生の漢字[群]の読みは?,ぐん,けん,ゆえ,こう,1 +741,5年生の漢字[経]の読みは?,けい,けん,こ,こう,1 +742,5年生の漢字[潔]の読みは?,けつ,げん,ご,こう,1 +743,5年生の漢字[件]の読みは?,けん,げん,こう,こう,1 +744,5年生の漢字[券]の読みは?,けん,げん,こう,こう,1 +745,5年生の漢字[険]の読みは?,けん,ゆえ,こう,こん,1 +746,5年生の漢字[検]の読みは?,けん,こ,こう,さ,1 +747,5年生の漢字[限]の読みは?,げん,ご,こう,さい,1 +748,5年生の漢字[現]の読みは?,げん,こう,こう,さい,1 +749,5年生の漢字[減]の読みは?,げん,こう,こう,さい,1 +750,5年生の漢字[故]の読みは?,ゆえ,こう,こん,さい,1 +751,5年生の漢字[個]の読みは?,こ,こう,さ,ざい,1 +752,5年生の漢字[護]の読みは?,ご,こう,さい,ざい,1 +753,5年生の漢字[効]の読みは?,こう,こう,さい,ざい,1 +754,5年生の漢字[厚]の読みは?,こう,こう,さい,ざつ,1 +755,5年生の漢字[耕]の読みは?,こう,こん,さい,さん,1 +756,5年生の漢字[鉱]の読みは?,こう,さ,ざい,さん,1 +757,5年生の漢字[構]の読みは?,こう,さい,ざい,し,1 +758,5年生の漢字[興]の読みは?,こう,さい,ざい,えだ,1 +759,5年生の漢字[講]の読みは?,こう,さい,ざつ,し,1 +760,5年生の漢字[混]の読みは?,こん,さい,さん,し,1 +761,5年生の漢字[査]の読みは?,さ,ざい,さん,し,1 +762,5年生の漢字[再]の読みは?,さい,ざい,し,じ,1 +763,5年生の漢字[災]の読みは?,さい,ざい,えだ,じ,1 +764,5年生の漢字[妻]の読みは?,さい,ざつ,し,しき,1 +765,5年生の漢字[採]の読みは?,さい,さん,し,しつ,1 +766,5年生の漢字[在]の読みは?,ざい,さん,し,しゃ,1 +767,5年生の漢字[財]の読みは?,ざい,し,じ,しゃ,1 +768,5年生の漢字[罪]の読みは?,ざい,えだ,じ,じゅ,1 +769,5年生の漢字[雑]の読みは?,ざつ,し,しき,しゅう,1 +770,5年生の漢字[酸]の読みは?,さん,し,しつ,じゅつ,1 +771,5年生の漢字[賛]の読みは?,さん,し,しゃ,じゅつ,1 +772,5年生の漢字[志]の読みは?,し,じ,しゃ,じゅん,1 +773,5年生の漢字[枝]の読みは?,えだ,じ,じゅ,じょ,1 +774,5年生の漢字[師]の読みは?,し,しき,しゅう,しょう,1 +775,5年生の漢字[資]の読みは?,し,しつ,じゅつ,しょう,1 +776,5年生の漢字[飼]の読みは?,し,しゃ,じゅつ,しょう,1 +777,5年生の漢字[示]の読みは?,じ,しゃ,じゅん,じょう,1 +778,5年生の漢字[似]の読みは?,じ,じゅ,じょ,じょう,1 +779,5年生の漢字[識]の読みは?,しき,しゅう,しょう,じょう,1 +780,5年生の漢字[質]の読みは?,しつ,じゅつ,しょう,じょう,1 +781,5年生の漢字[舎]の読みは?,しゃ,じゅつ,しょう,しき,1 +782,5年生の漢字[謝]の読みは?,しゃ,じゅん,じょう,しょく,1 +783,5年生の漢字[授]の読みは?,じゅ,じょ,じょう,せい,1 +784,5年生の漢字[修]の読みは?,しゅう,しょう,じょう,せい,1 +785,5年生の漢字[述]の読みは?,じゅつ,しょう,じょう,せい,1 +786,5年生の漢字[術]の読みは?,じゅつ,しょう,しき,せい,1 +787,5年生の漢字[準]の読みは?,じゅん,じょう,しょく,せい,1 +788,5年生の漢字[序]の読みは?,じょ,じょう,せい,せい,1 +789,5年生の漢字[招]の読みは?,しょう,じょう,せい,ぜい,1 +790,5年生の漢字[承]の読みは?,しょう,じょう,せい,せき,1 +791,5年生の漢字[証]の読みは?,しょう,しき,せい,せき,1 +792,5年生の漢字[条]の読みは?,じょう,しょく,せい,せつ,1 +793,5年生の漢字[状]の読みは?,じょう,せい,せい,せつ,1 +794,5年生の漢字[常]の読みは?,じょう,せい,ぜい,ぜつ,1 +795,5年生の漢字[情]の読みは?,じょう,せい,せき,ぜつ,1 +796,5年生の漢字[織]の読みは?,しき,せい,せき,せん,1 +797,5年生の漢字[職]の読みは?,しょく,せい,せつ,そ,1 +798,5年生の漢字[制]の読みは?,せい,せい,せつ,そ,1 +799,5年生の漢字[性]の読みは?,せい,ぜい,ぜつ,そう,1 +800,5年生の漢字[政]の読みは?,せい,せき,ぜつ,ぞう,1 +801,5年生の漢字[勢]の読みは?,せい,せき,せん,ぞう,1 +802,5年生の漢字[精]の読みは?,せい,せつ,そ,ぞう,1 +803,5年生の漢字[製]の読みは?,せい,せつ,そ,そく,1 +804,5年生の漢字[税]の読みは?,ぜい,ぜつ,そう,そく,1 +805,5年生の漢字[責]の読みは?,せき,ぜつ,ぞう,ぞく,1 +806,5年生の漢字[績]の読みは?,せき,せん,ぞう,りつ,1 +807,5年生の漢字[接]の読みは?,せつ,そ,ぞう,そん,1 +808,5年生の漢字[設]の読みは?,せつ,そ,そく,たい,1 +809,5年生の漢字[舌]の読みは?,ぜつ,そう,そく,たい,1 +810,5年生の漢字[絶]の読みは?,ぜつ,ぞう,ぞく,たい,1 +811,5年生の漢字[銭]の読みは?,せん,ぞう,りつ,だん,1 +812,5年生の漢字[祖]の読みは?,そ,ぞう,そん,だん,1 +813,5年生の漢字[素]の読みは?,そ,そく,たい,ちく,1 +814,5年生の漢字[総]の読みは?,そう,そく,たい,ちょう,1 +815,5年生の漢字[造]の読みは?,ぞう,ぞく,たい,てい,1 +816,5年生の漢字[像]の読みは?,ぞう,りつ,だん,てい,1 +817,5年生の漢字[増]の読みは?,ぞう,そん,だん,てき,1 +818,5年生の漢字[則]の読みは?,そく,たい,ちく,てき,1 +819,5年生の漢字[測]の読みは?,そく,たい,ちょう,とう,1 +820,5年生の漢字[属]の読みは?,ぞく,たい,てい,どう,1 +821,5年生の漢字[率]の読みは?,りつ,だん,てい,どう,1 +822,5年生の漢字[損]の読みは?,そん,だん,てき,とく,1 +823,5年生の漢字[退]の読みは?,たい,ちく,てき,どく,1 +824,5年生の漢字[貸]の読みは?,たい,ちょう,とう,にん,1 +825,5年生の漢字[態]の読みは?,たい,てい,どう,ねん,1 +826,5年生の漢字[団]の読みは?,だん,てい,どう,のう,1 +827,5年生の漢字[断]の読みは?,だん,てき,とく,は,1 +828,5年生の漢字[築]の読みは?,ちく,てき,どく,はん,1 +829,5年生の漢字[張]の読みは?,ちょう,とう,にん,はん,1 +830,5年生の漢字[堤]の読みは?,てい,どう,ねん,はん,1 +831,5年生の漢字[程]の読みは?,てい,どう,のう,ひ,1 +832,5年生の漢字[適]の読みは?,てき,とく,は,ひ,1 +833,5年生の漢字[敵]の読みは?,てき,どく,はん,ひ,1 +834,5年生の漢字[統]の読みは?,とう,にん,はん,び,1 +835,5年生の漢字[銅]の読みは?,どう,ねん,はん,びょう,1 +836,5年生の漢字[導]の読みは?,どう,のう,ひ,ひょう,1 +837,5年生の漢字[徳]の読みは?,とく,は,ひ,ひん,1 +838,5年生の漢字[独]の読みは?,どく,はん,ひ,ふ,1 +839,5年生の漢字[任]の読みは?,にん,はん,び,ふ,1 +840,5年生の漢字[燃]の読みは?,ねん,はん,びょう,とみ,1 +841,5年生の漢字[能]の読みは?,のう,ひ,ひょう,ぶ,1 +842,5年生の漢字[破]の読みは?,は,ひ,ひん,ふく,1 +843,5年生の漢字[犯]の読みは?,はん,ひ,ふ,ふく,1 +844,5年生の漢字[判]の読みは?,はん,び,ふ,ぶつ,1 +845,5年生の漢字[版]の読みは?,はん,びょう,とみ,へん,1 +846,5年生の漢字[比]の読みは?,ひ,ひょう,ぶ,べん,1 +847,5年生の漢字[肥]の読みは?,ひ,ひん,ふく,ほ,1 +848,5年生の漢字[非]の読みは?,ひ,ふ,ふく,はか,1 +849,5年生の漢字[備]の読みは?,び,ふ,ぶつ,ほう,1 +850,5年生の漢字[俵]の読みは?,びょう,とみ,へん,ほう,1 +851,5年生の漢字[評]の読みは?,ひょう,ぶ,べん,ぼう,1 +852,5年生の漢字[貧]の読みは?,ひん,ふく,ほ,ぼう,1 +853,5年生の漢字[布]の読みは?,ふ,ふく,はか,ぼう,1 +854,5年生の漢字[婦]の読みは?,ふ,ぶつ,ほう,む,1 +855,5年生の漢字[富]の読みは?,とみ,へん,ほう,む,1 +856,5年生の漢字[武]の読みは?,ぶ,べん,ぼう,めい,1 +857,5年生の漢字[復]の読みは?,ふく,ほ,ぼう,めん,1 +858,5年生の漢字[複]の読みは?,ふく,はか,ぼう,ゆ,1 +859,5年生の漢字[仏]の読みは?,ぶつ,ほう,む,よ,1 +860,5年生の漢字[編]の読みは?,へん,ほう,む,よ,1 +861,5年生の漢字[弁]の読みは?,べん,ぼう,めい,よう,1 +862,5年生の漢字[保]の読みは?,ほ,ぼう,めん,りゃく,1 +863,5年生の漢字[墓]の読みは?,はか,ぼう,ゆ,りゅう,1 +864,5年生の漢字[報]の読みは?,ほう,む,よ,りょう,1 +865,5年生の漢字[豊]の読みは?,ほう,む,よ,い,1 +866,5年生の漢字[防]の読みは?,ぼう,めい,よう,い,1 +867,5年生の漢字[貿]の読みは?,ぼう,めん,りゃく,いき,1 +868,5年生の漢字[暴]の読みは?,ぼう,ゆ,りゅう,う,1 +869,5年生の漢字[務]の読みは?,む,よ,りょう,えい,1 +870,5年生の漢字[夢]の読みは?,む,よ,い,えん,1 +871,5年生の漢字[迷]の読みは?,めい,よう,い,えん,1 +872,5年生の漢字[綿]の読みは?,めん,りゃく,いき,が,1 +873,5年生の漢字[輸]の読みは?,ゆ,りゅう,う,はい,1 +874,5年生の漢字[余]の読みは?,よ,りょう,えい,かく,1 +875,5年生の漢字[預]の読みは?,よ,い,えん,かく,1 +876,5年生の漢字[容]の読みは?,よう,い,えん,かく,1 +877,5年生の漢字[略]の読みは?,りゃく,いき,が,かつ,1 +878,5年生の漢字[留]の読みは?,りゅう,う,はい,かぶ,1 +879,5年生の漢字[領]の読みは?,りょう,えい,かく,かん,1 +880,6年生の漢字[異]の読みは?,い,えん,かく,かん,1 +881,6年生の漢字[遺]の読みは?,い,えん,かく,かん,1 +882,6年生の漢字[域]の読みは?,いき,が,かつ,かん,1 +883,6年生の漢字[宇]の読みは?,う,はい,かぶ,き,1 +884,6年生の漢字[映]の読みは?,えい,かく,かん,き,1 +885,6年生の漢字[延]の読みは?,えん,かく,かん,き,1 +886,6年生の漢字[沿]の読みは?,えん,かく,かん,き,1 +887,6年生の漢字[我]の読みは?,が,かつ,かん,ぎ,1 +888,6年生の漢字[灰]の読みは?,はい,かぶ,き,きゅう,1 +889,6年生の漢字[拡]の読みは?,かく,かん,き,きょう,1 +890,6年生の漢字[革]の読みは?,かく,かん,き,きょう,1 +891,6年生の漢字[閣]の読みは?,かく,かん,き,きょう,1 +892,6年生の漢字[割]の読みは?,かつ,かん,ぎ,きん,1 +893,6年生の漢字[株]の読みは?,かぶ,き,きゅう,きん,1 +894,6年生の漢字[干]の読みは?,かん,き,きょう,けい,1 +895,6年生の漢字[巻]の読みは?,かん,き,きょう,けい,1 +896,6年生の漢字[看]の読みは?,かん,き,きょう,けい,1 +897,6年生の漢字[簡]の読みは?,かん,ぎ,きん,げき,1 +898,6年生の漢字[危]の読みは?,き,きゅう,きん,げき,1 +899,6年生の漢字[机]の読みは?,き,きょう,けい,あな,1 +900,6年生の漢字[揮]の読みは?,き,きょう,けい,きぬ,1 +901,6年生の漢字[貴]の読みは?,き,きょう,けい,けん,1 +902,6年生の漢字[疑]の読みは?,ぎ,きん,げき,けん,1 +903,6年生の漢字[吸]の読みは?,きゅう,きん,げき,げん,1 +904,6年生の漢字[供]の読みは?,きょう,けい,あな,げん,1 +905,6年生の漢字[胸]の読みは?,きょう,けい,きぬ,こ,1 +906,6年生の漢字[郷]の読みは?,きょう,けい,けん,こ,1 +907,6年生の漢字[勤]の読みは?,きん,げき,けん,ご,1 +908,6年生の漢字[筋]の読みは?,きん,げき,げん,ごう,1 +909,6年生の漢字[系]の読みは?,けい,あな,げん,こう,1 +910,6年生の漢字[敬]の読みは?,けい,きぬ,こ,こう,1 +911,6年生の漢字[警]の読みは?,けい,けん,こ,こう,1 +912,6年生の漢字[劇]の読みは?,げき,けん,ご,こう,1 +913,6年生の漢字[激]の読みは?,げき,げん,ごう,こう,1 +914,6年生の漢字[穴]の読みは?,あな,げん,こう,こく,1 +915,6年生の漢字[絹]の読みは?,きぬ,こ,こう,こく,1 +916,6年生の漢字[権]の読みは?,けん,こ,こう,こつ,1 +917,6年生の漢字[憲]の読みは?,けん,ご,こう,こん,1 +918,6年生の漢字[源]の読みは?,げん,ごう,こう,さ,1 +919,6年生の漢字[厳]の読みは?,げん,こう,こく,ざ,1 +920,6年生の漢字[己]の読みは?,こ,こう,こく,さい,1 +921,6年生の漢字[呼]の読みは?,こ,こう,こつ,さい,1 +922,6年生の漢字[誤]の読みは?,ご,こう,こん,さく,1 +923,6年生の漢字[后]の読みは?,ごう,こう,さ,さつ,1 +924,6年生の漢字[考]の読みは?,こう,こく,ざ,かいこ,1 +925,6年生の漢字[皇]の読みは?,こう,こく,さい,し,1 +926,6年生の漢字[紅]の読みは?,こう,こつ,さい,し,1 +927,6年生の漢字[降]の読みは?,こう,こん,さく,し,1 +928,6年生の漢字[鋼]の読みは?,こう,さ,さつ,し,1 +929,6年生の漢字[刻]の読みは?,こく,ざ,かいこ,し,1 +930,6年生の漢字[穀]の読みは?,こく,さい,し,し,1 +931,6年生の漢字[骨]の読みは?,こつ,さい,し,じ,1 +932,6年生の漢字[困]の読みは?,こん,さく,し,しゃ,1 +933,6年生の漢字[砂]の読みは?,さ,さつ,し,しゃ,1 +934,6年生の漢字[座]の読みは?,ざ,かいこ,し,しゃく,1 +935,6年生の漢字[済]の読みは?,さい,し,し,じゃく,1 +936,6年生の漢字[裁]の読みは?,さい,し,じ,じゅ,1 +937,6年生の漢字[策]の読みは?,さく,し,しゃ,しゅう,1 +938,6年生の漢字[冊]の読みは?,さつ,し,しゃ,しゅう,1 +939,6年生の漢字[蚕]の読みは?,かいこ,し,しゃく,しゅう,1 +940,6年生の漢字[至]の読みは?,し,し,じゃく,しゅう,1 +941,6年生の漢字[私]の読みは?,し,じ,じゅ,じゅう,1 +942,6年生の漢字[姿]の読みは?,し,しゃ,しゅう,じゅう,1 +943,6年生の漢字[視]の読みは?,し,しゃ,しゅう,しゅく,1 +944,6年生の漢字[詞]の読みは?,し,しゃく,しゅう,じゅく,1 +945,6年生の漢字[誌]の読みは?,し,じゃく,しゅう,じゅん,1 +946,6年生の漢字[磁]の読みは?,じ,じゅ,じゅう,ところ,1 +947,6年生の漢字[射]の読みは?,しゃ,しゅう,じゅう,しょ,1 +948,6年生の漢字[捨]の読みは?,しゃ,しゅう,しゅく,しょ,1 +949,6年生の漢字[尺]の読みは?,しゃく,しゅう,じゅく,じょ,1 +950,6年生の漢字[若]の読みは?,じゃく,しゅう,じゅん,しょう,1 +951,6年生の漢字[樹]の読みは?,じゅ,じゅう,ところ,しょう,1 +952,6年生の漢字[収]の読みは?,しゅう,じゅう,しょ,しょう,1 +953,6年生の漢字[宗]の読みは?,しゅう,しゅく,しょ,じょう,1 +954,6年生の漢字[就]の読みは?,しゅう,じゅく,じょ,じょう,1 +955,6年生の漢字[衆]の読みは?,しゅう,じゅん,しょう,しん,1 +956,6年生の漢字[従]の読みは?,じゅう,ところ,しょう,じん,1 +957,6年生の漢字[縦]の読みは?,じゅう,しょ,しょう,すい,1 +958,6年生の漢字[縮]の読みは?,しゅく,しょ,じょう,すい,1 +959,6年生の漢字[熟]の読みは?,じゅく,じょ,じょう,すん,1 +960,6年生の漢字[純]の読みは?,じゅん,しょう,しん,せい,1 +961,6年生の漢字[処]の読みは?,ところ,しょう,じん,せい,1 +962,6年生の漢字[署]の読みは?,しょ,しょう,すい,せい,1 +963,6年生の漢字[諸]の読みは?,しょ,じょう,すい,せん,1 +964,6年生の漢字[除]の読みは?,じょ,じょう,すん,せん,1 +965,6年生の漢字[将]の読みは?,しょう,しん,せい,せん,1 +966,6年生の漢字[傷]の読みは?,しょう,じん,せい,せん,1 +967,6年生の漢字[障]の読みは?,しょう,すい,せい,せん,1 +968,6年生の漢字[城]の読みは?,じょう,すい,せん,ぜん,1 +969,6年生の漢字[蒸]の読みは?,じょう,すん,せん,そう,1 +970,6年生の漢字[針]の読みは?,しん,せい,せん,まど,1 +971,6年生の漢字[仁]の読みは?,じん,せい,せん,そう,1 +972,6年生の漢字[垂]の読みは?,すい,せい,せん,そう,1 +973,6年生の漢字[推]の読みは?,すい,せん,ぜん,そう,1 +974,6年生の漢字[寸]の読みは?,すん,せん,そう,そう,1 +975,6年生の漢字[盛]の読みは?,せい,せん,まど,ぞう,1 +976,6年生の漢字[聖]の読みは?,せい,せん,そう,ぞう,1 +977,6年生の漢字[誠]の読みは?,せい,せん,そう,ぞん,1 +978,6年生の漢字[宣]の読みは?,せん,ぜん,そう,そん,1 +979,6年生の漢字[専]の読みは?,せん,そう,そう,たく,1 +980,6年生の漢字[泉]の読みは?,せん,まど,ぞう,たん,1 +981,6年生の漢字[洗]の読みは?,せん,そう,ぞう,たん,1 +982,6年生の漢字[染]の読みは?,せん,そう,ぞん,たん,1 +983,6年生の漢字[善]の読みは?,ぜん,そう,そん,だん,1 +984,6年生の漢字[奏]の読みは?,そう,そう,たく,だん,1 +985,6年生の漢字[窓]の読みは?,まど,ぞう,たん,ち,1 +986,6年生の漢字[創]の読みは?,そう,ぞう,たん,ちゅう,1 +987,6年生の漢字[装]の読みは?,そう,ぞん,たん,ちゅう,1 +988,6年生の漢字[層]の読みは?,そう,そん,だん,ちょ,1 +989,6年生の漢字[操]の読みは?,そう,たく,だん,ちょう,1 +990,6年生の漢字[蔵]の読みは?,ぞう,たん,ち,ちょう,1 +991,6年生の漢字[臓]の読みは?,ぞう,たん,ちゅう,しお,1 +992,6年生の漢字[存]の読みは?,ぞん,たん,ちゅう,ちん,1 +993,6年生の漢字[尊]の読みは?,そん,だん,ちょ,つう,1 +994,6年生の漢字[宅]の読みは?,たく,だん,ちょう,てん,1 +995,6年生の漢字[担]の読みは?,たん,ち,ちょう,とう,1 +996,6年生の漢字[探]の読みは?,たん,ちゅう,しお,とう,1 +997,6年生の漢字[誕]の読みは?,たん,ちゅう,ちん,とう,1 +998,6年生の漢字[段]の読みは?,だん,ちょ,つう,かい,1 +999,6年生の漢字[暖]の読みは?,だん,ちょう,てん,なん,1 +1000,6年生の漢字[値]の読みは?,ち,ちょう,とう,にゅう,1 +1001,6年生の漢字[宙]の読みは?,ちゅう,しお,とう,にん,1 +1002,6年生の漢字[忠]の読みは?,ちゅう,ちん,とう,のう,1 +1003,6年生の漢字[著]の読みは?,ちょ,つう,かい,のう,1 +1004,6年生の漢字[庁]の読みは?,ちょう,てん,なん,は,1 +1005,6年生の漢字[頂]の読みは?,ちょう,とう,にゅう,はい,1 +1006,6年生の漢字[潮]の読みは?,しお,とう,にん,はい,1 +1007,6年生の漢字[賃]の読みは?,ちん,とう,のう,はい,1 +1008,6年生の漢字[痛]の読みは?,つう,かい,のう,はい,1 +1009,6年生の漢字[展]の読みは?,てん,なん,は,はん,1 +1010,6年生の漢字[討]の読みは?,とう,にゅう,はい,ばん,1 +1011,6年生の漢字[党]の読みは?,とう,にん,はい,いな,1 +1012,6年生の漢字[糖]の読みは?,とう,のう,はい,ひ,1 +1013,6年生の漢字[届]の読みは?,かい,のう,はい,ひ,1 +1014,6年生の漢字[難]の読みは?,なん,は,はん,ふく,1 +1015,6年生の漢字[乳]の読みは?,にゅう,はい,ばん,ふん,1 +1016,6年生の漢字[認]の読みは?,にん,はい,いな,なみ,1 +1017,6年生の漢字[納]の読みは?,のう,はい,ひ,へい,1 +1018,6年生の漢字[脳]の読みは?,のう,はい,ひ,へい,1 +1019,6年生の漢字[派]の読みは?,は,はん,ふく,へん,1 +1020,6年生の漢字[拝]の読みは?,はい,ばん,ふん,ほ,1 +1021,6年生の漢字[背]の読みは?,はい,いな,なみ,ぼ,1 +1022,6年生の漢字[肺]の読みは?,はい,ひ,へい,ほう,1 +1023,6年生の漢字[俳]の読みは?,はい,ひ,へい,ほう,1 +1024,6年生の漢字[班]の読みは?,はん,ふく,へん,ぼう,1 +1025,6年生の漢字[晩]の読みは?,ばん,ふん,ほ,ぼう,1 +1026,6年生の漢字[否]の読みは?,いな,なみ,ぼ,ぼう,1 +1027,6年生の漢字[批]の読みは?,ひ,へい,ほう,まい,1 +1028,6年生の漢字[秘]の読みは?,ひ,へい,ほう,まく,1 +1029,6年生の漢字[腹]の読みは?,ふく,へん,ぼう,みつ,1 +1030,6年生の漢字[奮]の読みは?,ふん,はい,にゅう,とう,1 +1031,6年生の漢字[並]の読みは?,なみ,はい,にん,とう,1 +1032,6年生の漢字[陛]の読みは?,へい,はい,のう,とう,1 +1033,6年生の漢字[閉]の読みは?,へい,はい,のう,かい,1 +1034,6年生の漢字[片]の読みは?,へん,はん,は,なん,1 +1035,6年生の漢字[補]の読みは?,ほ,ばん,はい,にゅう,1 +1036,6年生の漢字[暮]の読みは?,ぼ,いな,はい,にん,1 +1037,6年生の漢字[宝]の読みは?,ほう,ひ,はい,のう,1 +1038,6年生の漢字[訪]の読みは?,ほう,ひ,はい,のう,1 +1039,6年生の漢字[亡]の読みは?,ぼう,ふく,はん,は,1 +1040,6年生の漢字[忘]の読みは?,ぼう,ふん,ばん,はい,1 +1041,6年生の漢字[棒]の読みは?,ぼう,なみ,いな,はい,1 +1042,6年生の漢字[枚]の読みは?,まい,へい,ひ,はい,1 +1043,6年生の漢字[幕]の読みは?,まく,へい,ひ,はい,1 +1044,6年生の漢字[密]の読みは?,みつ,へん,ふく,はん,1 +1045,6年生の漢字[盟]の読みは?,めい,ほ,ふん,ばん,1 +1046,6年生の漢字[模]の読みは?,も,ぼ,なみ,いな,1 +1047,6年生の漢字[訳]の読みは?,やく,ほう,へい,ひ,1 +1048,6年生の漢字[郵]の読みは?,ゆう,ほう,へい,ひ,1 +1049,6年生の漢字[優]の読みは?,ゆう,ぼう,へん,ふく,1 +1050,6年生の漢字[幼]の読みは?,よう,ぼう,ほ,ふん,1 +1051,6年生の漢字[欲]の読みは?,よく,ぼう,ぼ,なみ,1 +1052,6年生の漢字[翌]の読みは?,よく,まい,ほう,へい,1 +1053,6年生の漢字[乱]の読みは?,らん,まく,ほう,へい,1 +1054,6年生の漢字[卵]の読みは?,らん,みつ,ぼう,へん,1 +1055,6年生の漢字[覧]の読みは?,らん,めい,ぼう,ほ,1 +1056,6年生の漢字[裏]の読みは?,うら,も,ぼう,ぼ,1 +1057,6年生の漢字[律]の読みは?,りつ,やく,まい,ほう,1 +1058,6年生の漢字[臨]の読みは?,りん,ゆう,まく,ほう,1 +1059,6年生の漢字[朗]の読みは?,ろう,ゆう,みつ,ぼう,1 +1060,6年生の漢字[論]の読みは?,ろん,よう,めい,ぼう,1 +1061,1年生の漢字で[こ]と読むのは?,子,王,気,空,1 +1062,1年生の漢字で[いち]と読むのは?,一,音,九,月,1 +1063,1年生の漢字で[みぎ]と読むのは?,右,下,休,犬,1 +1064,1年生の漢字で[あめ]と読むのは?,雨,花,玉,見,1 +1065,1年生の漢字で[えん]と読むのは?,円,学,金,五,1 +1066,1年生の漢字で[おう]と読むのは?,王,気,空,口,1 +1067,1年生の漢字で[おと]と読むのは?,音,九,月,校,1 +1068,1年生の漢字で[した]と読むのは?,下,休,犬,左,1 +1069,1年生の漢字で[はな]と読むのは?,花,玉,見,三,1 +1070,1年生の漢字で[がく]と読むのは?,学,金,五,山,1 +1071,1年生の漢字で[き]と読むのは?,気,空,口,四,1 +1072,1年生の漢字で[きゅう]と読むのは?,九,月,校,糸,1 +1073,1年生の漢字で[きゅう]と読むのは?,休,犬,左,字,1 +1074,1年生の漢字で[たま]と読むのは?,玉,見,三,耳,1 +1075,1年生の漢字で[きん]と読むのは?,金,五,山,七,1 +1076,1年生の漢字で[そら]と読むのは?,空,口,四,車,1 +1077,1年生の漢字で[つき]と読むのは?,月,校,糸,手,1 +1078,1年生の漢字で[いぬ]と読むのは?,犬,左,字,十,1 +1079,1年生の漢字で[けん]と読むのは?,見,三,耳,出,1 +1080,1年生の漢字で[ご]と読むのは?,五,山,七,女,1 +1081,1年生の漢字で[くち]と読むのは?,口,四,車,小,1 +1082,1年生の漢字で[こう]と読むのは?,校,糸,手,上,1 +1083,1年生の漢字で[ひだり]と読むのは?,左,字,十,森,1 +1084,1年生の漢字で[さん]と読むのは?,三,耳,出,人,1 +1085,1年生の漢字で[やま]と読むのは?,山,七,女,水,1 +1086,1年生の漢字で[よん]と読むのは?,四,車,小,正,1 +1087,1年生の漢字で[いと]と読むのは?,糸,手,上,生,1 +1088,1年生の漢字で[じ]と読むのは?,字,十,森,青,1 +1089,1年生の漢字で[みみ]と読むのは?,耳,出,人,夕,1 +1090,1年生の漢字で[なな]と読むのは?,七,女,水,石,1 +1091,1年生の漢字で[くるま]と読むのは?,車,小,正,赤,1 +1092,1年生の漢字で[て]と読むのは?,手,上,生,千,1 +1093,1年生の漢字で[じゅう]と読むのは?,十,森,青,川,1 +1094,1年生の漢字で[しゅつ]と読むのは?,出,人,夕,先,1 +1095,1年生の漢字で[おんな]と読むのは?,女,水,石,早,1 +1096,1年生の漢字で[しょう]と読むのは?,小,正,赤,草,1 +1097,1年生の漢字で[うえ]と読むのは?,上,生,千,足,1 +1098,1年生の漢字で[もり]と読むのは?,森,青,川,村,1 +1099,1年生の漢字で[ひと]と読むのは?,人,夕,先,大,1 +1100,1年生の漢字で[みず]と読むのは?,水,石,早,男,1 +1101,1年生の漢字で[しょう]と読むのは?,正,赤,草,竹,1 +1102,1年生の漢字で[しょう]と読むのは?,生,千,足,中,1 +1103,1年生の漢字で[あお]と読むのは?,青,川,村,虫,1 +1104,1年生の漢字で[ゆう]と読むのは?,夕,先,大,町,1 +1105,1年生の漢字で[いし]と読むのは?,石,早,男,天,1 +1106,1年生の漢字で[あか]と読むのは?,赤,草,竹,田,1 +1107,1年生の漢字で[せん]と読むのは?,千,足,中,土,1 +1108,1年生の漢字で[かわ]と読むのは?,川,村,虫,二,1 +1109,1年生の漢字で[さき]と読むのは?,先,大,町,日,1 +1110,1年生の漢字で[そう]と読むのは?,早,男,天,入,1 +1111,1年生の漢字で[そう]と読むのは?,草,竹,田,年,1 +1112,1年生の漢字で[あし]と読むのは?,足,中,土,白,1 +1113,1年生の漢字で[むら]と読むのは?,村,虫,二,八,1 +1114,1年生の漢字で[だい]と読むのは?,大,町,日,百,1 +1115,1年生の漢字で[おとこ]と読むのは?,男,天,入,文,1 +1116,1年生の漢字で[たけ]と読むのは?,竹,田,年,木,1 +1117,1年生の漢字で[ちゅう]と読むのは?,中,土,白,本,1 +1118,1年生の漢字で[むし]と読むのは?,虫,二,八,名,1 +1119,1年生の漢字で[まち]と読むのは?,町,日,百,目,1 +1120,1年生の漢字で[てん]と読むのは?,天,入,文,立,1 +1121,1年生の漢字で[た]と読むのは?,田,年,木,力,1 +1122,1年生の漢字で[つち]と読むのは?,土,白,本,林,1 +1123,1年生の漢字で[に]と読むのは?,二,八,名,六,1 +1124,1年生の漢字で[にち]と読むのは?,日,百,目,引,1 +1125,1年生の漢字で[にゅう]と読むのは?,入,文,立,羽,1 +1126,1年生の漢字で[とし]と読むのは?,年,木,力,雲,1 +1127,1年生の漢字で[しろ]と読むのは?,白,本,林,園,1 +1128,1年生の漢字で[はち]と読むのは?,八,名,六,遠,1 +1129,1年生の漢字で[ひゃく]と読むのは?,百,目,引,何,1 +1130,1年生の漢字で[ぶん]と読むのは?,文,立,羽,科,1 +1131,1年生の漢字で[き]と読むのは?,木,力,雲,夏,1 +1132,1年生の漢字で[ほん]と読むのは?,本,林,園,家,1 +1133,1年生の漢字で[めい]と読むのは?,名,六,遠,歌,1 +1134,1年生の漢字で[め]と読むのは?,目,引,何,画,1 +1135,1年生の漢字で[りつ]と読むのは?,立,羽,科,回,1 +1136,1年生の漢字で[ちから]と読むのは?,力,雲,夏,会,1 +1137,1年生の漢字で[はやし]と読むのは?,林,園,家,海,1 +1138,1年生の漢字で[ろく]と読むのは?,六,遠,歌,絵,1 +1139,2年生の漢字で[いん]と読むのは?,引,何,画,外,1 +1140,2年生の漢字で[はね]と読むのは?,羽,科,回,角,1 +1141,2年生の漢字で[くも]と読むのは?,雲,夏,会,楽,1 +1142,2年生の漢字で[えん]と読むのは?,園,家,海,活,1 +1143,2年生の漢字で[えん]と読むのは?,遠,歌,絵,間,1 +1144,2年生の漢字で[なに]と読むのは?,何,画,外,岩,1 +1145,2年生の漢字で[か]と読むのは?,科,回,角,顔,1 +1146,2年生の漢字で[なつ]と読むのは?,夏,会,楽,汽,1 +1147,2年生の漢字で[いえ]と読むのは?,家,海,活,記,1 +1148,2年生の漢字で[うた]と読むのは?,歌,絵,間,帰,1 +1149,2年生の漢字で[が]と読むのは?,画,外,岩,弓,1 +1150,2年生の漢字で[かい]と読むのは?,回,角,顔,牛,1 +1151,2年生の漢字で[かい]と読むのは?,会,楽,汽,魚,1 +1152,2年生の漢字で[うみ]と読むのは?,海,活,記,京,1 +1153,2年生の漢字で[え]と読むのは?,絵,間,帰,強,1 +1154,2年生の漢字で[そと]と読むのは?,外,岩,弓,教,1 +1155,2年生の漢字で[かく]と読むのは?,角,顔,牛,近,1 +1156,2年生の漢字で[らく]と読むのは?,楽,汽,魚,兄,1 +1157,2年生の漢字で[かつ]と読むのは?,活,記,京,形,1 +1158,2年生の漢字で[あいだ]と読むのは?,間,帰,強,計,1 +1159,2年生の漢字で[いわ]と読むのは?,岩,弓,教,元,1 +1160,2年生の漢字で[かお]と読むのは?,顔,牛,近,言,1 +1161,2年生の漢字で[き]と読むのは?,汽,魚,兄,原,1 +1162,2年生の漢字で[き]と読むのは?,記,京,形,戸,1 +1163,2年生の漢字で[き]と読むのは?,帰,強,計,古,1 +1164,2年生の漢字で[ゆみ]と読むのは?,弓,教,元,牛,1 +1165,2年生の漢字で[うし]と読むのは?,牛,近,言,後,1 +1166,2年生の漢字で[さかな]と読むのは?,魚,兄,原,語,1 +1167,2年生の漢字で[けい]と読むのは?,京,形,戸,工,1 +1168,2年生の漢字で[きょう]と読むのは?,強,計,古,公,1 +1169,2年生の漢字で[きょう]と読むのは?,教,元,牛,広,1 +1170,2年生の漢字で[きん]と読むのは?,近,言,後,交,1 +1171,2年生の漢字で[あに]と読むのは?,兄,原,語,光,1 +1172,2年生の漢字で[かたち]と読むのは?,形,戸,工,考,1 +1173,2年生の漢字で[けい]と読むのは?,計,古,公,行,1 +1174,2年生の漢字で[もと]と読むのは?,元,牛,広,高,1 +1175,2年生の漢字で[げん]と読むのは?,言,後,交,黄,1 +1176,2年生の漢字で[げん]と読むのは?,原,語,光,合,1 +1177,2年生の漢字で[と]と読むのは?,戸,工,考,谷,1 +1178,2年生の漢字で[こ]と読むのは?,古,公,行,国,1 +1179,2年生の漢字で[うし]と読むのは?,牛,広,高,黒,1 +1180,2年生の漢字で[あと]と読むのは?,後,交,黄,今,1 +1181,2年生の漢字で[ご]と読むのは?,語,光,合,才,1 +1182,2年生の漢字で[こう]と読むのは?,工,考,谷,細,1 +1183,2年生の漢字で[こう]と読むのは?,公,行,国,作,1 +1184,2年生の漢字で[こう]と読むのは?,広,高,黒,算,1 +1185,2年生の漢字で[こう]と読むのは?,交,黄,今,止,1 +1186,2年生の漢字で[ひかり]と読むのは?,光,合,才,市,1 +1187,2年生の漢字で[こう]と読むのは?,考,谷,細,矢,1 +1188,2年生の漢字で[ぎょう]と読むのは?,行,国,作,姉,1 +1189,2年生の漢字で[こう]と読むのは?,高,黒,算,思,1 +1190,2年生の漢字で[き]と読むのは?,黄,今,止,紙,1 +1191,2年生の漢字で[ごう]と読むのは?,合,才,市,寺,1 +1192,2年生の漢字で[たに]と読むのは?,谷,細,矢,自,1 +1193,2年生の漢字で[くに]と読むのは?,国,作,姉,時,1 +1194,2年生の漢字で[くろ]と読むのは?,黒,算,思,室,1 +1195,2年生の漢字で[いま]と読むのは?,今,止,紙,社,1 +1196,2年生の漢字で[さい]と読むのは?,才,市,寺,弱,1 +1197,2年生の漢字で[さい]と読むのは?,細,矢,自,首,1 +1198,2年生の漢字で[さく]と読むのは?,作,姉,時,秋,1 +1199,2年生の漢字で[さん]と読むのは?,算,思,室,週,1 +1200,2年生の漢字で[し]と読むのは?,止,紙,社,春,1 +1201,2年生の漢字で[し]と読むのは?,市,寺,弱,書,1 +1202,2年生の漢字で[や]と読むのは?,矢,自,首,少,1 +1203,2年生の漢字で[あね]と読むのは?,姉,時,秋,場,1 +1204,2年生の漢字で[し]と読むのは?,思,室,週,色,1 +1205,2年生の漢字で[かみ]と読むのは?,紙,社,春,心,1 +1206,2年生の漢字で[てら]と読むのは?,寺,弱,書,食,1 +1207,2年生の漢字で[じ]と読むのは?,自,首,少,新,1 +1208,2年生の漢字で[じ]と読むのは?,時,秋,場,親,1 +1209,2年生の漢字で[しつ]と読むのは?,室,週,色,図,1 +1210,2年生の漢字で[しゃ]と読むのは?,社,春,心,数,1 +1211,2年生の漢字で[じゃく]と読むのは?,弱,書,食,西,1 +1212,2年生の漢字で[くび]と読むのは?,首,少,新,声,1 +1213,2年生の漢字で[あき]と読むのは?,秋,場,親,星,1 +1214,2年生の漢字で[しゅう]と読むのは?,週,色,図,晴,1 +1215,2年生の漢字で[はる]と読むのは?,春,心,数,切,1 +1216,2年生の漢字で[しょ]と読むのは?,書,食,西,雪,1 +1217,2年生の漢字で[しょう]と読むのは?,少,新,声,船,1 +1218,2年生の漢字で[ば]と読むのは?,場,親,星,線,1 +1219,2年生の漢字で[いろ]と読むのは?,色,図,晴,前,1 +1220,2年生の漢字で[こころ]と読むのは?,心,数,切,組,1 +1221,2年生の漢字で[しょく]と読むのは?,食,西,雪,走,1 +1222,2年生の漢字で[しん]と読むのは?,新,声,船,多,1 +1223,2年生の漢字で[おや]と読むのは?,親,星,線,太,1 +1224,2年生の漢字で[ず]と読むのは?,図,晴,前,体,1 +1225,2年生の漢字で[かず]と読むのは?,数,切,組,台,1 +1226,2年生の漢字で[にし]と読むのは?,西,雪,走,地,1 +1227,2年生の漢字で[こえ]と読むのは?,声,船,多,池,1 +1228,2年生の漢字で[ほし]と読むのは?,星,線,太,知,1 +1229,2年生の漢字で[はれ]と読むのは?,晴,前,体,茶,1 +1230,2年生の漢字で[せつ]と読むのは?,切,組,台,昼,1 +1231,2年生の漢字で[ゆき]と読むのは?,雪,走,地,長,1 +1232,2年生の漢字で[ふね]と読むのは?,船,多,池,鳥,1 +1233,2年生の漢字で[せん]と読むのは?,線,太,知,朝,1 +1234,2年生の漢字で[まえ]と読むのは?,前,体,茶,直,1 +1235,2年生の漢字で[くみ]と読むのは?,組,台,昼,通,1 +1236,2年生の漢字で[そう]と読むのは?,走,地,長,弟,1 +1237,2年生の漢字で[た]と読むのは?,多,池,鳥,店,1 +1238,2年生の漢字で[た]と読むのは?,太,知,朝,点,1 +1239,2年生の漢字で[たい]と読むのは?,体,茶,直,電,1 +1240,2年生の漢字で[だい]と読むのは?,台,昼,通,刀,1 +1241,2年生の漢字で[ち]と読むのは?,地,長,弟,冬,1 +1242,2年生の漢字で[いけ]と読むのは?,池,鳥,店,当,1 +1243,2年生の漢字で[ち]と読むのは?,知,朝,点,東,1 +1244,2年生の漢字で[ちゃ]と読むのは?,茶,直,電,答,1 +1245,2年生の漢字で[ひる]と読むのは?,昼,通,刀,頭,1 +1246,2年生の漢字で[ちょう]と読むのは?,長,弟,冬,同,1 +1247,2年生の漢字で[とり]と読むのは?,鳥,店,当,道,1 +1248,2年生の漢字で[あさ]と読むのは?,朝,点,東,読,1 +1249,2年生の漢字で[ちょく]と読むのは?,直,電,答,内,1 +1250,2年生の漢字で[つう]と読むのは?,通,刀,頭,南,1 +1251,2年生の漢字で[おとうと]と読むのは?,弟,冬,同,肉,1 +1252,2年生の漢字で[みせ]と読むのは?,店,当,道,馬,1 +1253,2年生の漢字で[てん]と読むのは?,点,東,読,売,1 +1254,2年生の漢字で[でん]と読むのは?,電,答,内,買,1 +1255,2年生の漢字で[かたな]と読むのは?,刀,頭,南,麦,1 +1256,2年生の漢字で[ふゆ]と読むのは?,冬,同,肉,半,1 +1257,2年生の漢字で[とう]と読むのは?,当,道,馬,番,1 +1258,2年生の漢字で[ひがし]と読むのは?,東,読,売,父,1 +1259,2年生の漢字で[とう]と読むのは?,答,内,買,風,1 +1260,2年生の漢字で[あたま]と読むのは?,頭,南,麦,分,1 +1261,2年生の漢字で[どう]と読むのは?,同,肉,半,聞,1 +1262,2年生の漢字で[みち]と読むのは?,道,馬,番,米,1 +1263,2年生の漢字で[どく]と読むのは?,読,売,父,歩,1 +1264,2年生の漢字で[うち]と読むのは?,内,買,風,母,1 +1265,2年生の漢字で[みなみ]と読むのは?,南,麦,分,方,1 +1266,2年生の漢字で[にく]と読むのは?,肉,半,聞,北,1 +1267,2年生の漢字で[うま]と読むのは?,馬,番,米,毎,1 +1268,2年生の漢字で[ばい]と読むのは?,売,父,歩,妹,1 +1269,2年生の漢字で[ばい]と読むのは?,買,風,母,万,1 +1270,2年生の漢字で[むぎ]と読むのは?,麦,分,方,明,1 +1271,2年生の漢字で[はん]と読むのは?,半,聞,北,鳴,1 +1272,2年生の漢字で[ばん]と読むのは?,番,米,毎,毛,1 +1273,2年生の漢字で[ちち]と読むのは?,父,歩,妹,門,1 +1274,2年生の漢字で[かぜ]と読むのは?,風,母,万,夜,1 +1275,2年生の漢字で[ぶん]と読むのは?,分,方,明,野,1 +1276,2年生の漢字で[ぶん]と読むのは?,聞,北,鳴,友,1 +1277,2年生の漢字で[こめ]と読むのは?,米,毎,毛,用,1 +1278,2年生の漢字で[ほ]と読むのは?,歩,妹,門,曜,1 +1279,2年生の漢字で[はは]と読むのは?,母,万,夜,来,1 +1280,2年生の漢字で[ほう]と読むのは?,方,明,野,里,1 +1281,2年生の漢字で[きた]と読むのは?,北,鳴,友,理,1 +1282,2年生の漢字で[ごと]と読むのは?,毎,毛,用,話,1 +1283,2年生の漢字で[いもうと]と読むのは?,妹,門,曜,悪,1 +1284,2年生の漢字で[まん]と読むのは?,万,夜,来,安,1 +1285,2年生の漢字で[みょう]と読むのは?,明,野,里,暗,1 +1286,2年生の漢字で[なる]と読むのは?,鳴,友,理,医,1 +1287,2年生の漢字で[け]と読むのは?,毛,用,話,委,1 +1288,2年生の漢字で[もん]と読むのは?,門,曜,悪,意,1 +1289,2年生の漢字で[よる]と読むのは?,夜,来,安,育,1 +1290,2年生の漢字で[の]と読むのは?,野,里,暗,員,1 +1291,2年生の漢字で[とも]と読むのは?,友,理,医,院,1 +1292,2年生の漢字で[よう]と読むのは?,用,話,委,飲,1 +1293,2年生の漢字で[よう]と読むのは?,曜,悪,意,運,1 +1294,2年生の漢字で[らい]と読むのは?,来,安,育,泳,1 +1295,2年生の漢字で[さと]と読むのは?,里,暗,員,駅,1 +1296,2年生の漢字で[ことわり]と読むのは?,理,医,院,央,1 +1297,2年生の漢字で[はなし]と読むのは?,話,委,飲,横,1 +1298,3年生の漢字で[あく]と読むのは?,悪,意,運,屋,1 +1299,3年生の漢字で[あん]と読むのは?,安,育,泳,温,1 +1300,3年生の漢字で[あん]と読むのは?,暗,員,駅,化,1 +1301,3年生の漢字で[い]と読むのは?,医,院,央,荷,1 +1302,3年生の漢字で[い]と読むのは?,委,飲,横,界,1 +1303,3年生の漢字で[い]と読むのは?,意,運,屋,開,1 +1304,3年生の漢字で[いく]と読むのは?,育,泳,温,階,1 +1305,3年生の漢字で[いん]と読むのは?,員,駅,化,寒,1 +1306,3年生の漢字で[いん]と読むのは?,院,央,荷,感,1 +1307,3年生の漢字で[いん]と読むのは?,飲,横,界,漢,1 +1308,3年生の漢字で[うん]と読むのは?,運,屋,開,館,1 +1309,3年生の漢字で[えい]と読むのは?,泳,温,階,岸,1 +1310,3年生の漢字で[えき]と読むのは?,駅,化,寒,起,1 +1311,3年生の漢字で[おう]と読むのは?,央,荷,感,期,1 +1312,3年生の漢字で[よこ]と読むのは?,横,界,漢,客,1 +1313,3年生の漢字で[おく]と読むのは?,屋,開,館,究,1 +1314,3年生の漢字で[おん]と読むのは?,温,階,岸,急,1 +1315,3年生の漢字で[か]と読むのは?,化,寒,起,級,1 +1316,3年生の漢字で[に]と読むのは?,荷,感,期,宮,1 +1317,3年生の漢字で[かい]と読むのは?,界,漢,客,球,1 +1318,3年生の漢字で[かい]と読むのは?,開,館,究,去,1 +1319,3年生の漢字で[かい]と読むのは?,階,岸,急,橋,1 +1320,3年生の漢字で[かん]と読むのは?,寒,起,級,業,1 +1321,3年生の漢字で[かん]と読むのは?,感,期,宮,曲,1 +1322,3年生の漢字で[かん]と読むのは?,漢,客,球,局,1 +1323,3年生の漢字で[やかた]と読むのは?,館,究,去,銀,1 +1324,3年生の漢字で[きし]と読むのは?,岸,急,橋,区,1 +1325,3年生の漢字で[き]と読むのは?,起,級,業,苦,1 +1326,3年生の漢字で[き]と読むのは?,期,宮,曲,具,1 +1327,3年生の漢字で[きゃく]と読むのは?,客,球,局,君,1 +1328,3年生の漢字で[きゅう]と読むのは?,究,去,銀,係,1 +1329,3年生の漢字で[きゅう]と読むのは?,急,橋,区,軽,1 +1330,3年生の漢字で[きゅう]と読むのは?,級,業,苦,血,1 +1331,3年生の漢字で[みや]と読むのは?,宮,曲,具,決,1 +1332,3年生の漢字で[たま]と読むのは?,球,局,君,研,1 +1333,3年生の漢字で[きょ]と読むのは?,去,銀,係,県,1 +1334,3年生の漢字で[はし]と読むのは?,橋,区,軽,庫,1 +1335,3年生の漢字で[わざ]と読むのは?,業,苦,血,湖,1 +1336,3年生の漢字で[きょく]と読むのは?,曲,具,決,向,1 +1337,3年生の漢字で[きょく]と読むのは?,局,君,研,幸,1 +1338,3年生の漢字で[ぎん]と読むのは?,銀,係,県,港,1 +1339,3年生の漢字で[く]と読むのは?,区,軽,庫,号,1 +1340,3年生の漢字で[く]と読むのは?,苦,血,湖,根,1 +1341,3年生の漢字で[ぐ]と読むのは?,具,決,向,祭,1 +1342,3年生の漢字で[きみ]と読むのは?,君,研,幸,皿,1 +1343,3年生の漢字で[かかり]と読むのは?,係,県,港,仕,1 +1344,3年生の漢字で[けい]と読むのは?,軽,庫,号,死,1 +1345,3年生の漢字で[ち]と読むのは?,血,湖,根,使,1 +1346,3年生の漢字で[けつ]と読むのは?,決,向,祭,始,1 +1347,3年生の漢字で[けん]と読むのは?,研,幸,皿,指,1 +1348,3年生の漢字で[けん]と読むのは?,県,港,仕,歯,1 +1349,3年生の漢字で[こ]と読むのは?,庫,号,死,詩,1 +1350,3年生の漢字で[みずうみ]と読むのは?,湖,根,使,次,1 +1351,3年生の漢字で[むこう]と読むのは?,向,祭,始,事,1 +1352,3年生の漢字で[さち]と読むのは?,幸,皿,指,持,1 +1353,3年生の漢字で[みなと]と読むのは?,港,仕,歯,式,1 +1354,3年生の漢字で[ごう]と読むのは?,号,死,詩,実,1 +1355,3年生の漢字で[ね]と読むのは?,根,使,次,写,1 +1356,3年生の漢字で[まつり]と読むのは?,祭,始,事,者,1 +1357,3年生の漢字で[さら]と読むのは?,皿,指,持,主,1 +1358,3年生の漢字で[し]と読むのは?,仕,歯,式,守,1 +1359,3年生の漢字で[し]と読むのは?,死,詩,実,取,1 +1360,3年生の漢字で[し]と読むのは?,使,次,写,酒,1 +1361,3年生の漢字で[し]と読むのは?,始,事,者,受,1 +1362,3年生の漢字で[ゆび]と読むのは?,指,持,主,州,1 +1363,3年生の漢字で[は]と読むのは?,歯,式,守,拾,1 +1364,3年生の漢字で[し]と読むのは?,詩,実,取,終,1 +1365,3年生の漢字で[つぎ]と読むのは?,次,写,酒,習,1 +1366,3年生の漢字で[こと]と読むのは?,事,者,受,集,1 +1367,3年生の漢字で[じ]と読むのは?,持,主,州,住,1 +1368,3年生の漢字で[しき]と読むのは?,式,守,拾,重,1 +1369,3年生の漢字で[じつ]と読むのは?,実,取,終,宿,1 +1370,3年生の漢字で[しゃ]と読むのは?,写,酒,習,所,1 +1371,3年生の漢字で[しゃ]と読むのは?,者,受,集,暑,1 +1372,3年生の漢字で[しゅ]と読むのは?,主,州,住,助,1 +1373,3年生の漢字で[しゅ]と読むのは?,守,拾,重,昭,1 +1374,3年生の漢字で[しゅ]と読むのは?,取,終,宿,消,1 +1375,3年生の漢字で[しゅ]と読むのは?,酒,習,所,商,1 +1376,3年生の漢字で[じゅ]と読むのは?,受,集,暑,章,1 +1377,3年生の漢字で[しゅう]と読むのは?,州,住,助,勝,1 +1378,3年生の漢字で[しゅう]と読むのは?,拾,重,昭,乗,1 +1379,3年生の漢字で[しゅう]と読むのは?,終,宿,消,植,1 +1380,3年生の漢字で[しゅう]と読むのは?,習,所,商,申,1 +1381,3年生の漢字で[しゅう]と読むのは?,集,暑,章,身,1 +1382,3年生の漢字で[じゅう]と読むのは?,住,助,勝,神,1 +1383,3年生の漢字で[じゅう]と読むのは?,重,昭,乗,真,1 +1384,3年生の漢字で[やど]と読むのは?,宿,消,植,深,1 +1385,3年生の漢字で[ところ]と読むのは?,所,商,申,進,1 +1386,3年生の漢字で[しょ]と読むのは?,暑,章,身,世,1 +1387,3年生の漢字で[じょ]と読むのは?,助,勝,神,整,1 +1388,3年生の漢字で[しょう]と読むのは?,昭,乗,真,昔,1 +1389,3年生の漢字で[しょう]と読むのは?,消,植,深,全,1 +1390,3年生の漢字で[あきない]と読むのは?,商,申,進,相,1 +1391,3年生の漢字で[しょう]と読むのは?,章,身,世,送,1 +1392,3年生の漢字で[しょう]と読むのは?,勝,神,整,想,1 +1393,3年生の漢字で[じょう]と読むのは?,乗,真,昔,息,1 +1394,3年生の漢字で[しょく]と読むのは?,植,深,全,速,1 +1395,3年生の漢字で[しん]と読むのは?,申,進,相,族,1 +1396,3年生の漢字で[しん]と読むのは?,身,世,送,他,1 +1397,3年生の漢字で[かみ]と読むのは?,神,整,想,打,1 +1398,3年生の漢字で[しん]と読むのは?,真,昔,息,対,1 +1399,3年生の漢字で[しん]と読むのは?,深,全,速,待,1 +1400,3年生の漢字で[しん]と読むのは?,進,相,族,代,1 +1401,3年生の漢字で[よ]と読むのは?,世,送,他,第,1 +1402,3年生の漢字で[せい]と読むのは?,整,想,打,題,1 +1403,3年生の漢字で[むかし]と読むのは?,昔,息,対,炭,1 +1404,3年生の漢字で[ぜん]と読むのは?,全,速,待,短,1 +1405,3年生の漢字で[そう]と読むのは?,相,族,代,談,1 +1406,3年生の漢字で[そう]と読むのは?,送,他,第,着,1 +1407,3年生の漢字で[そう]と読むのは?,想,打,題,注,1 +1408,3年生の漢字で[いき]と読むのは?,息,対,炭,柱,1 +1409,3年生の漢字で[そく]と読むのは?,速,待,短,丁,1 +1410,3年生の漢字で[ぞく]と読むのは?,族,代,談,帳,1 +1411,3年生の漢字で[た]と読むのは?,他,第,着,調,1 +1412,3年生の漢字で[だ]と読むのは?,打,題,注,追,1 +1413,3年生の漢字で[たい]と読むのは?,対,炭,柱,定,1 +1414,3年生の漢字で[たい]と読むのは?,待,短,丁,庭,1 +1415,3年生の漢字で[だい]と読むのは?,代,談,帳,笛,1 +1416,3年生の漢字で[だい]と読むのは?,第,着,調,鉄,1 +1417,3年生の漢字で[だい]と読むのは?,題,注,追,転,1 +1418,3年生の漢字で[たん]と読むのは?,炭,柱,定,都,1 +1419,3年生の漢字で[たん]と読むのは?,短,丁,庭,度,1 +1420,3年生の漢字で[だん]と読むのは?,談,帳,笛,投,1 +1421,3年生の漢字で[ちゃく]と読むのは?,着,調,鉄,豆,1 +1422,3年生の漢字で[ちゅう]と読むのは?,注,追,転,島,1 +1423,3年生の漢字で[はしら]と読むのは?,柱,定,都,湯,1 +1424,3年生の漢字で[ちょう]と読むのは?,丁,庭,度,登,1 +1425,3年生の漢字で[ちょう]と読むのは?,帳,笛,投,等,1 +1426,3年生の漢字で[ちょう]と読むのは?,調,鉄,豆,動,1 +1427,3年生の漢字で[つい]と読むのは?,追,転,島,童,1 +1428,3年生の漢字で[じょう]と読むのは?,定,都,湯,農,1 +1429,3年生の漢字で[にわ]と読むのは?,庭,度,登,波,1 +1430,3年生の漢字で[ふえ]と読むのは?,笛,投,等,配,1 +1431,3年生の漢字で[てつ]と読むのは?,鉄,豆,動,倍,1 +1432,3年生の漢字で[てん]と読むのは?,転,島,童,箱,1 +1433,3年生の漢字で[みやこ]と読むのは?,都,湯,農,畑,1 +1434,3年生の漢字で[たび]と読むのは?,度,登,波,発,1 +1435,3年生の漢字で[とう]と読むのは?,投,等,配,反,1 +1436,3年生の漢字で[まめ]と読むのは?,豆,動,倍,坂,1 +1437,3年生の漢字で[しま]と読むのは?,島,童,箱,板,1 +1438,3年生の漢字で[ゆ]と読むのは?,湯,農,畑,皮,1 +1439,3年生の漢字で[とう]と読むのは?,登,波,発,悲,1 +1440,3年生の漢字で[とう]と読むのは?,等,配,反,美,1 +1441,3年生の漢字で[どう]と読むのは?,動,倍,坂,鼻,1 +1442,3年生の漢字で[どう]と読むのは?,童,箱,板,筆,1 +1443,3年生の漢字で[のう]と読むのは?,農,畑,皮,氷,1 +1444,3年生の漢字で[なみ]と読むのは?,波,発,悲,表,1 +1445,3年生の漢字で[はい]と読むのは?,配,反,美,秒,1 +1446,3年生の漢字で[ばい]と読むのは?,倍,坂,鼻,病,1 +1447,3年生の漢字で[はこ]と読むのは?,箱,板,筆,品,1 +1448,3年生の漢字で[はたけ]と読むのは?,畑,皮,氷,負,1 +1449,3年生の漢字で[はつ]と読むのは?,発,悲,表,部,1 +1450,3年生の漢字で[はん]と読むのは?,反,美,秒,服,1 +1451,3年生の漢字で[さか]と読むのは?,坂,鼻,病,福,1 +1452,3年生の漢字で[いた]と読むのは?,板,筆,品,物,1 +1453,3年生の漢字で[かわ]と読むのは?,皮,氷,負,平,1 +1454,3年生の漢字で[ひ]と読むのは?,悲,表,部,返,1 +1455,3年生の漢字で[び]と読むのは?,美,秒,服,勉,1 +1456,3年生の漢字で[はな]と読むのは?,鼻,病,福,放,1 +1457,3年生の漢字で[ふで]と読むのは?,筆,品,物,味,1 +1458,3年生の漢字で[こおり]と読むのは?,氷,負,平,命,1 +1459,3年生の漢字で[おもて]と読むのは?,表,部,返,面,1 +1460,3年生の漢字で[びょう]と読むのは?,秒,服,勉,問,1 +1461,3年生の漢字で[やまい]と読むのは?,病,福,放,役,1 +1462,3年生の漢字で[しな]と読むのは?,品,物,味,薬,1 +1463,3年生の漢字で[ふ]と読むのは?,負,平,命,由,1 +1464,3年生の漢字で[ぶ]と読むのは?,部,返,面,油,1 +1465,3年生の漢字で[ふく]と読むのは?,服,勉,問,有,1 +1466,3年生の漢字で[ふく]と読むのは?,福,放,役,遊,1 +1467,3年生の漢字で[ぶつ]と読むのは?,物,味,薬,予,1 +1468,3年生の漢字で[ひら]と読むのは?,平,命,由,羊,1 +1469,3年生の漢字で[へん]と読むのは?,返,面,油,洋,1 +1470,3年生の漢字で[べん]と読むのは?,勉,問,有,葉,1 +1471,3年生の漢字で[ほう]と読むのは?,放,役,遊,陽,1 +1472,3年生の漢字で[あじ]と読むのは?,味,薬,予,様,1 +1473,3年生の漢字で[いのち]と読むのは?,命,由,羊,落,1 +1474,3年生の漢字で[めん]と読むのは?,面,油,洋,流,1 +1475,3年生の漢字で[もん]と読むのは?,問,有,葉,旅,1 +1476,3年生の漢字で[やく]と読むのは?,役,遊,陽,両,1 +1477,3年生の漢字で[くすり]と読むのは?,薬,予,様,緑,1 +1478,3年生の漢字で[ゆ]と読むのは?,由,羊,落,礼,1 +1479,3年生の漢字で[あぶら]と読むのは?,油,洋,流,列,1 +1480,3年生の漢字で[ゆう]と読むのは?,有,葉,旅,練,1 +1481,3年生の漢字で[ゆう]と読むのは?,遊,陽,両,路,1 +1482,3年生の漢字で[よ]と読むのは?,予,様,緑,和,1 +1483,3年生の漢字で[ひつじ]と読むのは?,羊,落,礼,愛,1 +1484,3年生の漢字で[よう]と読むのは?,洋,流,列,案,1 +1485,3年生の漢字で[は]と読むのは?,葉,旅,練,以,1 +1486,3年生の漢字で[よう]と読むのは?,陽,両,路,衣,1 +1487,3年生の漢字で[さま]と読むのは?,様,緑,和,位,1 +1488,3年生の漢字で[らく]と読むのは?,落,礼,愛,囲,1 +1489,3年生の漢字で[りゅう]と読むのは?,流,列,案,胃,1 +1490,3年生の漢字で[たび]と読むのは?,旅,練,以,印,1 +1491,3年生の漢字で[りょう]と読むのは?,両,路,衣,英,1 +1492,3年生の漢字で[みどり]と読むのは?,緑,和,位,栄,1 +1493,3年生の漢字で[れい]と読むのは?,礼,愛,囲,塩,1 +1494,3年生の漢字で[れつ]と読むのは?,列,案,胃,億,1 +1495,3年生の漢字で[れん]と読むのは?,練,以,印,加,1 +1496,3年生の漢字で[ろ]と読むのは?,路,衣,英,果,1 +1497,3年生の漢字で[わ]と読むのは?,和,位,栄,貨,1 +1498,4年生の漢字で[あい]と読むのは?,愛,囲,塩,課,1 +1499,4年生の漢字で[あん]と読むのは?,案,胃,億,芽,1 +1500,4年生の漢字で[い]と読むのは?,以,印,加,改,1 +1501,4年生の漢字で[ころも]と読むのは?,衣,英,果,械,1 +1502,4年生の漢字で[くらい]と読むのは?,位,栄,貨,害,1 +1503,4年生の漢字で[い]と読むのは?,囲,塩,課,街,1 +1504,4年生の漢字で[い]と読むのは?,胃,億,芽,各,1 +1505,4年生の漢字で[しるし]と読むのは?,印,加,改,覚,1 +1506,4年生の漢字で[えい]と読むのは?,英,果,械,完,1 +1507,4年生の漢字で[えい]と読むのは?,栄,貨,害,官,1 +1508,4年生の漢字で[しお]と読むのは?,塩,課,街,管,1 +1509,4年生の漢字で[おく]と読むのは?,億,芽,各,関,1 +1510,4年生の漢字で[か]と読むのは?,加,改,覚,観,1 +1511,4年生の漢字で[か]と読むのは?,果,械,完,願,1 +1512,4年生の漢字で[か]と読むのは?,貨,害,官,希,1 +1513,4年生の漢字で[か]と読むのは?,課,街,管,季,1 +1514,4年生の漢字で[め]と読むのは?,芽,各,関,紀,1 +1515,4年生の漢字で[かい]と読むのは?,改,覚,観,喜,1 +1516,4年生の漢字で[かい]と読むのは?,械,完,願,旗,1 +1517,4年生の漢字で[がい]と読むのは?,害,官,希,器,1 +1518,4年生の漢字で[まち]と読むのは?,街,管,季,機,1 +1519,4年生の漢字で[かく]と読むのは?,各,関,紀,議,1 +1520,4年生の漢字で[かく]と読むのは?,覚,観,喜,求,1 +1521,4年生の漢字で[かん]と読むのは?,完,願,旗,泣,1 +1522,4年生の漢字で[かん]と読むのは?,官,希,器,救,1 +1523,4年生の漢字で[かん]と読むのは?,管,季,機,給,1 +1524,4年生の漢字で[かん]と読むのは?,関,紀,議,挙,1 +1525,4年生の漢字で[かん]と読むのは?,観,喜,求,漁,1 +1526,4年生の漢字で[がん]と読むのは?,願,旗,泣,共,1 +1527,4年生の漢字で[き]と読むのは?,希,器,救,協,1 +1528,4年生の漢字で[き]と読むのは?,季,機,給,鏡,1 +1529,4年生の漢字で[き]と読むのは?,紀,議,挙,竸,1 +1530,4年生の漢字で[き]と読むのは?,喜,求,漁,極,1 +1531,4年生の漢字で[はた]と読むのは?,旗,泣,共,訓,1 +1532,4年生の漢字で[うつわ]と読むのは?,器,救,協,軍,1 +1533,4年生の漢字で[き]と読むのは?,機,給,鏡,郡,1 +1534,4年生の漢字で[ぎ]と読むのは?,議,挙,竸,径,1 +1535,4年生の漢字で[きゅう]と読むのは?,求,漁,極,型,1 +1536,4年生の漢字で[きゅう]と読むのは?,泣,共,訓,景,1 +1537,4年生の漢字で[きゅう]と読むのは?,救,協,軍,芸,1 +1538,4年生の漢字で[きゅう]と読むのは?,給,鏡,郡,欠,1 +1539,4年生の漢字で[きょ]と読むのは?,挙,竸,径,結,1 +1540,4年生の漢字で[りょう]と読むのは?,漁,極,型,建,1 +1541,4年生の漢字で[きょう]と読むのは?,共,訓,景,健,1 +1542,4年生の漢字で[きょう]と読むのは?,協,軍,芸,験,1 +1543,4年生の漢字で[きょう]と読むのは?,鏡,郡,欠,固,1 +1544,4年生の漢字で[きょう]と読むのは?,竸,径,結,功,1 +1545,4年生の漢字で[きょく]と読むのは?,極,型,建,好,1 +1546,4年生の漢字で[くん]と読むのは?,訓,景,健,候,1 +1547,4年生の漢字で[ぐん]と読むのは?,軍,芸,験,航,1 +1548,4年生の漢字で[ぐん]と読むのは?,郡,欠,固,康,1 +1549,4年生の漢字で[けい]と読むのは?,径,結,功,告,1 +1550,4年生の漢字で[けい]と読むのは?,型,建,好,差,1 +1551,4年生の漢字で[けい]と読むのは?,景,健,候,菜,1 +1552,4年生の漢字で[げい]と読むのは?,芸,験,航,最,1 +1553,4年生の漢字で[けつ]と読むのは?,欠,固,康,材,1 +1554,4年生の漢字で[けつ]と読むのは?,結,功,告,昨,1 +1555,4年生の漢字で[けん]と読むのは?,建,好,差,札,1 +1556,4年生の漢字で[けん]と読むのは?,健,候,菜,刷,1 +1557,4年生の漢字で[けん]と読むのは?,験,航,最,殺,1 +1558,4年生の漢字で[こ]と読むのは?,固,康,材,察,1 +1559,4年生の漢字で[こう]と読むのは?,功,告,昨,参,1 +1560,4年生の漢字で[こう]と読むのは?,好,差,札,産,1 +1561,4年生の漢字で[そうろう]と読むのは?,候,菜,刷,散,1 +1562,4年生の漢字で[こう]と読むのは?,航,最,殺,残,1 +1563,4年生の漢字で[こう]と読むのは?,康,材,察,士,1 +1564,4年生の漢字で[こく]と読むのは?,告,昨,参,氏,1 +1565,4年生の漢字で[さ]と読むのは?,差,札,産,史,1 +1566,4年生の漢字で[さい]と読むのは?,菜,刷,散,司,1 +1567,4年生の漢字で[さい]と読むのは?,最,殺,残,試,1 +1568,4年生の漢字で[ざい]と読むのは?,材,察,士,児,1 +1569,4年生の漢字で[さく]と読むのは?,昨,参,氏,治,1 +1570,4年生の漢字で[さつ]と読むのは?,札,産,史,辞,1 +1571,4年生の漢字で[さつ]と読むのは?,刷,散,司,失,1 +1572,4年生の漢字で[さつ]と読むのは?,殺,残,試,借,1 +1573,4年生の漢字で[さつ]と読むのは?,察,士,児,種,1 +1574,4年生の漢字で[さん]と読むのは?,参,氏,治,周,1 +1575,4年生の漢字で[さん]と読むのは?,産,史,辞,祝,1 +1576,4年生の漢字で[さん]と読むのは?,散,司,失,順,1 +1577,4年生の漢字で[ざん]と読むのは?,残,試,借,初,1 +1578,4年生の漢字で[し]と読むのは?,士,児,種,松,1 +1579,4年生の漢字で[し]と読むのは?,氏,治,周,笑,1 +1580,4年生の漢字で[し]と読むのは?,史,辞,祝,唱,1 +1581,4年生の漢字で[し]と読むのは?,司,失,順,焼,1 +1582,4年生の漢字で[し]と読むのは?,試,借,初,象,1 +1583,4年生の漢字で[じ]と読むのは?,児,種,松,照,1 +1584,4年生の漢字で[じ]と読むのは?,治,周,笑,賞,1 +1585,4年生の漢字で[じ]と読むのは?,辞,祝,唱,臣,1 +1586,4年生の漢字で[しつ]と読むのは?,失,順,焼,信,1 +1587,4年生の漢字で[しゃく]と読むのは?,借,初,象,成,1 +1588,4年生の漢字で[しゅ]と読むのは?,種,松,照,省,1 +1589,4年生の漢字で[しゅう]と読むのは?,周,笑,賞,清,1 +1590,4年生の漢字で[しゅく]と読むのは?,祝,唱,臣,静,1 +1591,4年生の漢字で[じゅん]と読むのは?,順,焼,信,席,1 +1592,4年生の漢字で[しょ]と読むのは?,初,象,成,積,1 +1593,4年生の漢字で[まつ]と読むのは?,松,照,省,折,1 +1594,4年生の漢字で[しょう]と読むのは?,笑,賞,清,節,1 +1595,4年生の漢字で[しょう]と読むのは?,唱,臣,静,説,1 +1596,4年生の漢字で[しょう]と読むのは?,焼,信,席,浅,1 +1597,4年生の漢字で[しょう]と読むのは?,象,成,積,戦,1 +1598,4年生の漢字で[しょう]と読むのは?,照,省,折,選,1 +1599,4年生の漢字で[しょう]と読むのは?,賞,清,節,然,1 +1600,4年生の漢字で[しん]と読むのは?,臣,静,説,争,1 +1601,4年生の漢字で[しん]と読むのは?,信,席,浅,倉,1 +1602,4年生の漢字で[せい]と読むのは?,成,積,戦,巣,1 +1603,4年生の漢字で[しょう]と読むのは?,省,折,選,束,1 +1604,4年生の漢字で[せい]と読むのは?,清,節,然,側,1 +1605,4年生の漢字で[せい]と読むのは?,静,説,争,続,1 +1606,4年生の漢字で[せき]と読むのは?,席,浅,倉,卒,1 +1607,4年生の漢字で[せき]と読むのは?,積,戦,巣,孫,1 +1608,4年生の漢字で[せつ]と読むのは?,折,選,束,帯,1 +1609,4年生の漢字で[せつ]と読むのは?,節,然,側,隊,1 +1610,4年生の漢字で[せつ]と読むのは?,説,争,続,達,1 +1611,4年生の漢字で[せん]と読むのは?,浅,倉,卒,単,1 +1612,4年生の漢字で[せん]と読むのは?,戦,巣,孫,置,1 +1613,4年生の漢字で[せん]と読むのは?,選,束,帯,仲,1 +1614,4年生の漢字で[ねん]と読むのは?,然,側,隊,貯,1 +1615,4年生の漢字で[そう]と読むのは?,争,続,達,兆,1 +1616,4年生の漢字で[そう]と読むのは?,倉,卒,単,腸,1 +1617,4年生の漢字で[す]と読むのは?,巣,孫,置,低,1 +1618,4年生の漢字で[つか]と読むのは?,束,帯,仲,底,1 +1619,4年生の漢字で[がわ]と読むのは?,側,隊,貯,停,1 +1620,4年生の漢字で[ぞく]と読むのは?,続,達,兆,的,1 +1621,4年生の漢字で[そつ]と読むのは?,卒,単,腸,典,1 +1622,4年生の漢字で[まご]と読むのは?,孫,置,低,伝,1 +1623,4年生の漢字で[おび]と読むのは?,帯,仲,底,徒,1 +1624,4年生の漢字で[たい]と読むのは?,隊,貯,停,努,1 +1625,4年生の漢字で[たち]と読むのは?,達,兆,的,灯,1 +1626,4年生の漢字で[たん]と読むのは?,単,腸,典,堂,1 +1627,4年生の漢字で[ち]と読むのは?,置,低,伝,働,1 +1628,4年生の漢字で[ちゅう]と読むのは?,仲,底,徒,特,1 +1629,4年生の漢字で[ちょ]と読むのは?,貯,停,努,得,1 +1630,4年生の漢字で[ちょう]と読むのは?,兆,的,灯,毒,1 +1631,4年生の漢字で[ちょう]と読むのは?,腸,典,堂,熱,1 +1632,4年生の漢字で[てい]と読むのは?,低,伝,働,念,1 +1633,4年生の漢字で[てい]と読むのは?,底,徒,特,敗,1 +1634,4年生の漢字で[てい]と読むのは?,停,努,得,梅,1 +1635,4年生の漢字で[まと]と読むのは?,的,灯,毒,博,1 +1636,4年生の漢字で[てん]と読むのは?,典,堂,熱,飯,1 +1637,4年生の漢字で[でん]と読むのは?,伝,働,念,飛,1 +1638,4年生の漢字で[と]と読むのは?,徒,特,敗,費,1 +1639,4年生の漢字で[ど]と読むのは?,努,得,梅,必,1 +1640,4年生の漢字で[とう]と読むのは?,灯,毒,博,票,1 +1641,4年生の漢字で[どう]と読むのは?,堂,熱,飯,標,1 +1642,4年生の漢字で[どう]と読むのは?,働,念,飛,不,1 +1643,4年生の漢字で[とく]と読むのは?,特,敗,費,夫,1 +1644,4年生の漢字で[とく]と読むのは?,得,梅,必,付,1 +1645,4年生の漢字で[どく]と読むのは?,毒,博,票,府,1 +1646,4年生の漢字で[ねつ]と読むのは?,熱,飯,標,副,1 +1647,4年生の漢字で[ねん]と読むのは?,念,飛,不,粉,1 +1648,4年生の漢字で[はい]と読むのは?,敗,費,夫,兵,1 +1649,4年生の漢字で[ばい]と読むのは?,梅,必,付,別,1 +1650,4年生の漢字で[はく]と読むのは?,博,票,府,辺,1 +1651,4年生の漢字で[めし]と読むのは?,飯,標,副,変,1 +1652,4年生の漢字で[ひ]と読むのは?,飛,不,粉,便,1 +1653,4年生の漢字で[ひ]と読むのは?,費,夫,兵,包,1 +1654,4年生の漢字で[ひつ]と読むのは?,必,付,別,法,1 +1655,4年生の漢字で[ひょう]と読むのは?,票,府,辺,望,1 +1656,4年生の漢字で[ひょう]と読むのは?,標,副,変,牧,1 +1657,4年生の漢字で[ふ]と読むのは?,不,粉,便,末,1 +1658,4年生の漢字で[ふ]と読むのは?,夫,兵,包,満,1 +1659,4年生の漢字で[ふ]と読むのは?,付,別,法,未,1 +1660,4年生の漢字で[ふ]と読むのは?,府,辺,望,脈,1 +1661,4年生の漢字で[ふく]と読むのは?,副,変,牧,民,1 +1662,4年生の漢字で[ふん]と読むのは?,粉,便,末,無,1 +1663,4年生の漢字で[へい]と読むのは?,兵,包,満,約,1 +1664,4年生の漢字で[べつ]と読むのは?,別,法,未,勇,1 +1665,4年生の漢字で[へん]と読むのは?,辺,望,脈,要,1 +1666,4年生の漢字で[へん]と読むのは?,変,牧,民,養,1 +1667,4年生の漢字で[べん]と読むのは?,便,末,無,浴,1 +1668,4年生の漢字で[ほう]と読むのは?,包,満,約,利,1 +1669,4年生の漢字で[ほう]と読むのは?,法,未,勇,陸,1 +1670,4年生の漢字で[ぼう]と読むのは?,望,脈,要,良,1 +1671,4年生の漢字で[ぼく]と読むのは?,牧,民,養,料,1 +1672,4年生の漢字で[すえ]と読むのは?,末,無,浴,量,1 +1673,4年生の漢字で[みつ]と読むのは?,満,約,利,輪,1 +1674,4年生の漢字で[み]と読むのは?,未,勇,陸,類,1 +1675,4年生の漢字で[みゃく]と読むのは?,脈,要,良,令,1 +1676,4年生の漢字で[みん]と読むのは?,民,養,料,冷,1 +1677,4年生の漢字で[む]と読むのは?,無,浴,量,例,1 +1678,4年生の漢字で[やく]と読むのは?,約,利,輪,歴,1 +1679,4年生の漢字で[ゆう]と読むのは?,勇,陸,類,連,1 +1680,4年生の漢字で[よう]と読むのは?,要,良,令,老,1 +1681,4年生の漢字で[よう]と読むのは?,養,料,冷,労,1 +1682,4年生の漢字で[よく]と読むのは?,浴,量,例,録,1 +1683,4年生の漢字で[り]と読むのは?,利,輪,歴,圧,1 +1684,4年生の漢字で[りく]と読むのは?,陸,類,連,移,1 +1685,4年生の漢字で[りょう]と読むのは?,良,令,老,因,1 +1686,4年生の漢字で[りょう]と読むのは?,料,冷,労,永,1 +1687,4年生の漢字で[りょう]と読むのは?,量,例,録,営,1 +1688,4年生の漢字で[りん]と読むのは?,輪,歴,圧,衞,1 +1689,4年生の漢字で[るい]と読むのは?,類,連,移,易,1 +1690,4年生の漢字で[れい]と読むのは?,令,老,因,益,1 +1691,4年生の漢字で[れい]と読むのは?,冷,労,永,液,1 +1692,4年生の漢字で[れい]と読むのは?,例,録,営,演,1 +1693,4年生の漢字で[れき]と読むのは?,歴,圧,衞,応,1 +1694,4年生の漢字で[れん]と読むのは?,連,移,易,往,1 +1695,4年生の漢字で[ろう]と読むのは?,老,因,益,桜,1 +1696,4年生の漢字で[ろう]と読むのは?,労,永,液,恩,1 +1697,4年生の漢字で[ろく]と読むのは?,録,営,演,可,1 +1698,5年生の漢字で[あつ]と読むのは?,圧,衞,応,仮,1 +1699,5年生の漢字で[い]と読むのは?,移,易,往,価,1 +1700,5年生の漢字で[いん]と読むのは?,因,益,桜,河,1 +1701,5年生の漢字で[えい]と読むのは?,永,液,恩,過,1 +1702,5年生の漢字で[えい]と読むのは?,営,演,可,賀,1 +1703,5年生の漢字で[えい]と読むのは?,衞,応,仮,快,1 +1704,5年生の漢字で[えき]と読むのは?,易,往,価,解,1 +1705,5年生の漢字で[えき]と読むのは?,益,桜,河,格,1 +1706,5年生の漢字で[えき]と読むのは?,液,恩,過,確,1 +1707,5年生の漢字で[えん]と読むのは?,演,可,賀,額,1 +1708,5年生の漢字で[おう]と読むのは?,応,仮,快,刊,1 +1709,5年生の漢字で[おう]と読むのは?,往,価,解,幹,1 +1710,5年生の漢字で[さくら]と読むのは?,桜,河,格,慣,1 +1711,5年生の漢字で[おん]と読むのは?,恩,過,確,眼,1 +1712,5年生の漢字で[か]と読むのは?,可,賀,額,基,1 +1713,5年生の漢字で[かり]と読むのは?,仮,快,刊,寄,1 +1714,5年生の漢字で[か]と読むのは?,価,解,幹,規,1 +1715,5年生の漢字で[かわ]と読むのは?,河,格,慣,技,1 +1716,5年生の漢字で[か]と読むのは?,過,確,眼,義,1 +1717,5年生の漢字で[が]と読むのは?,賀,額,基,逆,1 +1718,5年生の漢字で[かい]と読むのは?,快,刊,寄,久,1 +1719,5年生の漢字で[かい]と読むのは?,解,幹,規,旧,1 +1720,5年生の漢字で[かく]と読むのは?,格,慣,技,居,1 +1721,5年生の漢字で[かく]と読むのは?,確,眼,義,許,1 +1722,5年生の漢字で[がく]と読むのは?,額,基,逆,境,1 +1723,5年生の漢字で[かん]と読むのは?,刊,寄,久,均,1 +1724,5年生の漢字で[かん]と読むのは?,幹,規,旧,禁,1 +1725,5年生の漢字で[かん]と読むのは?,慣,技,居,句,1 +1726,5年生の漢字で[がん]と読むのは?,眼,義,許,群,1 +1727,5年生の漢字で[もと]と読むのは?,基,逆,境,経,1 +1728,5年生の漢字で[き]と読むのは?,寄,久,均,潔,1 +1729,5年生の漢字で[き]と読むのは?,規,旧,禁,件,1 +1730,5年生の漢字で[ぎ]と読むのは?,技,居,句,券,1 +1731,5年生の漢字で[ぎ]と読むのは?,義,許,群,険,1 +1732,5年生の漢字で[ぎゃく]と読むのは?,逆,境,経,検,1 +1733,5年生の漢字で[きゅう]と読むのは?,久,均,潔,限,1 +1734,5年生の漢字で[きゅう]と読むのは?,旧,禁,件,現,1 +1735,5年生の漢字で[きょ]と読むのは?,居,句,券,減,1 +1736,5年生の漢字で[きょ]と読むのは?,許,群,険,故,1 +1737,5年生の漢字で[きょう]と読むのは?,境,経,検,個,1 +1738,5年生の漢字で[きん]と読むのは?,均,潔,限,護,1 +1739,5年生の漢字で[きん]と読むのは?,禁,件,現,効,1 +1740,5年生の漢字で[く]と読むのは?,句,券,減,厚,1 +1741,5年生の漢字で[ぐん]と読むのは?,群,険,故,耕,1 +1742,5年生の漢字で[けい]と読むのは?,経,検,個,鉱,1 +1743,5年生の漢字で[けつ]と読むのは?,潔,限,護,構,1 +1744,5年生の漢字で[けん]と読むのは?,件,現,効,興,1 +1745,5年生の漢字で[けん]と読むのは?,券,減,厚,講,1 +1746,5年生の漢字で[けん]と読むのは?,険,故,耕,混,1 +1747,5年生の漢字で[けん]と読むのは?,検,個,鉱,査,1 +1748,5年生の漢字で[げん]と読むのは?,限,護,構,再,1 +1749,5年生の漢字で[げん]と読むのは?,現,効,興,災,1 +1750,5年生の漢字で[げん]と読むのは?,減,厚,講,妻,1 +1751,5年生の漢字で[ゆえ]と読むのは?,故,耕,混,採,1 +1752,5年生の漢字で[こ]と読むのは?,個,鉱,査,在,1 +1753,5年生の漢字で[ご]と読むのは?,護,構,再,財,1 +1754,5年生の漢字で[こう]と読むのは?,効,興,災,罪,1 +1755,5年生の漢字で[こう]と読むのは?,厚,講,妻,雑,1 +1756,5年生の漢字で[こう]と読むのは?,耕,混,採,酸,1 +1757,5年生の漢字で[こう]と読むのは?,鉱,査,在,賛,1 +1758,5年生の漢字で[こう]と読むのは?,構,再,財,志,1 +1759,5年生の漢字で[こう]と読むのは?,興,災,罪,枝,1 +1760,5年生の漢字で[こう]と読むのは?,講,妻,雑,師,1 +1761,5年生の漢字で[こん]と読むのは?,混,採,酸,資,1 +1762,5年生の漢字で[さ]と読むのは?,査,在,賛,飼,1 +1763,5年生の漢字で[さい]と読むのは?,再,財,志,示,1 +1764,5年生の漢字で[さい]と読むのは?,災,罪,枝,似,1 +1765,5年生の漢字で[さい]と読むのは?,妻,雑,師,識,1 +1766,5年生の漢字で[さい]と読むのは?,採,酸,資,質,1 +1767,5年生の漢字で[ざい]と読むのは?,在,賛,飼,舎,1 +1768,5年生の漢字で[ざい]と読むのは?,財,志,示,謝,1 +1769,5年生の漢字で[ざい]と読むのは?,罪,枝,似,授,1 +1770,5年生の漢字で[ざつ]と読むのは?,雑,師,識,修,1 +1771,5年生の漢字で[さん]と読むのは?,酸,資,質,述,1 +1772,5年生の漢字で[さん]と読むのは?,賛,飼,舎,術,1 +1773,5年生の漢字で[し]と読むのは?,志,示,謝,準,1 +1774,5年生の漢字で[えだ]と読むのは?,枝,似,授,序,1 +1775,5年生の漢字で[し]と読むのは?,師,識,修,招,1 +1776,5年生の漢字で[し]と読むのは?,資,質,述,承,1 +1777,5年生の漢字で[し]と読むのは?,飼,舎,術,証,1 +1778,5年生の漢字で[じ]と読むのは?,示,謝,準,条,1 +1779,5年生の漢字で[じ]と読むのは?,似,授,序,状,1 +1780,5年生の漢字で[しき]と読むのは?,識,修,招,常,1 +1781,5年生の漢字で[しつ]と読むのは?,質,述,承,情,1 +1782,5年生の漢字で[しゃ]と読むのは?,舎,術,証,織,1 +1783,5年生の漢字で[しゃ]と読むのは?,謝,準,条,職,1 +1784,5年生の漢字で[じゅ]と読むのは?,授,序,状,制,1 +1785,5年生の漢字で[しゅう]と読むのは?,修,招,常,性,1 +1786,5年生の漢字で[じゅつ]と読むのは?,述,承,情,政,1 +1787,5年生の漢字で[じゅつ]と読むのは?,術,証,織,勢,1 +1788,5年生の漢字で[じゅん]と読むのは?,準,条,職,精,1 +1789,5年生の漢字で[じょ]と読むのは?,序,状,制,製,1 +1790,5年生の漢字で[しょう]と読むのは?,招,常,性,税,1 +1791,5年生の漢字で[しょう]と読むのは?,承,情,政,責,1 +1792,5年生の漢字で[しょう]と読むのは?,証,織,勢,績,1 +1793,5年生の漢字で[じょう]と読むのは?,条,職,精,接,1 +1794,5年生の漢字で[じょう]と読むのは?,状,制,製,設,1 +1795,5年生の漢字で[じょう]と読むのは?,常,性,税,舌,1 +1796,5年生の漢字で[じょう]と読むのは?,情,政,責,絶,1 +1797,5年生の漢字で[しき]と読むのは?,織,勢,績,銭,1 +1798,5年生の漢字で[しょく]と読むのは?,職,精,接,祖,1 +1799,5年生の漢字で[せい]と読むのは?,制,製,設,素,1 +1800,5年生の漢字で[せい]と読むのは?,性,税,舌,総,1 +1801,5年生の漢字で[せい]と読むのは?,政,責,絶,造,1 +1802,5年生の漢字で[せい]と読むのは?,勢,績,銭,像,1 +1803,5年生の漢字で[せい]と読むのは?,精,接,祖,増,1 +1804,5年生の漢字で[せい]と読むのは?,製,設,素,則,1 +1805,5年生の漢字で[ぜい]と読むのは?,税,舌,総,測,1 +1806,5年生の漢字で[せき]と読むのは?,責,絶,造,属,1 +1807,5年生の漢字で[せき]と読むのは?,績,銭,像,率,1 +1808,5年生の漢字で[せつ]と読むのは?,接,祖,増,損,1 +1809,5年生の漢字で[せつ]と読むのは?,設,素,則,退,1 +1810,5年生の漢字で[ぜつ]と読むのは?,舌,総,測,貸,1 +1811,5年生の漢字で[ぜつ]と読むのは?,絶,造,属,態,1 +1812,5年生の漢字で[せん]と読むのは?,銭,像,率,団,1 +1813,5年生の漢字で[そ]と読むのは?,祖,増,損,断,1 +1814,5年生の漢字で[そ]と読むのは?,素,則,退,築,1 +1815,5年生の漢字で[そう]と読むのは?,総,測,貸,張,1 +1816,5年生の漢字で[ぞう]と読むのは?,造,属,態,堤,1 +1817,5年生の漢字で[ぞう]と読むのは?,像,率,団,程,1 +1818,5年生の漢字で[ぞう]と読むのは?,増,損,断,適,1 +1819,5年生の漢字で[そく]と読むのは?,則,退,築,敵,1 +1820,5年生の漢字で[そく]と読むのは?,測,貸,張,統,1 +1821,5年生の漢字で[ぞく]と読むのは?,属,態,堤,銅,1 +1822,5年生の漢字で[りつ]と読むのは?,率,団,程,導,1 +1823,5年生の漢字で[そん]と読むのは?,損,断,適,徳,1 +1824,5年生の漢字で[たい]と読むのは?,退,築,敵,独,1 +1825,5年生の漢字で[たい]と読むのは?,貸,張,統,任,1 +1826,5年生の漢字で[たい]と読むのは?,態,堤,銅,燃,1 +1827,5年生の漢字で[だん]と読むのは?,団,程,導,能,1 +1828,5年生の漢字で[だん]と読むのは?,断,適,徳,破,1 +1829,5年生の漢字で[ちく]と読むのは?,築,敵,独,犯,1 +1830,5年生の漢字で[ちょう]と読むのは?,張,統,任,判,1 +1831,5年生の漢字で[てい]と読むのは?,堤,銅,燃,版,1 +1832,5年生の漢字で[てい]と読むのは?,程,導,能,比,1 +1833,5年生の漢字で[てき]と読むのは?,適,徳,破,肥,1 +1834,5年生の漢字で[てき]と読むのは?,敵,独,犯,非,1 +1835,5年生の漢字で[とう]と読むのは?,統,任,判,備,1 +1836,5年生の漢字で[どう]と読むのは?,銅,燃,版,俵,1 +1837,5年生の漢字で[どう]と読むのは?,導,能,比,評,1 +1838,5年生の漢字で[とく]と読むのは?,徳,破,肥,貧,1 +1839,5年生の漢字で[どく]と読むのは?,独,犯,非,布,1 +1840,5年生の漢字で[にん]と読むのは?,任,判,備,婦,1 +1841,5年生の漢字で[ねん]と読むのは?,燃,版,俵,富,1 +1842,5年生の漢字で[のう]と読むのは?,能,比,評,武,1 +1843,5年生の漢字で[は]と読むのは?,破,肥,貧,復,1 +1844,5年生の漢字で[はん]と読むのは?,犯,非,布,複,1 +1845,5年生の漢字で[はん]と読むのは?,判,備,婦,仏,1 +1846,5年生の漢字で[はん]と読むのは?,版,俵,富,編,1 +1847,5年生の漢字で[ひ]と読むのは?,比,評,武,弁,1 +1848,5年生の漢字で[ひ]と読むのは?,肥,貧,復,保,1 +1849,5年生の漢字で[ひ]と読むのは?,非,布,複,墓,1 +1850,5年生の漢字で[び]と読むのは?,備,婦,仏,報,1 +1851,5年生の漢字で[びょう]と読むのは?,俵,富,編,豊,1 +1852,5年生の漢字で[ひょう]と読むのは?,評,武,弁,防,1 +1853,5年生の漢字で[ひん]と読むのは?,貧,復,保,貿,1 +1854,5年生の漢字で[ふ]と読むのは?,布,複,墓,暴,1 +1855,5年生の漢字で[ふ]と読むのは?,婦,仏,報,務,1 +1856,5年生の漢字で[とみ]と読むのは?,富,編,豊,夢,1 +1857,5年生の漢字で[ぶ]と読むのは?,武,弁,防,迷,1 +1858,5年生の漢字で[ふく]と読むのは?,復,保,貿,綿,1 +1859,5年生の漢字で[ふく]と読むのは?,複,墓,暴,輸,1 +1860,5年生の漢字で[ぶつ]と読むのは?,仏,報,務,余,1 +1861,5年生の漢字で[へん]と読むのは?,編,豊,夢,預,1 +1862,5年生の漢字で[べん]と読むのは?,弁,防,迷,容,1 +1863,5年生の漢字で[ほ]と読むのは?,保,貿,綿,略,1 +1864,5年生の漢字で[はか]と読むのは?,墓,暴,輸,留,1 +1865,5年生の漢字で[ほう]と読むのは?,報,務,余,領,1 +1866,5年生の漢字で[ほう]と読むのは?,豊,夢,預,異,1 +1867,5年生の漢字で[ぼう]と読むのは?,防,迷,容,遺,1 +1868,5年生の漢字で[ぼう]と読むのは?,貿,綿,略,域,1 +1869,5年生の漢字で[ぼう]と読むのは?,暴,輸,留,宇,1 +1870,5年生の漢字で[む]と読むのは?,務,余,領,映,1 +1871,5年生の漢字で[む]と読むのは?,夢,預,異,延,1 +1872,5年生の漢字で[めい]と読むのは?,迷,容,遺,沿,1 +1873,5年生の漢字で[めん]と読むのは?,綿,略,域,我,1 +1874,5年生の漢字で[ゆ]と読むのは?,輸,留,宇,灰,1 +1875,5年生の漢字で[よ]と読むのは?,余,領,映,拡,1 +1876,5年生の漢字で[よ]と読むのは?,預,異,延,革,1 +1877,5年生の漢字で[よう]と読むのは?,容,遺,沿,閣,1 +1878,5年生の漢字で[りゃく]と読むのは?,略,域,我,割,1 +1879,5年生の漢字で[りゅう]と読むのは?,留,宇,灰,株,1 +1880,5年生の漢字で[りょう]と読むのは?,領,映,拡,干,1 +1881,6年生の漢字で[い]と読むのは?,異,延,革,巻,1 +1882,6年生の漢字で[い]と読むのは?,遺,沿,閣,看,1 +1883,6年生の漢字で[いき]と読むのは?,域,我,割,簡,1 +1884,6年生の漢字で[う]と読むのは?,宇,灰,株,危,1 +1885,6年生の漢字で[えい]と読むのは?,映,拡,干,机,1 +1886,6年生の漢字で[えん]と読むのは?,延,革,巻,揮,1 +1887,6年生の漢字で[えん]と読むのは?,沿,閣,看,貴,1 +1888,6年生の漢字で[が]と読むのは?,我,割,簡,疑,1 +1889,6年生の漢字で[はい]と読むのは?,灰,株,危,吸,1 +1890,6年生の漢字で[かく]と読むのは?,拡,干,机,供,1 +1891,6年生の漢字で[かく]と読むのは?,革,巻,揮,胸,1 +1892,6年生の漢字で[かく]と読むのは?,閣,看,貴,郷,1 +1893,6年生の漢字で[かつ]と読むのは?,割,簡,疑,勤,1 +1894,6年生の漢字で[かぶ]と読むのは?,株,危,吸,筋,1 +1895,6年生の漢字で[かん]と読むのは?,干,机,供,系,1 +1896,6年生の漢字で[かん]と読むのは?,巻,揮,胸,敬,1 +1897,6年生の漢字で[かん]と読むのは?,看,貴,郷,警,1 +1898,6年生の漢字で[かん]と読むのは?,簡,疑,勤,劇,1 +1899,6年生の漢字で[き]と読むのは?,危,吸,筋,激,1 +1900,6年生の漢字で[き]と読むのは?,机,供,系,穴,1 +1901,6年生の漢字で[き]と読むのは?,揮,胸,敬,絹,1 +1902,6年生の漢字で[き]と読むのは?,貴,郷,警,権,1 +1903,6年生の漢字で[ぎ]と読むのは?,疑,勤,劇,憲,1 +1904,6年生の漢字で[きゅう]と読むのは?,吸,筋,激,源,1 +1905,6年生の漢字で[きょう]と読むのは?,供,系,穴,厳,1 +1906,6年生の漢字で[きょう]と読むのは?,胸,敬,絹,己,1 +1907,6年生の漢字で[きょう]と読むのは?,郷,警,権,呼,1 +1908,6年生の漢字で[きん]と読むのは?,勤,劇,憲,誤,1 +1909,6年生の漢字で[きん]と読むのは?,筋,激,源,后,1 +1910,6年生の漢字で[けい]と読むのは?,系,穴,厳,考,1 +1911,6年生の漢字で[けい]と読むのは?,敬,絹,己,皇,1 +1912,6年生の漢字で[けい]と読むのは?,警,権,呼,紅,1 +1913,6年生の漢字で[げき]と読むのは?,劇,憲,誤,降,1 +1914,6年生の漢字で[げき]と読むのは?,激,源,后,鋼,1 +1915,6年生の漢字で[あな]と読むのは?,穴,厳,考,刻,1 +1916,6年生の漢字で[きぬ]と読むのは?,絹,己,皇,穀,1 +1917,6年生の漢字で[けん]と読むのは?,権,呼,紅,骨,1 +1918,6年生の漢字で[けん]と読むのは?,憲,誤,降,困,1 +1919,6年生の漢字で[げん]と読むのは?,源,后,鋼,砂,1 +1920,6年生の漢字で[げん]と読むのは?,厳,考,刻,座,1 +1921,6年生の漢字で[こ]と読むのは?,己,皇,穀,済,1 +1922,6年生の漢字で[こ]と読むのは?,呼,紅,骨,裁,1 +1923,6年生の漢字で[ご]と読むのは?,誤,降,困,策,1 +1924,6年生の漢字で[ごう]と読むのは?,后,鋼,砂,冊,1 +1925,6年生の漢字で[こう]と読むのは?,考,刻,座,蚕,1 +1926,6年生の漢字で[こう]と読むのは?,皇,穀,済,至,1 +1927,6年生の漢字で[こう]と読むのは?,紅,骨,裁,私,1 +1928,6年生の漢字で[こう]と読むのは?,降,困,策,姿,1 +1929,6年生の漢字で[こう]と読むのは?,鋼,砂,冊,視,1 +1930,6年生の漢字で[こく]と読むのは?,刻,座,蚕,詞,1 +1931,6年生の漢字で[こく]と読むのは?,穀,済,至,誌,1 +1932,6年生の漢字で[こつ]と読むのは?,骨,裁,私,磁,1 +1933,6年生の漢字で[こん]と読むのは?,困,策,姿,射,1 +1934,6年生の漢字で[さ]と読むのは?,砂,冊,視,捨,1 +1935,6年生の漢字で[ざ]と読むのは?,座,蚕,詞,尺,1 +1936,6年生の漢字で[さい]と読むのは?,済,至,誌,若,1 +1937,6年生の漢字で[さい]と読むのは?,裁,私,磁,樹,1 +1938,6年生の漢字で[さく]と読むのは?,策,姿,射,収,1 +1939,6年生の漢字で[さつ]と読むのは?,冊,視,捨,宗,1 +1940,6年生の漢字で[かいこ]と読むのは?,蚕,詞,尺,就,1 +1941,6年生の漢字で[し]と読むのは?,至,誌,若,衆,1 +1942,6年生の漢字で[し]と読むのは?,私,磁,樹,従,1 +1943,6年生の漢字で[し]と読むのは?,姿,射,収,縦,1 +1944,6年生の漢字で[し]と読むのは?,視,捨,宗,縮,1 +1945,6年生の漢字で[し]と読むのは?,詞,尺,就,熟,1 +1946,6年生の漢字で[し]と読むのは?,誌,若,衆,純,1 +1947,6年生の漢字で[じ]と読むのは?,磁,樹,従,処,1 +1948,6年生の漢字で[しゃ]と読むのは?,射,収,縦,署,1 +1949,6年生の漢字で[しゃ]と読むのは?,捨,宗,縮,諸,1 +1950,6年生の漢字で[しゃく]と読むのは?,尺,就,熟,除,1 +1951,6年生の漢字で[じゃく]と読むのは?,若,衆,純,将,1 +1952,6年生の漢字で[じゅ]と読むのは?,樹,従,処,傷,1 +1953,6年生の漢字で[しゅう]と読むのは?,収,縦,署,障,1 +1954,6年生の漢字で[しゅう]と読むのは?,宗,縮,諸,城,1 +1955,6年生の漢字で[しゅう]と読むのは?,就,熟,除,蒸,1 +1956,6年生の漢字で[しゅう]と読むのは?,衆,純,将,針,1 +1957,6年生の漢字で[じゅう]と読むのは?,従,処,傷,仁,1 +1958,6年生の漢字で[じゅう]と読むのは?,縦,署,障,垂,1 +1959,6年生の漢字で[しゅく]と読むのは?,縮,諸,城,推,1 +1960,6年生の漢字で[じゅく]と読むのは?,熟,除,蒸,寸,1 +1961,6年生の漢字で[じゅん]と読むのは?,純,将,針,盛,1 +1962,6年生の漢字で[ところ]と読むのは?,処,傷,仁,聖,1 +1963,6年生の漢字で[しょ]と読むのは?,署,障,垂,誠,1 +1964,6年生の漢字で[しょ]と読むのは?,諸,城,推,宣,1 +1965,6年生の漢字で[じょ]と読むのは?,除,蒸,寸,専,1 +1966,6年生の漢字で[しょう]と読むのは?,将,針,盛,泉,1 +1967,6年生の漢字で[しょう]と読むのは?,傷,仁,聖,洗,1 +1968,6年生の漢字で[しょう]と読むのは?,障,垂,誠,染,1 +1969,6年生の漢字で[じょう]と読むのは?,城,推,宣,善,1 +1970,6年生の漢字で[じょう]と読むのは?,蒸,寸,専,奏,1 +1971,6年生の漢字で[しん]と読むのは?,針,盛,泉,窓,1 +1972,6年生の漢字で[じん]と読むのは?,仁,聖,洗,創,1 +1973,6年生の漢字で[すい]と読むのは?,垂,誠,染,装,1 +1974,6年生の漢字で[すい]と読むのは?,推,宣,善,層,1 +1975,6年生の漢字で[すん]と読むのは?,寸,専,奏,操,1 +1976,6年生の漢字で[せい]と読むのは?,盛,泉,窓,蔵,1 +1977,6年生の漢字で[せい]と読むのは?,聖,洗,創,臓,1 +1978,6年生の漢字で[せい]と読むのは?,誠,染,装,存,1 +1979,6年生の漢字で[せん]と読むのは?,宣,善,層,尊,1 +1980,6年生の漢字で[せん]と読むのは?,専,奏,操,宅,1 +1981,6年生の漢字で[せん]と読むのは?,泉,窓,蔵,担,1 +1982,6年生の漢字で[せん]と読むのは?,洗,創,臓,探,1 +1983,6年生の漢字で[せん]と読むのは?,染,装,存,誕,1 +1984,6年生の漢字で[ぜん]と読むのは?,善,層,尊,段,1 +1985,6年生の漢字で[そう]と読むのは?,奏,操,宅,暖,1 +1986,6年生の漢字で[まど]と読むのは?,窓,蔵,担,値,1 +1987,6年生の漢字で[そう]と読むのは?,創,臓,探,宙,1 +1988,6年生の漢字で[そう]と読むのは?,装,存,誕,忠,1 +1989,6年生の漢字で[そう]と読むのは?,層,尊,段,著,1 +1990,6年生の漢字で[そう]と読むのは?,操,宅,暖,庁,1 +1991,6年生の漢字で[ぞう]と読むのは?,蔵,担,値,頂,1 +1992,6年生の漢字で[ぞう]と読むのは?,臓,探,宙,潮,1 +1993,6年生の漢字で[ぞん]と読むのは?,存,誕,忠,賃,1 +1994,6年生の漢字で[そん]と読むのは?,尊,段,著,痛,1 +1995,6年生の漢字で[たく]と読むのは?,宅,暖,庁,展,1 +1996,6年生の漢字で[たん]と読むのは?,担,値,頂,討,1 +1997,6年生の漢字で[たん]と読むのは?,探,宙,潮,党,1 +1998,6年生の漢字で[たん]と読むのは?,誕,忠,賃,糖,1 +1999,6年生の漢字で[だん]と読むのは?,段,著,痛,届,1 +2000,6年生の漢字で[だん]と読むのは?,暖,庁,展,難,1 +2001,6年生の漢字で[ち]と読むのは?,値,頂,討,乳,1 +2002,6年生の漢字で[ちゅう]と読むのは?,宙,潮,党,認,1 +2003,6年生の漢字で[ちゅう]と読むのは?,忠,賃,糖,納,1 +2004,6年生の漢字で[ちょ]と読むのは?,著,痛,届,脳,1 +2005,6年生の漢字で[ちょう]と読むのは?,庁,展,難,派,1 +2006,6年生の漢字で[ちょう]と読むのは?,頂,討,乳,拝,1 +2007,6年生の漢字で[しお]と読むのは?,潮,党,認,背,1 +2008,6年生の漢字で[ちん]と読むのは?,賃,糖,納,肺,1 +2009,6年生の漢字で[つう]と読むのは?,痛,届,脳,俳,1 +2010,6年生の漢字で[てん]と読むのは?,展,難,派,班,1 +2011,6年生の漢字で[とう]と読むのは?,討,乳,拝,晩,1 +2012,6年生の漢字で[とう]と読むのは?,党,認,背,否,1 +2013,6年生の漢字で[とう]と読むのは?,糖,納,肺,批,1 +2014,6年生の漢字で[かい]と読むのは?,届,脳,俳,秘,1 +2015,6年生の漢字で[なん]と読むのは?,難,派,班,腹,1 +2016,6年生の漢字で[にゅう]と読むのは?,乳,拝,晩,奮,1 +2017,6年生の漢字で[にん]と読むのは?,認,背,否,並,1 +2018,6年生の漢字で[のう]と読むのは?,納,肺,批,陛,1 +2019,6年生の漢字で[のう]と読むのは?,脳,俳,秘,閉,1 +2020,6年生の漢字で[は]と読むのは?,派,班,腹,片,1 +2021,6年生の漢字で[はい]と読むのは?,拝,晩,奮,補,1 +2022,6年生の漢字で[はい]と読むのは?,背,否,並,暮,1 +2023,6年生の漢字で[はい]と読むのは?,肺,批,陛,宝,1 +2024,6年生の漢字で[はい]と読むのは?,俳,秘,閉,訪,1 +2025,6年生の漢字で[はん]と読むのは?,班,腹,片,亡,1 +2026,6年生の漢字で[ばん]と読むのは?,晩,奮,補,忘,1 +2027,6年生の漢字で[いな]と読むのは?,否,並,暮,棒,1 +2028,6年生の漢字で[ひ]と読むのは?,批,陛,宝,枚,1 +2029,6年生の漢字で[ひ]と読むのは?,秘,閉,訪,幕,1 +2030,6年生の漢字で[ふく]と読むのは?,腹,片,亡,密,1 +2031,6年生の漢字で[ふん]と読むのは?,奮,拝,乳,討,1 +2032,6年生の漢字で[なみ]と読むのは?,並,背,認,党,1 +2033,6年生の漢字で[へい]と読むのは?,陛,肺,納,糖,1 +2034,6年生の漢字で[へい]と読むのは?,閉,俳,脳,届,1 +2035,6年生の漢字で[へん]と読むのは?,片,班,派,難,1 +2036,6年生の漢字で[ほ]と読むのは?,補,晩,拝,乳,1 +2037,6年生の漢字で[ぼ]と読むのは?,暮,否,背,認,1 +2038,6年生の漢字で[ほう]と読むのは?,宝,批,肺,納,1 +2039,6年生の漢字で[ほう]と読むのは?,訪,秘,俳,脳,1 +2040,6年生の漢字で[ぼう]と読むのは?,亡,腹,班,派,1 +2041,6年生の漢字で[ぼう]と読むのは?,忘,奮,晩,拝,1 +2042,6年生の漢字で[ぼう]と読むのは?,棒,並,否,背,1 +2043,6年生の漢字で[まい]と読むのは?,枚,陛,批,肺,1 +2044,6年生の漢字で[まく]と読むのは?,幕,閉,秘,俳,1 +2045,6年生の漢字で[みつ]と読むのは?,密,片,腹,班,1 +2046,6年生の漢字で[めい]と読むのは?,盟,補,奮,晩,1 +2047,6年生の漢字で[も]と読むのは?,模,暮,並,否,1 +2048,6年生の漢字で[やく]と読むのは?,訳,宝,陛,批,1 +2049,6年生の漢字で[ゆう]と読むのは?,郵,訪,閉,秘,1 +2050,6年生の漢字で[ゆう]と読むのは?,優,亡,片,腹,1 +2051,6年生の漢字で[よう]と読むのは?,幼,忘,補,奮,1 +2052,6年生の漢字で[よく]と読むのは?,欲,棒,暮,並,1 +2053,6年生の漢字で[よく]と読むのは?,翌,枚,宝,陛,1 +2054,6年生の漢字で[らん]と読むのは?,乱,幕,訪,閉,1 +2055,6年生の漢字で[らん]と読むのは?,卵,密,亡,片,1 +2056,6年生の漢字で[らん]と読むのは?,覧,盟,忘,補,1 +2057,6年生の漢字で[うら]と読むのは?,裏,模,棒,暮,1 +2058,6年生の漢字で[りつ]と読むのは?,律,訳,枚,宝,1 +2059,6年生の漢字で[りん]と読むのは?,臨,郵,幕,訪,1 +2060,6年生の漢字で[ろう]と読むのは?,朗,優,密,亡,1 +2061,6年生の漢字で[ろん]と読むのは?,論,幼,盟,忘,1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/db.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,16 @@ +#!/usr/bin/ruby +# coding: utf-8 + +require"rubygems" +require"pg" + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + res.each do |row| + puts row["question"].to_s + ":" + row["word1"].to_s + ":" + row["word2"].to_s + ":" + row["word3"].to_s + ":" + row["word4"].to_s + end +ensure + conn.close if conn +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/db.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,17 @@ +#!/usr/bin/ruby +# coding: utf-8 + +require"rubygems" +require"pg" + +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + q = "select question, word1, word2, word3, word4 from quiz" + res = conn.exec(q) + p res + res.each do |row| + puts row["question"].to_s + ":" + row["wordone"].to_s + ":" + row["wordtwo"].to_s + ":" + row["wordthi"].to_s + ":" + row["wordfou"].to_s + end +ensure + conn.close if conn +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/hantei.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,4 @@ +#!/usr/bin/ruby +# coding: utf-8 +def hantei(a, b, c, d) + if
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/index.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,20 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> +<title>Mackey Academy</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> +<body> +<p>Ver.0.8</p> +<div class="center01"> +<img src="ma.png" width="480" height="140"> +<img src="boss.jpg" width="480" height="320" alt="" title""> +<h2>ȳ桪</h2> +<a href="login.html"> +<button class="css3button"></button> +</a> +<p>ϤƤ<a href="add.html"></a></p> +<p><a href="read.html"></a></p> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/index.html~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,18 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>教育ソフトウェア</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> +<body> +<h1>test mode</h1> +<div class="center01"> +<h1>テストモード</h1> +<img src="boss.jpg" width="480" height="320" alt="スタート" title"スタート"> +<h2>テストクエスト開催中!</h2> +<a href="login.html"> +<button class="css3button">ログイン</button> +</a> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/intro.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,18 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> +<title>Mackey Academy</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> +<body> +<div class="center01"> +<img src="ma.png" width="480" height="140"> +</div> +<h1>´ʸֳؽٱ祷ƥMackey Academyγȯ</h1> +<p>ǯɤ⤿ΥͥåȤ䥲ʤɤѻ֤ӤƤǡͥ +Ȥ䥲λ֤ṳ̂ۤʿ⤤ˤ뤳Ȥ狼äǡͥåȤ䥲λ֤ΤޤٶˤƤ뤳ȤǤʤ顢뤳ȤǤΤǤϤʤȤΩƤäơǤʤRPGڤळȤMackey Academyפȯ롣ܸʸǤApachePosgreSQLRubyʤɤδĶΤȡCGIǤΥץꥱȯԤä</p> +<p>ʸ<a href="puti.pdf"></a></p> +<br><br><br> +<p>Mackey AcademyǥǤ<a href="index.html"></a></p> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/login.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,21 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> +<title></title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1></h1> +<div class="center01"> +<div> +<form method="POST" action="login.rb"> +<p> +<span>ID:</span><input type="text" name="id"><br><br> +<span>PASS:</span><input type="password" name="pass"><br><br> +<button class="css3button" type="submit" name="Battle" value="0"></button> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/login.html~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,21 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>ログイン</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1>ログイン</h1> +<div class="center01"> +<div> +<form method="POST" action="login.rb"> +<p> +<span>ID:</span><input type="text" name="id"><br><br> +<span>PASS:</span><input type="password" name="pass"><br><br> +<button class="css3button" type="submit" name="Battle" value="0">ログイン</button> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/login.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,90 @@ +#!/usr/bin/env ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "euc-jp") +print"Content-type: text/html; charset=euc-jp\n\n" + +number = c["id"] +pswd = c["pass"] +log = c["Battle"] +check = 0 +lvl = 0 +ep = 0 +qu = 0 +namae = "" +myhp = 0 +begin + conn = PGconn.connect('broy.e.koeki-u.ac.jp','','','','c112085','mackeyacademy','l3nl3q1u') + a = "select id, password, name, level, exp, quest from userdata" + ip = conn.exec(a) + ip.each do |row| + if number == row["id"] && pswd == row["password"] + lvl = row["level"] + ep = row["exp"] + qu = row["quest"] + namae = row["name"] + myhp = lvl.to_i * 100 + check = 1 + end + if number == row["id"] && log == "1" + lvl = row["level"] + ep = row["exp"] + qu = row["quest"] + namae = row["name"] + myhp = lvl.to_i * 100 + check = 1 + end + end +end +print"<html> +<head> +<meta http-equiv=\"Content-Type\" content=\"text/html; charset=euc-jp\"> +<title>桼Ͽ</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body>\n" +if check == 0 + print"<h1>Error</h1><p>⤦پǧƤƤ!</p> +<a href=\"login.html\"> +<button class=\"css3button\"></button></a>\n" +elsif check == 1 + print"<h1>λ</h1> +<p><span>Name:</span>#{namae}<br> +<span>Level:</span>#{lvl}<br> +<span>exp:</span>#{ep}</p> +<div class=\"center01\"> +<h1>ȥơ1</h1> +<h2>Ϥޤο</h2> +<img src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"\" title=\"\"> +<form method=\"POST\" action=\"battle.rb\"> +<h1>Ϥޤο</h1> +<p>Ф줷ͦ#{namae}Τ<br> +ͦԤˤμͦϤɬפ<br> +ݤͦԤǤ뤳ȤƤ졪</p> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"100\"></button>\n" + if qu > "0" + print"<h1>¤ο</h1> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"300\"></button>\n" + end + if qu > "1" + print"<h1></h1> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"500\"></button>\n" + end + if qu > "2" + print"<h1>濴--</h1> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"1000\"></button>\n" + end + print"<input type=\"hidden\" name=\"hp\" value=\"#{myhp}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{myhp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{namae}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{number}\"> +<input type=\"hidden\" name=\"count\" value=\"1\">\n" + +end + +print"</form></body> +</html>\n"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/login.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,87 @@ +#!/usr/bin/ruby +# coding: euc-jp +require 'rubygems' +require 'pg' +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print"Content-type: text/html; charset=utf-8\n\n" + +number = c["id"] +pswd = c["pass"] +log = c["Battle"] +check = 0 +lvl = 0 +ep = 0 +qu = 0 +namae = "" +myhp = 0 +begin + conn = PGconn.connect('127.0.0.1','','','','semi','masahiro','l3nl3q1u') + a = "select id, password, name, level, exp, quest from userdata" + ip = conn.exec(a) + ip.each do |row| + if number == row["id"] && pswd == row["password"] + lvl = row["level"] + ep = row["exp"] + qu = row["quest"] + namae = row["name"] + myhp = lvl.to_i * 100 + check = 1 + end + if number == row["id"] && log == "1" + lvl = row["level"] + ep = row["exp"] + qu = row["quest"] + namae = row["name"] + myhp = lvl.to_i * 100 + check = 1 + end + end +end +print"<html> +<head> +<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> +<title>桼Ͽ</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body>\n" +if check == 0 + print"<h1>Error</h1><p>⤦پǧƤƤ!</p> +<a href=\"login.html\"> +<button class=\"css3button\"></button></a>\n" +elsif check == 1 + print"<h1>λ</h1> +<p><span>Name:</span>#{namae}<br> +<span>Level:</span>#{lvl}<br> +<span>exp:</span>#{ep}</p> +<div class=\"center01\"> +<h1>ƥȥȥơ1</h1> +<h2>Ϥޤο</h2> +<img src=\"forest.jpg\" width=\"480\" height=\"320\" alt=\"\" title=\"\"> +<form method=\"POST\" action=\"battle.rb\"> +<h1>Ϥޤο</h1> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"100\"></button>\n" + if qu > "0" + print"<h1>¤ο</h1> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"300\"></button>\n" + end + if qu > "1" + print"<h1></h1> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"500\"></button>\n" + end + if qu > "2" + print"<h1>濴--</h1> +<button class=\"css3button\" type=\"submit\" name=\"thp\" value=\"1000\"></button>\n" + end + print"<input type=\"hidden\" name=\"hp\" value=\"#{myhp}\"> +<input type=\"hidden\" name=\"defohp\" value=\"#{myhp}\"> +<input type=\"hidden\" name=\"namae\" value=\"#{namae}\"> +<input type=\"hidden\" name=\"level\" value=\"#{lvl}\"> +<input type=\"hidden\" name=\"exp\" value=\"#{ep}\"> +<input type=\"hidden\" name=\"id\" value=\"#{number}\"> +<input type=\"hidden\" name=\"count\" value=\"1\">\n" + +end + +print"</form></body> +</html>\n"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/quest.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,24 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>テストクエスト</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1>テストクエスト</h1> +<div class="center01"> +<div> +<img border="1" src="forest.jpg" width="480" height="320" +alt="背景" title="背景"> +<h2>探索しよう!</h2> +<form method="POST" action="battle.rb"> +<button class="css3button" type="submit" name="Battle" value="1">Start</button> +<input type="hidden" name="hp" value="999"> +<input type="hidden" name="thp" value="300"> +<input type="hidden" name="count" value="1"> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/quest.html~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,23 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>テストクエスト</title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> + +<body> +<h1>テストクエスト</h1> +<div class="center01"> +<div> +<img border="1" src="forest.jpg" width="480" height="320" +alt="背景" title="背景"> +<h2>探索しよう!</h2> +<form method="POST" action="battle.rb"> +<button class="css3button" type="submit" name="Battle" value="1">Start</button> +<input type="hidden" name="hp" value="999"> +<input type="hidden" name="thp" value="300"> +</form> +</div> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/read.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,20 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> +<title></title> +<link rel="stylesheet" href="style.css" type="text/css"> +</head> +<body> +<div class="center01"> +<img src="ma.png" width="320" height="80"> +<h1>Ϥ</h1> +<p>ΥǤϷηäϤˤʤޤ<br> +Фۤɥ˹Ǥ衪<br> +⤹зμƤ<br> +⥭饯٥륢åפƤɤɤʤƤ<br> +<br> +Υץ쥤гعٶǤ㤦⡩</p> +<a href="index.html"><button class="css3button">BACK</button></a> +</div> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/readme.html Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,378 @@ + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <!-- + Modified from the Debian original for Ubuntu + Last updated: 2014-03-19 + See: https://launchpad.net/bugs/1288690 + --> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <title>Apache2 Ubuntu Default Page: It works</title> + <style type="text/css" media="screen"> + * { + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + } + + body, html { + padding: 3px 3px 3px 3px; + + background-color: #D8DBE2; + + font-family: Verdana, sans-serif; + font-size: 11pt; + text-align: center; + } + + div.main_page { + position: relative; + display: table; + + width: 800px; + + margin-bottom: 3px; + margin-left: auto; + margin-right: auto; + padding: 0px 0px 0px 0px; + + border-width: 2px; + border-color: #212738; + border-style: solid; + + background-color: #FFFFFF; + + text-align: center; + } + + div.page_header { + height: 99px; + width: 100%; + + background-color: #F5F6F7; + } + + div.page_header span { + margin: 15px 0px 0px 50px; + + font-size: 180%; + font-weight: bold; + } + + div.page_header img { + margin: 3px 0px 0px 40px; + + border: 0px 0px 0px; + } + + div.table_of_contents { + clear: left; + + min-width: 200px; + + margin: 3px 3px 3px 3px; + + background-color: #FFFFFF; + + text-align: left; + } + + div.table_of_contents_item { + clear: left; + + width: 100%; + + margin: 4px 0px 0px 0px; + + background-color: #FFFFFF; + + color: #000000; + text-align: left; + } + + div.table_of_contents_item a { + margin: 6px 0px 0px 6px; + } + + div.content_section { + margin: 3px 3px 3px 3px; + + background-color: #FFFFFF; + + text-align: left; + } + + div.content_section_text { + padding: 4px 8px 4px 8px; + + color: #000000; + font-size: 100%; + } + + div.content_section_text pre { + margin: 8px 0px 8px 0px; + padding: 8px 8px 8px 8px; + + border-width: 1px; + border-style: dotted; + border-color: #000000; + + background-color: #F5F6F7; + + font-style: italic; + } + + div.content_section_text p { + margin-bottom: 6px; + } + + div.content_section_text ul, div.content_section_text li { + padding: 4px 8px 4px 16px; + } + + div.section_header { + padding: 3px 6px 3px 6px; + + background-color: #8E9CB2; + + color: #FFFFFF; + font-weight: bold; + font-size: 112%; + text-align: center; + } + + div.section_header_red { + background-color: #CD214F; + } + + div.section_header_grey { + background-color: #9F9386; + } + + .floating_element { + position: relative; + float: left; + } + + div.table_of_contents_item a, + div.content_section_text a { + text-decoration: none; + font-weight: bold; + } + + div.table_of_contents_item a:link, + div.table_of_contents_item a:visited, + div.table_of_contents_item a:active { + color: #000000; + } + + div.table_of_contents_item a:hover { + background-color: #000000; + + color: #FFFFFF; + } + + div.content_section_text a:link, + div.content_section_text a:visited, + div.content_section_text a:active { + background-color: #DCDFE6; + + color: #000000; + } + + div.content_section_text a:hover { + background-color: #000000; + + color: #DCDFE6; + } + + div.validator { + } + </style> + </head> + <body> + <div class="main_page"> + <div class="page_header floating_element"> + <img src="/icons/ubuntu-logo.png" alt="Ubuntu Logo" class="floating_element"/> + <span class="floating_element"> + Apache2 Ubuntu Default Page + </span> + </div> +<!-- <div class="table_of_contents floating_element"> + <div class="section_header section_header_grey"> + TABLE OF CONTENTS + </div> + <div class="table_of_contents_item floating_element"> + <a href="#about">About</a> + </div> + <div class="table_of_contents_item floating_element"> + <a href="#changes">Changes</a> + </div> + <div class="table_of_contents_item floating_element"> + <a href="#scope">Scope</a> + </div> + <div class="table_of_contents_item floating_element"> + <a href="#files">Config files</a> + </div> + </div> +--> + <div class="content_section floating_element"> + + + <div class="section_header section_header_red"> + <div id="about"></div> + It works! + </div> + <div class="content_section_text"> + <p> + This is the default welcome page used to test the correct + operation of the Apache2 server after installation on Ubuntu systems. + It is based on the equivalent page on Debian, from which the Ubuntu Apache + packaging is derived. + If you can read this page, it means that the Apache HTTP server installed at + this site is working properly. You should <b>replace this file</b> (located at + <tt>/var/www/html/index.html</tt>) before continuing to operate your HTTP server. + </p> + + + <p> + If you are a normal user of this web site and don't know what this page is + about, this probably means that the site is currently unavailable due to + maintenance. + If the problem persists, please contact the site's administrator. + </p> + + </div> + <div class="section_header"> + <div id="changes"></div> + Configuration Overview + </div> + <div class="content_section_text"> + <p> + Ubuntu's Apache2 default configuration is different from the + upstream default configuration, and split into several files optimized for + interaction with Ubuntu tools. The configuration system is + <b>fully documented in + /usr/share/doc/apache2/README.Debian.gz</b>. Refer to this for the full + documentation. Documentation for the web server itself can be + found by accessing the <a href="/manual">manual</a> if the <tt>apache2-doc</tt> + package was installed on this server. + + </p> + <p> + The configuration layout for an Apache2 web server installation on Ubuntu systems is as follows: + </p> + <pre> +/etc/apache2/ +|-- apache2.conf +| `-- ports.conf +|-- mods-enabled +| |-- *.load +| `-- *.conf +|-- conf-enabled +| `-- *.conf +|-- sites-enabled +| `-- *.conf + </pre> + <ul> + <li> + <tt>apache2.conf</tt> is the main configuration + file. It puts the pieces together by including all remaining configuration + files when starting up the web server. + </li> + + <li> + <tt>ports.conf</tt> is always included from the + main configuration file. It is used to determine the listening ports for + incoming connections, and this file can be customized anytime. + </li> + + <li> + Configuration files in the <tt>mods-enabled/</tt>, + <tt>conf-enabled/</tt> and <tt>sites-enabled/</tt> directories contain + particular configuration snippets which manage modules, global configuration + fragments, or virtual host configurations, respectively. + </li> + + <li> + They are activated by symlinking available + configuration files from their respective + *-available/ counterparts. These should be managed + by using our helpers + <tt> + <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2enmod">a2enmod</a>, + <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2dismod">a2dismod</a>, + </tt> + <tt> + <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2ensite">a2ensite</a>, + <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2dissite">a2dissite</a>, + </tt> + and + <tt> + <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2enconf">a2enconf</a>, + <a href="http://manpages.debian.org/cgi-bin/man.cgi?query=a2disconf">a2disconf</a> + </tt>. See their respective man pages for detailed information. + </li> + + <li> + The binary is called apache2. Due to the use of + environment variables, in the default configuration, apache2 needs to be + started/stopped with <tt>/etc/init.d/apache2</tt> or <tt>apache2ctl</tt>. + <b>Calling <tt>/usr/bin/apache2</tt> directly will not work</b> with the + default configuration. + </li> + </ul> + </div> + + <div class="section_header"> + <div id="docroot"></div> + Document Roots + </div> + + <div class="content_section_text"> + <p> + By default, Ubuntu does not allow access through the web browser to + <em>any</em> file apart of those located in <tt>/var/www</tt>, + <a href="http://httpd.apache.org/docs/2.4/mod/mod_userdir.html">public_html</a> + directories (when enabled) and <tt>/usr/share</tt> (for web + applications). If your site is using a web document root + located elsewhere (such as in <tt>/srv</tt>) you may need to whitelist your + document root directory in <tt>/etc/apache2/apache2.conf</tt>. + </p> + <p> + The default Ubuntu document root is <tt>/var/www/html</tt>. You + can make your own virtual hosts under /var/www. This is different + to previous releases which provides better security out of the box. + </p> + </div> + + <div class="section_header"> + <div id="bugs"></div> + Reporting Problems + </div> + <div class="content_section_text"> + <p> + Please use the <tt>ubuntu-bug</tt> tool to report bugs in the + Apache2 package with Ubuntu. However, check <a + href="https://bugs.launchpad.net/ubuntu/+source/apache2">existing + bug reports</a> before reporting a new bug. + </p> + <p> + Please report bugs specific to modules (such as PHP and others) + to respective packages, not to the web server itself. + </p> + </div> + + + + + </div> + </div> + <div class="validator"> + <p> + <a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" /></a> + </p> + </div> + </body> +</html> +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/style.css Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,51 @@ +.main { + width: 100%; + border: 1px solid #000; +} +.main div { + width: 80%; + border: 1px solid #FF0000; + margin: 0 auto; +} +button.css3button{ + font-family: Arial, Helvetica, sans-serif; + font-size: 14px; + color: #ffffff; + padding: 10px 20px; + background: -moz-linear-gradient( + top, + #a3a3a3 0%, + #3b3b3b 50%, + #242424 50%, + #000000); + background: -webkit-gradient( + linear, left top, left bottom, + from(#a3a3a3), + color-stop(0.50, #3b3b3b), + color-stop(0.50, #242424), + to(#000000)); + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; + border: 1px solid #000000; + -moz-box-shadow: + 0px 1px 3px rgba(000,000,000,0.5), + inset 0px 0px 1px rgba(255,255,255,0.6); + -webkit-box-shadow: + 0px 1px 3px rgba(000,000,000,0.5), + inset 0px 0px 1px rgba(255,255,255,0.6); + box-shadow: + 0px 1px 3px rgba(000,000,000,0.5), + inset 0px 0px 1px rgba(255,255,255,0.6); + text-shadow: + 0px -1px 0px rgba(000,000,000,1), + 0px 1px 0px rgba(255,255,255,0.2); +} +.center01 { + max-width:600px; + margin:0 auto; +} +span { +display: inline-block; +width: 7em; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/style.css~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,47 @@ +.main { + width: 100%; + border: 1px solid #000; +} +.main div { + width: 80%; + border: 1px solid #FF0000; + margin: 0 auto; +} +button.css3button{ + font-family: Arial, Helvetica, sans-serif; + font-size: 14px; + color: #ffffff; + padding: 10px 20px; + background: -moz-linear-gradient( + top, + #a3a3a3 0%, + #3b3b3b 50%, + #242424 50%, + #000000); + background: -webkit-gradient( + linear, left top, left bottom, + from(#a3a3a3), + color-stop(0.50, #3b3b3b), + color-stop(0.50, #242424), + to(#000000)); + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; + border: 1px solid #000000; + -moz-box-shadow: + 0px 1px 3px rgba(000,000,000,0.5), + inset 0px 0px 1px rgba(255,255,255,0.6); + -webkit-box-shadow: + 0px 1px 3px rgba(000,000,000,0.5), + inset 0px 0px 1px rgba(255,255,255,0.6); + box-shadow: + 0px 1px 3px rgba(000,000,000,0.5), + inset 0px 0px 1px rgba(255,255,255,0.6); + text-shadow: + 0px -1px 0px rgba(000,000,000,1), + 0px 1px 0px rgba(255,255,255,0.2); +} +.center01 { + max-width:600px; + margin:0 auto; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/test.rb Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,77 @@ +#!/usr/bin/ruby +# coding: utf-8 + +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print "Content-type: text/html; charset=utf-8\n\n" + +check = c["answer"] +quiznum = c["dat"] + +srand +number=rand(1060) +num = 0 +damage = "" +quiz = "" +ansone = "" +anstwo = "" +ansthi = "" +ansfou = "" +anstrue = "" +open("data.txt", "r:utf-8") do |list| + while line = list.gets + if /(\d+),(\S+),(\S+),(\S+),(\S+),(\S+),(\d)/ =~ line + if quiznum.to_i == $1.to_i + if check.to_i == $7.to_i + damage = "攻撃成功!" + else + damage = "攻撃失敗!" + end + end + if number.to_i == $1.to_i + num = $1.to_i + quiz = $2.to_s + ansone = $3.to_s + anstwo = $4.to_s + ansthi = $5.to_s + ansfou = $6.to_s + anstrue = $7.to_i + end + end + end +end + + + +printf("<html> +<head> +<title>きみのこうげきだよ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>きみのこうげきだよ</h1> +<h2>#{damage}</h2> +<p>No.#{number}</p> +<div class=\"main\"> +<div> +<img border=\"1\" src=\"maou.png\" width=\"480\" height=\"320\" +alt=\"まおうのがぞうっぽいよ\" title=\"まおう\"> + +<h2>問題</h2> +<p>%s</p> + +<form method=\"POST\" action=\"ans.rb\"> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"1\">%s</bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"2\">%s</bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"3\">%s<br></bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"4\">%s<br></bu\ +tton> +<input type=\"hidden\" name=\"dat\" value=\"%d\"> +</form> +</div> +</div> +</body> +</html>", quiz, ansone, anstwo, ansthi, ansfou, num)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/staff/mackey/academy/test.rb~ Thu Jul 14 22:23:45 2016 +0900 @@ -0,0 +1,77 @@ +#!/usr/bin/ruby +# coding: utf-8 + +require 'cgi' +c = CGI.new(:accept_charset => "utf-8") +print "Content-type: text/html; charset=utf-8\n\n" + +check = c["answer"] +quiznum = c["dat"] + +srand +number=rand(1060) +num = 0 +damage = "" +quiz = "" +ansone = "" +anstwo = "" +ansthi = "" +ansfou = "" +anstrue = "" +open("data.txt", "r:utf-8") do |list| + while line = list.gets + if /(\d+),(\S+),(\S+),(\S+),(\S+),(\S+),(\d)/ =~ line + if quiznum.to_i == $1.to_i + if check.to_i == $7.to_i + damage = "攻撃成功!" + else + damage = "攻撃失敗!" + end + end + if number.to_i == $1.to_i + num = $1.to_i + quiz = $2.to_s + ansone = $3.to_s + anstwo = $4.to_s + ansthi = $5.to_s + ansfou = $6.to_s + anstrue = $7.to_i + end + end + end +end + + + +printf("<html> +<head> +<title>きみのこうげきだよ!</title> +<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"> +</head> +<body> +<h1>きみのこうげきだよ</h1> +<h2>#{damage}</h2> +<p>No.#{number}</p> +<div class=\"main\"> +<div> +<img border=\"1\" src=\"maou.png\" width=\"480\" height=\"320\" +alt=\"まおうのがぞうっぽいよ\" title=\"まおう\"> + +<h2>問題</h2> +<p>%s</p> + +<form method=\"POST\" action=\"ans.rb\"> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"1\">%s</bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"2\">%s</bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"3\">%s<br></bu\ +tton> +<button class=\"css3button\" type=\"submit\" name=\"answer\" value=\"4\">%s<br></bu\ +tton> +<input type=\"hidden\" name=\"dat\" value=\"%d\"> +</form> +</div> +</div> +</body> +</html>", quiz, ansone, anstwo, ansthi, ansfou, num)