From 32f95ec343e11687c35b595c779f10322bd76402 Mon Sep 17 00:00:00 2001 From: Miraty Date: Fri, 22 Mar 2019 21:39:49 +0100 Subject: [PATCH] =?UTF-8?q?Grosse=20m=C3=A0j?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Retrait de la base de donnée - Compil LESS côté serveur - Ajout d'une liste de services & suppression de plein de pages - Ajout du code Konami --- 404.php | 6 +- LICENSE | 661 + LICENSE.html | 748 + LICENSE.md | 660 + README.md | 41 +- abcdefg/polices/harry.ttf | Bin 0 -> 27432 bytes abcdefg/polices/hocuspocus.ttf | Bin 0 -> 368476 bytes abcdefg/polices/minecraft.ttf | Bin 0 -> 14488 bytes abcdefg/polices/simplicity.ttf | Bin 0 -> 161952 bytes abcdefg/polices/splatch.ttf | Bin 0 -> 10960 bytes abcdefg/polices/traveling.ttf | Bin 0 -> 85604 bytes abcdefg/polices/ubuntu-title.ttf | Bin 0 -> 22268 bytes abcdefg/polices/varsity.ttf | Bin 0 -> 26572 bytes aleatoire.php | 63 - antmusique.php | 44 - apropos.php | 54 - bdd.sql | 296 - bibli/animate.min.css | 11 + bibli/fontello/{LICENSE.txt => LICENSE} | 0 bibli/fontello/README.txt | 75 - bibli/konami.js | 151 + bibli/less.js | 12522 ---------------- bibli/less.min.js | 18 - bibli/lessphp/LICENSE | 660 + bibli/lessphp/README.md | 96 + bibli/lessphp/lessc.inc.php | 3880 +++++ bibli/normalize.css | 10 +- bibli/sense3/.eslintrc | 50 - bibli/sense3/.gitlab-ci.yml | 30 - bibli/sense3/img/dioAmazon-300_250-xx.png | Bin 7950 -> 16045 bytes bibli/sense3/img/dioFacebook-300_250-xx.png | Bin 6811 -> 12512 bytes bibli/sense3/img/dioGafam-300_250-xx.png | Bin 7815 -> 15297 bytes bibli/sense3/img/dioGoogle-300_250-xx.png | Bin 7143 -> 16991 bytes bibli/sense3/img/dioMicrosoft-300_250-xx.png | Bin 5754 -> 9880 bytes .../sense3/img/icons/adetect-300_250.php | 44 +- bibli/sense3/img/icons/adetect-728_90.php | 19 + bibli/ubuntu/CONTRIBUTING.txt | 21 - bibli/ubuntu/FONTLOG.txt | 292 - bibli/ubuntu/LICENCE-FAQ.txt | 177 - bibli/ubuntu/{LICENCE.txt => LICENSE} | 0 bibli/ubuntu/README.txt | 16 - bibli/ubuntu/TRADEMARKS.txt | 4 - bibli/ubuntu/copyright.txt | 5 - cave.definition.php | 39 - cave.mdr.php | 30 - cave.module.php | 193 - cave.navigateur.php | 95 - cave.os.php | 123 - cgu.php | 323 +- commentaire.php | 220 - confirmationlien.php | 119 - connexion.php | 134 - css/base.less | 31 +- css/gomez.css | 397 + deconnexion.php | 38 - fourmiliere.php | 634 - {media => img}/404fourmie.png | Bin img/agpl.png | Bin 0 -> 8471 bytes {media/logo => img}/ant.png | Bin {media/logo => img}/antgris.png | Bin {media/logo => img}/antorigine.png | Bin {media/logo => img}/antpetit.png | Bin {media/logo => img}/antpetitgris.png | Bin img/favicon.ico | Bin 0 -> 198 bytes img/favicon.png | Bin 0 -> 210 bytes {media => img}/logomastodon.svg | 0 img/non-pub-horizontale.png | Bin 0 -> 16412 bytes img/non-pub-horizontale.xcf | Bin 0 -> 49274 bytes inc/codefourmie.php | 54 - inc/debut.php | 118 +- inc/footer.php | 33 +- inc/login.php | 25 - inc/loginsbdd.php | 4 - inc/page.php | 20 + index.php | 169 +- js/editeur.js | 29 - js/menu.js | 0 js/os.js | 13 - licences/cecill.html | 1033 -- licences/fontello.txt | 129 - licences/less.txt | 176 - licences/lftcqtv.html | 20 - licences/normalize.txt | 8 - licences/sense3.txt | 22 - liste_des_nombres.php | 7 - media/2048.png | Bin 15445 -> 0 bytes media/2048.xpi | Bin 73189 -> 0 bytes media/404fourmieorigine.png | Bin 43711 -> 0 bytes media/728x90.xcf | Bin 1040427 -> 0 bytes media/activerprotection.png | Bin 19655 -> 0 bytes media/activerprotectionfondblanc.png | Bin 18923 -> 0 bytes media/am1.mp3 | Bin 1881929 -> 0 bytes media/am1.png | Bin 1539595 -> 0 bytes media/am10.mp3 | Bin 4014847 -> 0 bytes media/am10.png | Bin 1625241 -> 0 bytes media/am2.mp3 | Bin 2411081 -> 0 bytes media/am2.png | Bin 1885061 -> 0 bytes media/am3.mp3 | Bin 2766665 -> 0 bytes media/am3.png | Bin 25445 -> 0 bytes media/am4.mp3 | Bin 3354185 -> 0 bytes media/am4.png | Bin 880047 -> 0 bytes media/am5.mp3 | Bin 4184777 -> 0 bytes media/am5.png | Bin 96809 -> 0 bytes media/am6.mp3 | Bin 3919433 -> 0 bytes media/am6.png | Bin 1305764 -> 0 bytes media/am7.mp3 | Bin 3913289 -> 0 bytes media/am7.png | Bin 1378151 -> 0 bytes media/am8.mp3 | Bin 2985161 -> 0 bytes media/am8.png | Bin 1398595 -> 0 bytes media/am9.mp3 | Bin 4834883 -> 0 bytes media/am9.png | Bin 1068858 -> 0 bytes media/antmusiques.zip | Bin 33888334 -> 0 bytes media/cookie.png | Bin 16787 -> 0 bytes media/favicon.ico | Bin 318 -> 0 bytes media/ghostery.png | Bin 47392 -> 0 bytes media/httpspartout.png | Bin 21363 -> 0 bytes media/logo/alt/ant1.jpg | Bin 75827 -> 0 bytes media/logo/alt/ant1.png | Bin 302921 -> 0 bytes media/logo/alt/ant2.jpg | Bin 229824 -> 0 bytes media/logo/alt/ant2.png | Bin 696677 -> 0 bytes media/logo/alt/ant3.jpg | Bin 143160 -> 0 bytes media/logo/alt/ant3.png | Bin 513967 -> 0 bytes media/logo/alt/ant4.jpg | Bin 104627 -> 0 bytes media/logo/alt/ant4.png | Bin 399345 -> 0 bytes media/logo/alt/ant5.jpg | Bin 120434 -> 0 bytes media/logo/alt/ant5.png | Bin 427973 -> 0 bytes media/logo/alt/ant6.jpg | Bin 69270 -> 0 bytes media/logo/alt/ant6.png | Bin 259420 -> 0 bytes media/logo/alt/ant7.jpg | Bin 218216 -> 0 bytes media/logo/alt/ant7.png | Bin 877301 -> 0 bytes media/module/wappalyser.png | Bin 20681 -> 0 bytes media/nav/brave.png | Bin 7518 -> 0 bytes media/nav/chrome.png | Bin 8503 -> 0 bytes media/nav/chromium.png | Bin 7473 -> 0 bytes media/nav/cliqz.png | Bin 5108 -> 0 bytes media/nav/cyberfox.png | Bin 14388 -> 0 bytes media/nav/edge.png | Bin 2029 -> 0 bytes media/nav/falkon.png | Bin 7386 -> 0 bytes media/nav/firefox.png | Bin 11210 -> 0 bytes media/nav/firefoxdeveloperedition.png | Bin 11928 -> 0 bytes media/nav/firefoxesr.png | Bin 15360 -> 0 bytes media/nav/gnomeweb.png | Bin 16398 -> 0 bytes media/nav/icecat.png | Bin 19590 -> 0 bytes media/nav/iceweasel.png | Bin 15889 -> 0 bytes media/nav/internetexplorer.png | Bin 12718 -> 0 bytes media/nav/konqueror.png | Bin 27315 -> 0 bytes media/nav/maxthon.png | Bin 6061 -> 0 bytes media/nav/midori.png | Bin 11926 -> 0 bytes media/nav/nightly.png | Bin 11150 -> 0 bytes media/nav/opera.png | Bin 6143 -> 0 bytes media/nav/palemoon.png | Bin 16393 -> 0 bytes media/nav/safari.png | Bin 14605 -> 0 bytes media/nav/seamonkey.png | Bin 11829 -> 0 bytes media/nav/tor.png | Bin 13982 -> 0 bytes media/nav/torch.png | Bin 9427 -> 0 bytes media/nav/vivaldi.png | Bin 6709 -> 0 bytes media/nav/waterfox.png | Bin 8018 -> 0 bytes media/nav/yandex.png | Bin 6189 -> 0 bytes media/nb/cat.png | Bin 4685 -> 0 bytes media/nb/cet.png | Bin 3657 -> 0 bytes media/nb/de.png | Bin 4302 -> 0 bytes media/nb/in.png | Bin 2113 -> 0 bytes media/nb/noeuf.png | Bin 3963 -> 0 bytes media/nb/sinc.png | Bin 4306 -> 0 bytes media/nb/sis.png | Bin 3762 -> 0 bytes media/nb/troi.png | Bin 4485 -> 0 bytes media/nb/uite.png | Bin 3143 -> 0 bytes media/non-pub-horizontale.png | Bin 8367 -> 0 bytes media/onglet/brave.png | Bin 1472249 -> 0 bytes media/onglet/chrome.png | Bin 20687 -> 0 bytes media/onglet/chromium.png | Bin 20687 -> 0 bytes media/onglet/cliqz.png | Bin 1430189 -> 0 bytes media/onglet/cyberfox.png | Bin 117888 -> 0 bytes media/onglet/edge.png | Bin 10124 -> 0 bytes media/onglet/falkon.png | Bin 764224 -> 0 bytes media/onglet/firefox.png | Bin 26995 -> 0 bytes media/onglet/firefoxdeveloperedition.png | Bin 20366 -> 0 bytes media/onglet/gnomeweb.png | Bin 30396 -> 0 bytes media/onglet/internetexplorer.png | Bin 20336 -> 0 bytes media/onglet/konqueror.png | Bin 624025 -> 0 bytes media/onglet/maxthon.png | Bin 217968 -> 0 bytes media/onglet/midori.png | Bin 24806 -> 0 bytes media/onglet/opera.png | Bin 218649 -> 0 bytes media/onglet/palemoon.png | Bin 70838 -> 0 bytes media/onglet/safari.png | Bin 240451 -> 0 bytes media/onglet/seamonkey.png | Bin 31606 -> 0 bytes media/onglet/tor.png | Bin 123136 -> 0 bytes media/onglet/torch.png | Bin 33658 -> 0 bytes media/onglet/vivaldi.png | Bin 1536894 -> 0 bytes media/onglet/waterfox.png | Bin 27624 -> 0 bytes media/onglet/yandex.png | Bin 819675 -> 0 bytes media/oslogo/4MLinux.png | Bin 3211 -> 0 bytes media/oslogo/AIX.png | Bin 1910 -> 0 bytes media/oslogo/ALT.png | Bin 4217 -> 0 bytes media/oslogo/Alpine.png | Bin 972 -> 0 bytes media/oslogo/Amazon.png | Bin 2193 -> 0 bytes media/oslogo/Android.png | Bin 4217 -> 0 bytes media/oslogo/Apple.png | Bin 380 -> 0 bytes media/oslogo/Arch.png | Bin 1182 -> 0 bytes media/oslogo/BOSS.png | Bin 3211 -> 0 bytes media/oslogo/Calculate.png | Bin 3211 -> 0 bytes media/oslogo/Canaima.png | Bin 2193 -> 0 bytes media/oslogo/CentOS.png | Bin 1212 -> 0 bytes media/oslogo/Chakra.png | Bin 2193 -> 0 bytes media/oslogo/ClearOS.png | Bin 4217 -> 0 bytes media/oslogo/Cloud.png | Bin 4196 -> 0 bytes media/oslogo/Cobalt.png | Bin 1943 -> 0 bytes media/oslogo/CoreOS.png | Bin 2193 -> 0 bytes media/oslogo/Crux.png | Bin 4217 -> 0 bytes media/oslogo/Darwin.png | Bin 851 -> 0 bytes media/oslogo/Debian.png | Bin 1276 -> 0 bytes media/oslogo/Deepin.png | Bin 3211 -> 0 bytes media/oslogo/Devuan.png | Bin 657 -> 0 bytes media/oslogo/DragonFly.png | Bin 1826 -> 0 bytes media/oslogo/Eisfair.png | Bin 2426 -> 0 bytes media/oslogo/Fedora.png | Bin 742 -> 0 bytes media/oslogo/Foresight.png | Bin 4196 -> 0 bytes media/oslogo/FreeBSD.png | Bin 2562 -> 0 bytes media/oslogo/Frugalware.png | Bin 3190 -> 0 bytes media/oslogo/Fuduntu.png | Bin 4196 -> 0 bytes media/oslogo/Generations.png | Bin 3193 -> 0 bytes media/oslogo/Gentoo.png | Bin 1890 -> 0 bytes media/oslogo/Gobo.png | Bin 2193 -> 0 bytes media/oslogo/HPUX.png | Bin 1152 -> 0 bytes media/oslogo/Haiku.png | Bin 4217 -> 0 bytes media/oslogo/Handy.png | Bin 1671 -> 0 bytes media/oslogo/HipServ.png | Bin 811 -> 0 bytes media/oslogo/IPFire.png | Bin 2763 -> 0 bytes media/oslogo/KaOS.png | Bin 2257 -> 0 bytes media/oslogo/Korora.png | Bin 2193 -> 0 bytes media/oslogo/LFS.png | Bin 2193 -> 0 bytes media/oslogo/Linaro.png | Bin 4217 -> 0 bytes media/oslogo/Lunar.png | Bin 3211 -> 0 bytes media/oslogo/Mageia.png | Bin 1911 -> 0 bytes media/oslogo/Mandrake.png | Bin 451 -> 0 bytes media/oslogo/Manjaro.png | Bin 4196 -> 0 bytes media/oslogo/Mer.png | Bin 1411 -> 0 bytes media/oslogo/Minix.png | Bin 1882 -> 0 bytes media/oslogo/Mint.png | Bin 1268 -> 0 bytes media/oslogo/NeoKylin.png | Bin 2207 -> 0 bytes media/oslogo/NetBSD.png | Bin 1584 -> 0 bytes media/oslogo/Netrunner.png | Bin 4217 -> 0 bytes media/oslogo/NixOS.png | Bin 3211 -> 0 bytes media/oslogo/OpenBSD.png | Bin 1876 -> 0 bytes media/oslogo/OpenMamba.png | Bin 4217 -> 0 bytes media/oslogo/OpenMandriva.png | Bin 2193 -> 0 bytes media/oslogo/Oracle.png | Bin 2066 -> 0 bytes media/oslogo/PCLinuxOS.png | Bin 2224 -> 0 bytes media/oslogo/PLD.png | Bin 952 -> 0 bytes media/oslogo/Parsix.png | Bin 2193 -> 0 bytes media/oslogo/Pear.png | Bin 2193 -> 0 bytes media/oslogo/Peppermint.png | Bin 4217 -> 0 bytes media/oslogo/Pisi.png | Bin 2193 -> 0 bytes media/oslogo/Porteus.png | Bin 4217 -> 0 bytes media/oslogo/Puppy.png | Bin 4196 -> 0 bytes media/oslogo/QNX.png | Bin 4217 -> 0 bytes media/oslogo/QTS.png | Bin 1769 -> 0 bytes media/oslogo/Qubes.png | Bin 979 -> 0 bytes media/oslogo/ROSA.png | Bin 4217 -> 0 bytes media/oslogo/Raspbian.png | Bin 2158 -> 0 bytes media/oslogo/ReactOS.png | Bin 3019 -> 0 bytes media/oslogo/RedFlag.png | Bin 2193 -> 0 bytes media/oslogo/RedHat.png | Bin 469 -> 0 bytes media/oslogo/Rubix.png | Bin 1403 -> 0 bytes media/oslogo/SMEServer.png | Bin 3211 -> 0 bytes media/oslogo/SMS.png | Bin 2193 -> 0 bytes media/oslogo/SUSE.png | Bin 2574 -> 0 bytes media/oslogo/Sabayon.png | Bin 3211 -> 0 bytes media/oslogo/SalentOS.png | Bin 2706 -> 0 bytes media/oslogo/Salix.png | Bin 2193 -> 0 bytes media/oslogo/Scientific.png | Bin 3925 -> 0 bytes media/oslogo/Semplice.png | Bin 1925 -> 0 bytes media/oslogo/Slackware.png | Bin 2551 -> 0 bytes media/oslogo/Slax.png | Bin 4217 -> 0 bytes media/oslogo/SliTaz.png | Bin 2193 -> 0 bytes media/oslogo/Solus.png | Bin 892 -> 0 bytes media/oslogo/SolusOS.png | Bin 4217 -> 0 bytes media/oslogo/SolydXK.png | Bin 2193 -> 0 bytes media/oslogo/StartOS.png | Bin 1541 -> 0 bytes media/oslogo/SteamOS.png | Bin 1591 -> 0 bytes media/oslogo/SunOS.png | Bin 2754 -> 0 bytes media/oslogo/Synology.png | Bin 4196 -> 0 bytes media/oslogo/Tails.png | Bin 2193 -> 0 bytes media/oslogo/Tanglu.png | Bin 2193 -> 0 bytes media/oslogo/TinyCore.png | Bin 1193 -> 0 bytes media/oslogo/Tizen.png | Bin 1933 -> 0 bytes media/oslogo/Trisquel.png | Bin 4217 -> 0 bytes media/oslogo/Trustix.png | Bin 2155 -> 0 bytes media/oslogo/Turbo.png | Bin 4217 -> 0 bytes media/oslogo/Ubuntu.png | Bin 1164 -> 0 bytes media/oslogo/UltimateEdition.png | Bin 2193 -> 0 bytes media/oslogo/Vector.png | Bin 2292 -> 0 bytes media/oslogo/Void.png | Bin 1202 -> 0 bytes media/oslogo/VortexBox.png | Bin 3193 -> 0 bytes media/oslogo/Win2000.png | Bin 4196 -> 0 bytes media/oslogo/Win8.png | Bin 817 -> 0 bytes media/oslogo/WinVista.png | Bin 2691 -> 0 bytes media/oslogo/WinXP.png | Bin 2512 -> 0 bytes media/oslogo/Zenwalk.png | Bin 3211 -> 0 bytes media/oslogo/Zorin.png | Bin 4217 -> 0 bytes media/oslogo/antiX.png | Bin 1718 -> 0 bytes media/oslogo/elementaryOS.png | Bin 1613 -> 0 bytes media/oslogo/free-eos.png | Bin 1676 -> 0 bytes media/oslogo/gNewSense.png | Bin 1492 -> 0 bytes media/oslogo/iycc.png | Bin 1164 -> 0 bytes media/oslogo/openSUSE.png | Bin 908 -> 0 bytes media/oslogo/pfSense.png | Bin 1169 -> 0 bytes media/oslogo/unknown.png | Bin 31826 -> 0 bytes media/privacy.png | Bin 39872 -> 0 bytes media/tntblanc.png | Bin 62478 -> 0 bytes media/tntbleu.png | Bin 30895 -> 0 bytes media/tntgris.png | Bin 29712 -> 0 bytes media/tntnoir.png | Bin 29099 -> 0 bytes media/ublockpopup.png | Bin 13264 -> 0 bytes media/wappalyser.png | Bin 17280 -> 0 bytes monnavigateur.php | 73 - navigateur.php | 86 + polices/condense.ttf | Bin 350420 -> 0 bytes polices/fin-it.ttf | Bin 409608 -> 0 bytes polices/fin.ttf | Bin 415552 -> 0 bytes polices/gras-it.ttf | Bin 356980 -> 0 bytes polices/gras.ttf | Bin 333616 -> 0 bytes polices/moyen-it.ttf | Bin 366992 -> 0 bytes polices/moyen.ttf | Bin 341324 -> 0 bytes polices/ubuntu-it.ttf | Bin 386440 -> 0 bytes polices/ubuntu.ttf | Bin 353824 -> 0 bytes signup.php | 143 - style/ant.less | 1 + style/vrac.less | 818 + 329 files changed, 8598 insertions(+), 17413 deletions(-) create mode 100755 LICENSE create mode 100755 LICENSE.html create mode 100755 LICENSE.md create mode 100755 abcdefg/polices/harry.ttf create mode 100755 abcdefg/polices/hocuspocus.ttf create mode 100755 abcdefg/polices/minecraft.ttf create mode 100755 abcdefg/polices/simplicity.ttf create mode 100755 abcdefg/polices/splatch.ttf create mode 100755 abcdefg/polices/traveling.ttf create mode 100755 abcdefg/polices/ubuntu-title.ttf create mode 100755 abcdefg/polices/varsity.ttf delete mode 100755 aleatoire.php delete mode 100755 antmusique.php delete mode 100755 apropos.php delete mode 100755 bdd.sql create mode 100644 bibli/animate.min.css rename bibli/fontello/{LICENSE.txt => LICENSE} (100%) delete mode 100755 bibli/fontello/README.txt create mode 100644 bibli/konami.js delete mode 100755 bibli/less.js delete mode 100755 bibli/less.min.js create mode 100755 bibli/lessphp/LICENSE create mode 100755 bibli/lessphp/README.md create mode 100755 bibli/lessphp/lessc.inc.php delete mode 100755 bibli/sense3/.eslintrc delete mode 100755 bibli/sense3/.gitlab-ci.yml rename licences/aboutant.html => bibli/sense3/img/icons/adetect-300_250.php (68%) create mode 100755 bibli/sense3/img/icons/adetect-728_90.php delete mode 100755 bibli/ubuntu/CONTRIBUTING.txt delete mode 100755 bibli/ubuntu/FONTLOG.txt delete mode 100755 bibli/ubuntu/LICENCE-FAQ.txt rename bibli/ubuntu/{LICENCE.txt => LICENSE} (100%) delete mode 100755 bibli/ubuntu/README.txt delete mode 100755 bibli/ubuntu/TRADEMARKS.txt delete mode 100755 bibli/ubuntu/copyright.txt delete mode 100755 cave.definition.php delete mode 100755 cave.mdr.php delete mode 100755 cave.module.php delete mode 100755 cave.navigateur.php delete mode 100755 cave.os.php delete mode 100755 commentaire.php delete mode 100755 confirmationlien.php delete mode 100755 connexion.php create mode 100644 css/gomez.css delete mode 100755 deconnexion.php delete mode 100755 fourmiliere.php rename {media => img}/404fourmie.png (100%) create mode 100755 img/agpl.png rename {media/logo => img}/ant.png (100%) rename {media/logo => img}/antgris.png (100%) rename {media/logo => img}/antorigine.png (100%) rename {media/logo => img}/antpetit.png (100%) rename {media/logo => img}/antpetitgris.png (100%) create mode 100755 img/favicon.ico create mode 100755 img/favicon.png rename {media => img}/logomastodon.svg (100%) create mode 100755 img/non-pub-horizontale.png create mode 100755 img/non-pub-horizontale.xcf delete mode 100755 inc/codefourmie.php delete mode 100755 inc/login.php delete mode 100755 inc/loginsbdd.php create mode 100755 inc/page.php delete mode 100755 js/editeur.js mode change 100755 => 100644 js/menu.js delete mode 100755 js/os.js delete mode 100755 licences/cecill.html delete mode 100755 licences/fontello.txt delete mode 100755 licences/less.txt delete mode 100755 licences/lftcqtv.html delete mode 100755 licences/normalize.txt delete mode 100755 licences/sense3.txt delete mode 100755 liste_des_nombres.php delete mode 100755 media/2048.png delete mode 100755 media/2048.xpi delete mode 100755 media/404fourmieorigine.png delete mode 100755 media/728x90.xcf delete mode 100755 media/activerprotection.png delete mode 100755 media/activerprotectionfondblanc.png delete mode 100755 media/am1.mp3 delete mode 100755 media/am1.png delete mode 100755 media/am10.mp3 delete mode 100755 media/am10.png delete mode 100755 media/am2.mp3 delete mode 100755 media/am2.png delete mode 100755 media/am3.mp3 delete mode 100755 media/am3.png delete mode 100755 media/am4.mp3 delete mode 100755 media/am4.png delete mode 100755 media/am5.mp3 delete mode 100755 media/am5.png delete mode 100755 media/am6.mp3 delete mode 100755 media/am6.png delete mode 100755 media/am7.mp3 delete mode 100755 media/am7.png delete mode 100755 media/am8.mp3 delete mode 100755 media/am8.png delete mode 100755 media/am9.mp3 delete mode 100755 media/am9.png delete mode 100755 media/antmusiques.zip delete mode 100755 media/cookie.png delete mode 100755 media/favicon.ico delete mode 100755 media/ghostery.png delete mode 100755 media/httpspartout.png delete mode 100755 media/logo/alt/ant1.jpg delete mode 100755 media/logo/alt/ant1.png delete mode 100755 media/logo/alt/ant2.jpg delete mode 100755 media/logo/alt/ant2.png delete mode 100755 media/logo/alt/ant3.jpg delete mode 100755 media/logo/alt/ant3.png delete mode 100755 media/logo/alt/ant4.jpg delete mode 100755 media/logo/alt/ant4.png delete mode 100755 media/logo/alt/ant5.jpg delete mode 100755 media/logo/alt/ant5.png delete mode 100755 media/logo/alt/ant6.jpg delete mode 100755 media/logo/alt/ant6.png delete mode 100755 media/logo/alt/ant7.jpg delete mode 100755 media/logo/alt/ant7.png delete mode 100755 media/module/wappalyser.png delete mode 100755 media/nav/brave.png delete mode 100755 media/nav/chrome.png delete mode 100755 media/nav/chromium.png delete mode 100755 media/nav/cliqz.png delete mode 100755 media/nav/cyberfox.png delete mode 100755 media/nav/edge.png delete mode 100755 media/nav/falkon.png delete mode 100755 media/nav/firefox.png delete mode 100755 media/nav/firefoxdeveloperedition.png delete mode 100755 media/nav/firefoxesr.png delete mode 100755 media/nav/gnomeweb.png delete mode 100755 media/nav/icecat.png delete mode 100755 media/nav/iceweasel.png delete mode 100755 media/nav/internetexplorer.png delete mode 100755 media/nav/konqueror.png delete mode 100755 media/nav/maxthon.png delete mode 100755 media/nav/midori.png delete mode 100755 media/nav/nightly.png delete mode 100755 media/nav/opera.png delete mode 100755 media/nav/palemoon.png delete mode 100755 media/nav/safari.png delete mode 100755 media/nav/seamonkey.png delete mode 100755 media/nav/tor.png delete mode 100755 media/nav/torch.png delete mode 100755 media/nav/vivaldi.png delete mode 100755 media/nav/waterfox.png delete mode 100755 media/nav/yandex.png delete mode 100755 media/nb/cat.png delete mode 100755 media/nb/cet.png delete mode 100755 media/nb/de.png delete mode 100755 media/nb/in.png delete mode 100755 media/nb/noeuf.png delete mode 100755 media/nb/sinc.png delete mode 100755 media/nb/sis.png delete mode 100755 media/nb/troi.png delete mode 100755 media/nb/uite.png delete mode 100755 media/non-pub-horizontale.png delete mode 100755 media/onglet/brave.png delete mode 100755 media/onglet/chrome.png delete mode 100755 media/onglet/chromium.png delete mode 100755 media/onglet/cliqz.png delete mode 100755 media/onglet/cyberfox.png delete mode 100755 media/onglet/edge.png delete mode 100755 media/onglet/falkon.png delete mode 100755 media/onglet/firefox.png delete mode 100755 media/onglet/firefoxdeveloperedition.png delete mode 100755 media/onglet/gnomeweb.png delete mode 100755 media/onglet/internetexplorer.png delete mode 100755 media/onglet/konqueror.png delete mode 100755 media/onglet/maxthon.png delete mode 100755 media/onglet/midori.png delete mode 100755 media/onglet/opera.png delete mode 100755 media/onglet/palemoon.png delete mode 100755 media/onglet/safari.png delete mode 100755 media/onglet/seamonkey.png delete mode 100755 media/onglet/tor.png delete mode 100755 media/onglet/torch.png delete mode 100755 media/onglet/vivaldi.png delete mode 100755 media/onglet/waterfox.png delete mode 100755 media/onglet/yandex.png delete mode 100755 media/oslogo/4MLinux.png delete mode 100755 media/oslogo/AIX.png delete mode 100755 media/oslogo/ALT.png delete mode 100755 media/oslogo/Alpine.png delete mode 100755 media/oslogo/Amazon.png delete mode 100755 media/oslogo/Android.png delete mode 100755 media/oslogo/Apple.png delete mode 100755 media/oslogo/Arch.png delete mode 100755 media/oslogo/BOSS.png delete mode 100755 media/oslogo/Calculate.png delete mode 100755 media/oslogo/Canaima.png delete mode 100755 media/oslogo/CentOS.png delete mode 100755 media/oslogo/Chakra.png delete mode 100755 media/oslogo/ClearOS.png delete mode 100755 media/oslogo/Cloud.png delete mode 100755 media/oslogo/Cobalt.png delete mode 100755 media/oslogo/CoreOS.png delete mode 100755 media/oslogo/Crux.png delete mode 100755 media/oslogo/Darwin.png delete mode 100755 media/oslogo/Debian.png delete mode 100755 media/oslogo/Deepin.png delete mode 100755 media/oslogo/Devuan.png delete mode 100755 media/oslogo/DragonFly.png delete mode 100755 media/oslogo/Eisfair.png delete mode 100755 media/oslogo/Fedora.png delete mode 100755 media/oslogo/Foresight.png delete mode 100755 media/oslogo/FreeBSD.png delete mode 100755 media/oslogo/Frugalware.png delete mode 100755 media/oslogo/Fuduntu.png delete mode 100755 media/oslogo/Generations.png delete mode 100755 media/oslogo/Gentoo.png delete mode 100755 media/oslogo/Gobo.png delete mode 100755 media/oslogo/HPUX.png delete mode 100755 media/oslogo/Haiku.png delete mode 100755 media/oslogo/Handy.png delete mode 100755 media/oslogo/HipServ.png delete mode 100755 media/oslogo/IPFire.png delete mode 100755 media/oslogo/KaOS.png delete mode 100755 media/oslogo/Korora.png delete mode 100755 media/oslogo/LFS.png delete mode 100755 media/oslogo/Linaro.png delete mode 100755 media/oslogo/Lunar.png delete mode 100755 media/oslogo/Mageia.png delete mode 100755 media/oslogo/Mandrake.png delete mode 100755 media/oslogo/Manjaro.png delete mode 100755 media/oslogo/Mer.png delete mode 100755 media/oslogo/Minix.png delete mode 100755 media/oslogo/Mint.png delete mode 100755 media/oslogo/NeoKylin.png delete mode 100755 media/oslogo/NetBSD.png delete mode 100755 media/oslogo/Netrunner.png delete mode 100755 media/oslogo/NixOS.png delete mode 100755 media/oslogo/OpenBSD.png delete mode 100755 media/oslogo/OpenMamba.png delete mode 100755 media/oslogo/OpenMandriva.png delete mode 100755 media/oslogo/Oracle.png delete mode 100755 media/oslogo/PCLinuxOS.png delete mode 100755 media/oslogo/PLD.png delete mode 100755 media/oslogo/Parsix.png delete mode 100755 media/oslogo/Pear.png delete mode 100755 media/oslogo/Peppermint.png delete mode 100755 media/oslogo/Pisi.png delete mode 100755 media/oslogo/Porteus.png delete mode 100755 media/oslogo/Puppy.png delete mode 100755 media/oslogo/QNX.png delete mode 100755 media/oslogo/QTS.png delete mode 100755 media/oslogo/Qubes.png delete mode 100755 media/oslogo/ROSA.png delete mode 100755 media/oslogo/Raspbian.png delete mode 100755 media/oslogo/ReactOS.png delete mode 100755 media/oslogo/RedFlag.png delete mode 100755 media/oslogo/RedHat.png delete mode 100755 media/oslogo/Rubix.png delete mode 100755 media/oslogo/SMEServer.png delete mode 100755 media/oslogo/SMS.png delete mode 100755 media/oslogo/SUSE.png delete mode 100755 media/oslogo/Sabayon.png delete mode 100755 media/oslogo/SalentOS.png delete mode 100755 media/oslogo/Salix.png delete mode 100755 media/oslogo/Scientific.png delete mode 100755 media/oslogo/Semplice.png delete mode 100755 media/oslogo/Slackware.png delete mode 100755 media/oslogo/Slax.png delete mode 100755 media/oslogo/SliTaz.png delete mode 100755 media/oslogo/Solus.png delete mode 100755 media/oslogo/SolusOS.png delete mode 100755 media/oslogo/SolydXK.png delete mode 100755 media/oslogo/StartOS.png delete mode 100755 media/oslogo/SteamOS.png delete mode 100755 media/oslogo/SunOS.png delete mode 100755 media/oslogo/Synology.png delete mode 100755 media/oslogo/Tails.png delete mode 100755 media/oslogo/Tanglu.png delete mode 100755 media/oslogo/TinyCore.png delete mode 100755 media/oslogo/Tizen.png delete mode 100755 media/oslogo/Trisquel.png delete mode 100755 media/oslogo/Trustix.png delete mode 100755 media/oslogo/Turbo.png delete mode 100755 media/oslogo/Ubuntu.png delete mode 100755 media/oslogo/UltimateEdition.png delete mode 100755 media/oslogo/Vector.png delete mode 100755 media/oslogo/Void.png delete mode 100755 media/oslogo/VortexBox.png delete mode 100755 media/oslogo/Win2000.png delete mode 100755 media/oslogo/Win8.png delete mode 100755 media/oslogo/WinVista.png delete mode 100755 media/oslogo/WinXP.png delete mode 100755 media/oslogo/Zenwalk.png delete mode 100755 media/oslogo/Zorin.png delete mode 100755 media/oslogo/antiX.png delete mode 100755 media/oslogo/elementaryOS.png delete mode 100755 media/oslogo/free-eos.png delete mode 100755 media/oslogo/gNewSense.png delete mode 100755 media/oslogo/iycc.png delete mode 100755 media/oslogo/openSUSE.png delete mode 100755 media/oslogo/pfSense.png delete mode 100755 media/oslogo/unknown.png delete mode 100755 media/privacy.png delete mode 100755 media/tntblanc.png delete mode 100755 media/tntbleu.png delete mode 100755 media/tntgris.png delete mode 100755 media/tntnoir.png delete mode 100755 media/ublockpopup.png delete mode 100755 media/wappalyser.png delete mode 100755 monnavigateur.php create mode 100755 navigateur.php delete mode 100755 polices/condense.ttf delete mode 100755 polices/fin-it.ttf delete mode 100755 polices/fin.ttf delete mode 100755 polices/gras-it.ttf delete mode 100755 polices/gras.ttf delete mode 100755 polices/moyen-it.ttf delete mode 100755 polices/moyen.ttf delete mode 100755 polices/ubuntu-it.ttf delete mode 100755 polices/ubuntu.ttf delete mode 100755 signup.php create mode 100755 style/ant.less create mode 100755 style/vrac.less diff --git a/404.php b/404.php index 5012025..05f2e69 100755 --- a/404.php +++ b/404.php @@ -1,16 +1,16 @@ +head("404.php"); ?>
- Erreur 404 + Le texte 'erreur 404' en train d'être mangé par des fourmies

La page à laquelle vous avez tenté d'accéder a été dévorée par une armée de fourmies affamées !



- + Retour à la page d'accueil diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..be3f7b2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/LICENSE.html b/LICENSE.html new file mode 100755 index 0000000..43a19ed --- /dev/null +++ b/LICENSE.html @@ -0,0 +1,748 @@ + + + + GNU AFFERO GENERAL PUBLIC LICENSE + + + + +

GNU AFFERO GENERAL PUBLIC LICENSE

+

Version 3, 19 November 2007

+ +

Copyright © 2007 Free Software Foundation, + Inc. <https://fsf.org/> +
+ Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed.

+ +

Preamble

+ +

The GNU Affero General Public License is a free, copyleft license + for software and other kinds of works, specifically designed to ensure + cooperation with the community in the case of network server software.

+ +

The licenses for most software and other practical works are + designed to take away your freedom to share and change the works. By + contrast, our General Public Licenses are intended to guarantee your + freedom to share and change all versions of a program--to make sure it + remains free software for all its users.

+ +

When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + them if you wish), that you receive source code or can get it if you + want it, that you can change the software or use pieces of it in new + free programs, and that you know you can do these things.

+ +

Developers that use our General Public Licenses protect your rights + with two steps: (1) assert copyright on the software, and (2) offer + you this License which gives you legal permission to copy, distribute + and/or modify the software.

+ +

A secondary benefit of defending all users' freedom is that + improvements made in alternate versions of the program, if they + receive widespread use, become available for other developers to + incorporate. Many developers of free software are heartened and + encouraged by the resulting cooperation. However, in the case of + software used on network servers, this result may fail to come about. + The GNU General Public License permits making a modified version and + letting the public access it on a server without ever releasing its + source code to the public.

+ +

The GNU Affero General Public License is designed specifically to + ensure that, in such cases, the modified source code becomes available + to the community. It requires the operator of a network server to + provide the source code of the modified version running there to the + users of that server. Therefore, public use of a modified version, on + a publicly accessible server, gives the public access to the source + code of the modified version.

+ +

An older license, called the Affero General Public License and + published by Affero, was designed to accomplish similar goals. This is + a different license, not a version of the Affero GPL, but Affero has + released a new version of the Affero GPL which permits relicensing under + this license.

+ +

The precise terms and conditions for copying, distribution and + modification follow.

+ +

TERMS AND CONDITIONS

+ +

0. Definitions.

+ +

"This License" refers to version 3 of the GNU Affero General Public + License.

+ +

"Copyright" also means copyright-like laws that apply to other kinds + of works, such as semiconductor masks.

+ +

"The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations.

+ +

To "modify" a work means to copy from or adapt all or part of the work + in a fashion requiring copyright permission, other than the making of an + exact copy. The resulting work is called a "modified version" of the + earlier work or a work "based on" the earlier work.

+ +

A "covered work" means either the unmodified Program or a work based + on the Program.

+ +

To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well.

+ +

To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user through + a computer network, with no transfer of a copy, is not conveying.

+ +

An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the + work under this License, and how to view a copy of this License. If + the interface presents a list of user commands or options, such as a + menu, a prominent item in the list meets this criterion.

+ +

1. Source Code.

+ +

The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work.

+ +

A "Standard Interface" means an interface that either is an official + standard defined by a recognized standards body, or, in the case of + interfaces specified for a particular programming language, one that + is widely used among developers working in that language.

+ +

The "System Libraries" of an executable work include anything, other + than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that + Major Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A + "Major Component", in this context, means a major essential component + (kernel, window system, and so on) of the specific operating system + (if any) on which the executable work runs, or a compiler used to + produce the work, or an object code interpreter used to run it.

+ +

The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts to + control those activities. However, it does not include the work's + System Libraries, or general-purpose tools or generally available free + programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source + includes interface definition files associated with source files for + the work, and the source code for shared libraries and dynamically + linked subprograms that the work is specifically designed to require, + such as by intimate data communication or control flow between those + subprograms and other parts of the work.

+ +

The Corresponding Source need not include anything that users + can regenerate automatically from other parts of the Corresponding + Source.

+ +

The Corresponding Source for a work in source code form is that + same work.

+ +

2. Basic Permissions.

+ +

All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your + rights of fair use or other equivalent, as provided by copyright law.

+ +

You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise remains + in force. You may convey covered works to others for the sole purpose + of having them make modifications exclusively for you, or provide you + with facilities for running those works, provided that you comply with + the terms of this License in conveying all material for which you do + not control copyright. Those thus making or running the covered works + for you must do so exclusively on your behalf, under your direction + and control, on terms that prohibit them from making any copies of + your copyrighted material outside their relationship with you.

+ +

Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section 10 + makes it unnecessary.

+ +

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

+ +

No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under article + 11 of the WIPO copyright treaty adopted on 20 December 1996, or + similar laws prohibiting or restricting circumvention of such + measures.

+ +

When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such circumvention + is effected by exercising rights under this License with respect to + the covered work, and you disclaim any intention to limit operation or + modification of the work as a means of enforcing, against the work's + users, your or third parties' legal rights to forbid circumvention of + technological measures.

+ +

4. Conveying Verbatim Copies.

+ +

You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the code; + keep intact all notices of the absence of any warranty; and give all + recipients a copy of this License along with the Program.

+ +

You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee.

+ +

5. Conveying Modified Source Versions.

+ +

You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these conditions:

+ +
    + +
  • a) The work must carry prominent notices stating that you modified + it, and giving a relevant date.
  • + +
  • b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices".
  • + +
  • c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it.
  • + +
  • d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so.
  • + +
+ +

A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered work, + and which are not combined with it such as to form a larger program, + in or on a volume of a storage or distribution medium, is called an + "aggregate" if the compilation and its resulting copyright are not + used to limit the access or legal rights of the compilation's users + beyond what the individual works permit. Inclusion of a covered work + in an aggregate does not cause this License to apply to the other + parts of the aggregate.

+ +

6. Conveying Non-Source Forms.

+ +

You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this License, + in one of these ways:

+ +
    + +
  • a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange.
  • + +
  • b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge.
  • + +
  • c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b.
  • + +
  • d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements.
  • + +
  • e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d.
  • + +
+ +

A separable portion of the object code, whose source code is excluded + from the Corresponding Source as a System Library, need not be + included in conveying the object code work.

+ +

A "User Product" is either (1) a "consumer product", which means any + tangible personal property which is normally used for personal, family, + or household purposes, or (2) anything designed or sold for incorporation + into a dwelling. In determining whether a product is a consumer product, + doubtful cases shall be resolved in favor of coverage. For a particular + product received by a particular user, "normally used" refers to a + typical or common use of that class of product, regardless of the status + of the particular user or of the way in which the particular user + actually uses, or expects or is expected to use, the product. A product + is a consumer product regardless of whether the product has substantial + commercial, industrial or non-consumer uses, unless such uses represent + the only significant mode of use of the product.

+ +

"Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to install + and execute modified versions of a covered work in that User Product from + a modified version of its Corresponding Source. The information must + suffice to ensure that the continued functioning of the modified object + code is in no case prevented or interfered with solely because + modification has been made.

+ +

If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as + part of a transaction in which the right of possession and use of the + User Product is transferred to the recipient in perpetuity or for a + fixed term (regardless of how the transaction is characterized), the + Corresponding Source conveyed under this section must be accompanied + by the Installation Information. But this requirement does not apply + if neither you nor any third party retains the ability to install + modified object code on the User Product (for example, the work has + been installed in ROM).

+ +

The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or updates + for a work that has been modified or installed by the recipient, or for + the User Product in which it has been modified or installed. Access to a + network may be denied when the modification itself materially and + adversely affects the operation of the network or violates the rules and + protocols for communication across the network.

+ +

Corresponding Source conveyed, and Installation Information provided, + in accord with this section must be in a format that is publicly + documented (and with an implementation available to the public in + source code form), and must require no special password or key for + unpacking, reading or copying.

+ +

7. Additional Terms.

+ +

"Additional permissions" are terms that supplement the terms of this + License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall + be treated as though they were included in this License, to the extent + that they are valid under applicable law. If additional permissions + apply only to part of the Program, that part may be used separately + under those permissions, but the entire Program remains governed by + this License without regard to the additional permissions.

+ +

When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part of + it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission.

+ +

Notwithstanding any other provision of this License, for material you + add to a covered work, you may (if authorized by the copyright holders of + that material) supplement the terms of this License with terms:

+ +
    + +
  • a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or
  • + +
  • b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or
  • + +
  • c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or
  • + +
  • d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or
  • + +
  • e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or
  • + +
  • f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors.
  • + +
+ +

All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as you + received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further restriction, + you may remove that term. If a license document contains a further + restriction but permits relicensing or conveying under this License, you + may add to a covered work material governed by the terms of that license + document, provided that the further restriction does not survive such + relicensing or conveying.

+ +

If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms.

+ +

Additional terms, permissive or non-permissive, may be stated in the + form of a separately written license, or stated as exceptions; + the above requirements apply either way.

+ +

8. Termination.

+ +

You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights under + this License (including any patent licenses granted under the third + paragraph of section 11).

+ +

However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the copyright + holder fails to notify you of the violation by some reasonable means + prior to 60 days after the cessation.

+ +

Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from that + copyright holder, and you cure the violation prior to 30 days after + your receipt of the notice.

+ +

Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10.

+ +

9. Acceptance Not Required for Having Copies.

+ +

You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer transmission + to receive a copy likewise does not require acceptance. However, + nothing other than this License grants you permission to propagate or + modify any covered work. These actions infringe copyright if you do + not accept this License. Therefore, by modifying or propagating a + covered work, you indicate your acceptance of this License to do so.

+ +

10. Automatic Licensing of Downstream Recipients.

+ +

Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not responsible + for enforcing compliance by third parties with this License.

+ +

An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered + work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or could + give under the previous paragraph, plus a right to possession of the + Corresponding Source of the work from the predecessor in interest, if + the predecessor has it or can get it with reasonable efforts.

+ +

You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you may + not impose a license fee, royalty, or other charge for exercise of + rights granted under this License, and you may not initiate litigation + (including a cross-claim or counterclaim in a lawsuit) alleging that + any patent claim is infringed by making, using, selling, offering for + sale, or importing the Program or any portion of it.

+ +

11. Patents.

+ +

A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's "contributor version".

+ +

A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, permitted + by this License, of making, using, or selling its contributor version, + but do not include claims that would be infringed only as a + consequence of further modification of the contributor version. For + purposes of this definition, "control" includes the right to grant + patent sublicenses in a manner consistent with the requirements of + this License.

+ +

Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to + make, use, sell, offer for sale, import and otherwise run, modify and + propagate the contents of its contributor version.

+ +

In the following three paragraphs, a "patent license" is any express + agreement or commitment, however denominated, not to enforce a patent + (such as an express permission to practice a patent or covenant not to + sue for patent infringement). To "grant" such a patent license to a + party means to make such an agreement or commitment not to enforce a + patent against the party.

+ +

If you convey a covered work, knowingly relying on a patent license, + and the Corresponding Source of the work is not available for anyone + to copy, free of charge and under the terms of this License, through a + publicly available network server or other readily accessible means, + then you must either (1) cause the Corresponding Source to be so + available, or (2) arrange to deprive yourself of the benefit of the + patent license for this particular work, or (3) arrange, in a manner + consistent with the requirements of this License, to extend the patent + license to downstream recipients. "Knowingly relying" means you have + actual knowledge that, but for the patent license, your conveying the + covered work in a country, or your recipient's use of the covered work + in a country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid.

+ +

If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, modify + or convey a specific copy of the covered work, then the patent license + you grant is automatically extended to all recipients of the covered + work and works based on it.

+ +

A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that are + specifically granted under this License. You may not convey a covered + work if you are a party to an arrangement with a third party that is + in the business of distributing software, under which you make payment + to the third party based on the extent of your activity of conveying + the work, and under which the third party grants, to any of the + parties who would receive the covered work from you, a discriminatory + patent license (a) in connection with copies of the covered work + conveyed by you (or copies made from those copies), or (b) primarily + for and in connection with specific products or compilations that + contain the covered work, unless you entered into that arrangement, + or that patent license was granted, prior to 28 March 2007.

+ +

Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law.

+ +

12. No Surrender of Others' Freedom.

+ +

If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you may + not convey it at all. For example, if you agree to terms that obligate you + to collect a royalty for further conveying from those to whom you convey + the Program, the only way you could satisfy both those terms and this + License would be to refrain entirely from conveying the Program.

+ +

13. Remote Network Interaction; Use with the GNU General Public License.

+ +

Notwithstanding any other provision of this License, if you modify the + Program, your modified version must prominently offer all users + interacting with it remotely through a computer network (if your version + supports such interaction) an opportunity to receive the Corresponding + Source of your version by providing access to the Corresponding Source + from a network server at no charge, through some standard or customary + means of facilitating copying of software. This Corresponding Source + shall include the Corresponding Source for any work covered by version 3 + of the GNU General Public License that is incorporated pursuant to the + following paragraph.

+ +

Notwithstanding any other provision of this License, you have permission + to link or combine any covered work with a work licensed under version 3 + of the GNU General Public License into a single combined work, and to + convey the resulting work. The terms of this License will continue to + apply to the part which is the covered work, but the work with which it is + combined will remain governed by version 3 of the GNU General Public + License.

+ +

14. Revised Versions of this License.

+ +

The Free Software Foundation may publish revised and/or new versions of + the GNU Affero General Public License from time to time. Such new + versions will be similar in spirit to the present version, but may differ + in detail to address new problems or concerns.

+ +

Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU Affero + General Public License "or any later version" applies to it, you have + the option of following the terms and conditions either of that + numbered version or of any later version published by the Free + Software Foundation. If the Program does not specify a version number + of the GNU Affero General Public License, you may choose any version + ever published by the Free Software Foundation.

+ +

If the Program specifies that a proxy can decide which future + versions of the GNU Affero General Public License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Program.

+ +

Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version.

+ +

15. Disclaimer of Warranty.

+ +

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

+ +

16. Limitation of Liability.

+ +

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES.

+ +

17. Interpretation of Sections 15 and 16.

+ +

If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely approximates + an absolute waiver of all civil liability in connection with the + Program, unless a warranty or assumption of liability accompanies a + copy of the Program in return for a fee.

+ +

END OF TERMS AND CONDITIONS

+ +

How to Apply These Terms to Your New Programs

+ +

If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms.

+ +

To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + state the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found.

+ +
    <one line to give the program's name and a brief idea of what it does.>
+        Copyright (C) <year>  <name of author>
+
+        This program is free software: you can redistribute it and/or modify
+        it under the terms of the GNU Affero General Public License as
+        published by the Free Software Foundation, either version 3 of the
+        License, or (at your option) any later version.
+
+        This program is distributed in the hope that it will be useful,
+        but WITHOUT ANY WARRANTY; without even the implied warranty of
+        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+        GNU Affero General Public License for more details.
+
+        You should have received a copy of the GNU Affero General Public License
+        along with this program.  If not, see <https://www.gnu.org/licenses/>.
+    
+ +

Also add information on how to contact you by electronic and paper mail.

+ +

If your software can interact with users remotely through a computer + network, you should also make sure that it provides a way for users to + get its source. For example, if your program is a web application, its + interface could display a "Source" link that leads users to an archive + of the code. There are many ways you could offer source, and different + solutions will be better for different programs; see section 13 for the + specific requirements.

+ +

You should also get your employer (if you work as a programmer) or school, + if any, to sign a "copyright disclaimer" for the program, if necessary. + For more information on this, and how to apply and follow the GNU AGPL, see + <https://www.gnu.org/licenses/>.

+ + diff --git a/LICENSE.md b/LICENSE.md new file mode 100755 index 0000000..cba6f6a --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,660 @@ +### GNU AFFERO GENERAL PUBLIC LICENSE + +Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains +free software for all its users. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + +A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + +The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + +An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing +under this license. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public +License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your +version supports such interaction) an opportunity to receive the +Corresponding Source of your version by providing access to the +Corresponding Source from a network server at no charge, through some +standard or customary means of facilitating copying of software. This +Corresponding Source shall include the Corresponding Source for any +work covered by version 3 of the GNU General Public License that is +incorporated pursuant to the following paragraph. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Affero General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever +published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for +the specific requirements. + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU AGPL, see . diff --git a/README.md b/README.md index 6c6c22b..645ecf8 100755 --- a/README.md +++ b/README.md @@ -1,29 +1,28 @@ # Présentation Voici le code source de mon site : . -Ce code est testé avec les dernières version de PHP et MySQL. +Il devrait fonctionner simplement avec la dernière version de PHP et un serveur Web. -Le site Web dépend d'une base de donnée ; pour faire fonctionner ce site vous devrez importer le fichier bdd.sql dans une base de donnée nommé _my_webapp_ et placer dans le dossier parent de _web_ un fichier _loginsbdd.php_ sous la forme : +Si vous avez besoin d'aide vous pouvez me contacter sur Mastodon : [@Miraty@social.antopie.org](https://social.antopie.org/@miraty) ou par mail : [miraty+gitea@antopie.org](mailto:miraty+gitea@antopie.org). - antopie.org. +# Bibliothèques utilisées -# Structure +Le dossier bibli contient des dépendances inclusent dans ce site. -- **web** - - **bibli** _Contient des bibliothèques diverses\* - - **fontello** _Le pack d'icones\* - - **sense3** _Les "publicités"\* - - **ubuntu** _Les polices d'Ubuntu utilisés sur le site\* - - **less.js** _Le JS pour compiler le code LESS en CSS\* - - **less.min.js** _Même chose en plus léger\* - - **nomalize.css** _Du CSS qui réinitalise le CSS pour que tous les navigateurs aient le même rendu\* - - **inc** _Les fichiers PHP qui ne sont pas des pages Web et qui sont inclus dans d'autres\* - - **media** _Image, vidéo, audio\* - - **README.md** _Le fichier Markdown que vous êtes en train de lire\* - - **bdd.sql** _Contient la structure de la base de données\* -- **loginsbdd.php** _Les identifiants de la base de données_ +Nom | Description | Licence | Source | Version +-------- | -------- | -------- | -------- +ubuntu | La police Ubuntu | Ubuntu Font License v1.0 | https://design.ubuntu.com/font/ +fontello | Pack d'icônes | SIL, BSD, MIT, CC-BY | http://fontello.com/ +lessphp | Compilateur Less en PHP | MIT ou GPLv3 | https://github.com/leafo/lessphp | 0.5.0 +sense3 | "Publicités" pour le libre | MIT | https://sense3.org/ +normalize.css | Standardisation de l'affichage | MIT | https://necolas.github.io/normalize.css/ | 8.0.1 + + +# Licence + +Le site web d'Antopie est un logiciel libre ; vous pouvez le diffuser et le modifier suivant les termes de la GNU Affero General Public License telle que publiée par la Free Software Foundation ; soit la version 3 de cette licence, soit (à votre convenance) une version ultérieure. + +Le site web d'Antopie est diffusé dans l’espoir qu’il sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIALISATION ou d’ADÉQUATION À UN USAGE PARTICULIER. Voyez la GNU Affero General Public License pour plus de détails. + +Vous devriez avoir reçu une copie de la GNU Affero General Public License avec ce code. Sinon, consultez https://www.gnu.org/licenses/ \ No newline at end of file diff --git a/abcdefg/polices/harry.ttf b/abcdefg/polices/harry.ttf new file mode 100755 index 0000000000000000000000000000000000000000..220e69aa9382e36a8f836bc8e5338d5b8ab9e865 GIT binary patch literal 27432 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

P82ZTB(?datR?qlwO8pCh3w~ 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 Uy&?|m2#WC=Xk9^`$36PL0I`8!O8@`> literal 0 HcmV?d00001 diff --git a/abcdefg/polices/hocuspocus.ttf b/abcdefg/polices/hocuspocus.ttf new file mode 100755 index 0000000000000000000000000000000000000000..48dc679a3389e31d67f3255cfe7f55b2ea08e68f GIT binary patch literal 368476 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 z zwg!NOYcOGB_y^jFWE2WPp1+&`Lq3F<0XP7SDbB2$H5iP>0n9+F313@$Svrd*F4x&i zACZL!uIVRA#66K*gz%CMWx9uf&UB9muk^2tkaNuNXRaKWOsu)dNEr�uBs|-~<9I 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�F{bPZkkV9V7%g$#oRVC?6#5AXL2m`i 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 C7VNnI literal 0 HcmV?d00001 diff --git a/abcdefg/polices/minecraft.ttf b/abcdefg/polices/minecraft.ttf new file mode 100755 index 0000000000000000000000000000000000000000..85c14725a3bf6d67aaf0f03292f9b763c1654f07 GIT binary patch literal 14488 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 Z*c*kN@$GAW{e3oGeYSI$CI24pe*xM150(G` literal 0 HcmV?d00001 diff --git a/abcdefg/polices/simplicity.ttf b/abcdefg/polices/simplicity.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b41c3cfe4180e3639f88462501e9693df76052f6 GIT binary patch literal 161952 zcmeEv34mQim3GzL?|b*{d%y12{od<-FTJF@)7wjD=?)_Bs3VHYpyRlX$S{K4|97hHy>ICy9fu|QQ^~D& z`Yu)HoT@r?s?Mn@#u;M?L>e1D>V)G@($bMHG3BZO+&Jf`lTKOBa?D}MHMild=&>iC zbo7IF?K_S!<3Yyw(D5e?jqLpM_P+wW56{m!b;EJncMk6P4rAsMjOmZ_%NCoaGZ<#zUG`1>mS-F?BOS6%as z*B0)@$64V2iHpyD*=4W&^-Hf{%BnjU>)&w6OLw2mUV6pROd0x%EGB$b* zzS+cxceu8{#i_j{vgS7|r~Vjs*f(zYe!Kg-ul92HzIZ5J=%+ipKX^O4Ufh)5C5bJ{P)=um)5Vzj;0?&}3FRKfSQoOn1%It(Hh&|l z@Qazl<4omwT<>Dt{P@`!_O96(ehuKwtcP#G{Z7;qe4}h+yA?~kr|{pf5-%}@_u%i} zuqr>71^AlTr})d+R(>fvh2O%?K-w{W&g>Hh&8s1wru4nEDIYIw!VBpWE+S7iA0@>e z#q~8@zm~r|q@*|pe7f>(z6!q=;d%`Brg0^4O$qupffs}$@qjLZ>3Sn*qQBpTyopxI z*L&9Z>%E6}iEoXU|1Evrcu`snm$C}^+==TqEJVB(W%BQ=0GN2M3)+c(q7@hDV0;Sv zri*w?SB0H~@;C{<5v2h9e}nIT!#b5gmmZHc`kfEg1@IGf!OfR9$eo~#9 z@1lD4xJ%o`%<}o|;{)8L%nE()vvpC zAwTAC;M7Q9%KFV`r{`Apn! zU$1|KkLb(hAQG5!xA~nV{>2-!lHbg|BknJNGUq^q*8_2zGx0ZM_EXj@vzQL4WHSSC zfSHJcB6gTH`#TmAahTbFBP@V8D&iOm&OXE9B2F*|aFT@(r$n4)VZa&0PqQqGAkMKU z;x-ZISqyNyh&xz(_P4CS5{NrR+{KcBiy|(u)a?JTGD{=w7I6>D0IrC*%Cdl$vE1xa ztXIT+tPOC#hzD36@N(9Uco6Y_vmw@jcv!?MSOM?|>qIi-!JjE)2rx8Da-nEMO2(}FIdJ!MVdI4`h{A;$6^&#HG z`Vk)`;-lFB;A2F*nJu6FFSdmZB0g5c$FU*6TSa_48wPv=TQU19woSw*vJt>1iTGqT z3iuQ@Hv3C5>kXp z$JpPnixK}Vy9DvyiTG3OQox@^{9SezyA1K)vzH>?C*r%=<$(8#_yD_N_B-qz_A5t<$xa)@#onq0Dpm9Gy84!MG=3AT?_cj?3IZB zLBwBSuLAs!i2sfK6T1%aSJ|r(e@(;>vDX0pzasu;cKz(P*uStF5I-#9e`PlU{cwlYN8TjQE=({uX;J;C~bGx7jU#A7!`BeuI5S#NTDF1N@kXzsFt=`1|Y)vyZSJ zi1>$WFW`R{@#E}`fPci^g!spZzs~-Hy&3UOMEsxZEr5T@-ir8VBK|qMZT4T;FGT!H z_BO!3VsA(MUn2fBd&lg<>gw!VT{=)%KntZ*fz8Q%~4`P5|Q?W5Id=(*h3og)hM``kot-UoPI>BRp~W zg_I3kG8^3#zrjz93)Tz*lCgt-hNZSl9u zFTrJcCZ0&7Ow)Z^{FsJqB6s9a87iLOF6AV%F-$i%@Bjp>#1{(qi0XuVixM()l(EY%fhbU;Peqlb zR{`TS%107SABivzzvw=FgCMv}WQunMGDb7MEbz;$^D8(%zeGBMRLL_*B>1H>77qCV z{Bj~_MR*fUgHTgUL7JcmHOhNL{6cL2(YQm|OVkY1bp%-@QP#R_pH%9C8u=6)Fo|D+ z+f=D2s2X@}Hu4Lvfqt*0OST~+yy}NKF9o-V&6E^)AfAZq49lYTMJ9M;n*qzBROGh~ z6)Xi4O@rPsMUeOCEALZKg8HR^Uy*tMzd}*)3y&nfG{rJ?6RCg&6ud{2Fz(|CZd$lx zHYUmrf!In9G`D?HdV*i_DZOrh$%0XU>0K97@g==VsR({iI*mc#O@vX94+v`Hm;Xd$ zXWBO1@PcgyZObo5J>(@~5fuoQ2omwq;nFhQv^x z#6R%}Pw2h{q7B`~eVL7gvO}P%M>S4!>l>9i5rm?qrwBGamW(nCfhbTD_-Rrwy( z7g+&lYMB;u3+Tmcp zFGnLPC_vK0FA9=UL-no6D28v?6=S~5D2RPK9>A4DS62+Ji{mQRr#JuX*31GyH19DLIkMM-?s2u54youK|Jdl-yJ`w@91?3`=&xjKG20>6wkHiy6 zdo)Tn=p|rn#=^;H#HPeW$U+{75GE=R!Xn6o=_~oIEx%xDfU!b{AHc7CNwb4!MnPK( zpo(bGa4>9H;Q$B^22iKuBRrw|VTy26>mrlqW+y+n@^ zkxV@1$_*frr~Z>dGzvV$FR2SMVfspb8wd!rnHFTMRP+P*)zJ-pp)EK84c}W@EaF5g zI}*T61n&`^;J%F~xETXaTpcbUe({>X*m59SMUWN1kx%K9P{g8gAZZ+-2=zA_iA2F3 z`6}MTYjgP(M2ja9WRMkz$aMK7N(0Yq@kAn(Owh|7zf#d$B2KBu(C&$nSWMoCi2%`n zK)jTn0!w-<_|;wZ1NhaoObdiiT|+_L0U25%7K++-G$`AW_Xtnue$=Mh2_!DFiKWDE z2<;FUhwKn!D+QD~3F(l~^yo%B9JL*!8^HH5ia<^*8jU+t@99;%iPv;Ipx2Rt8ywu0 zq*E+!5+(Evg5WY9K*%GA?4s!uy-G}lh_Ey9d@4z)$k0iMQb;7c-volpP!y#2)RA8> z&0%a=)eqoTv3Cx?Ku`?Q%7K7s;#VvnNOcl;;;L|I@f(8Rmi&rIBs_izZVK$eF_&MV zP@D=Aw8UevI=}EH-qS;1y$F&sq0mA2C0dftFIkA`v|yEpY&)B1Pp9hq>Z-CW4Yt;c$`)6ICRcNTk9fC+JnYiPwxU zq@)P4X+5*15Zsw>=`bvHq4hu?{9%gKCxgWr9DjBGlVa-38o6pcW@c#rUe?x!5o z`A8N|WH#w`@f!;xfk-6g#8UVM0fj@<#Du0ttt1;yIT69AXfz!PMex3pNu@Fnit<&w ziPsFYN|8WBR+U&Rk`(U>;yo!q45j1|l1adL7!vPG#j?Gf-j)^AaSGY)_I#8Q7ois| zO@wR~lpth90LlmsYJ>bVD!*Vx1b!H!egMA)Cyj7C778UIW(@o>^4UZt6v{-A02++< z2v6vKCPeAxqw!cyhJyHsN00#C4<#}JZ$KgH&=Nw?qg!psOeiK86_4i#In>=;Ces!R z;Y)fIZ{jsG9+#BIydhgG9m5-5kQIo?q;C+?X~1|I7Eh#J+1W|2(@XTI*j6oc#9X{$ zvE_s)g?v5^`skNJEJg{?SCkkbD867ujIqg;egMBlrp#y(YC$q)CP0SS(Ut^3xp*`Y z$3WA2geP=A7l|ek@eVwZ+2o7jHyK3&@pv+vL|;S!rB2i&1vd$kj&v>@&xXTMe4mG$ zkAs$cF4rEXmO`)MO}u8JRZ32IW43rUE_D{FRAG6S$fR!&vRS}*5D`yg8J0@KDOroq z0NeYET?tBDgcWFMB6M_s5(KGR0c8YHkVuTM6kjki&e+siKY(8oN1Cw|-b}}>B=}=? zwx>Z*J`qbMQ^} zjmFSKJ7P!# zns+8)rxS^oRVrjaP)91BPC>wUkMM-pR9bGAs6Z9(H#A`NMrDT*hWJ|RR!A2ZFkawwm z&^HL}?SPRMl0}e(SgjJLh^a(G9rEpStNkgl`2%)1>%KNiu&b3g+e<*e^(`)?@p() z*^Z87gdE81tyKE*DSSz<%J+h(Wg>xm!43KDJl^nvyh)VMHwfL`fRR>4JQ3MdMn`Z1 zIZ;TZCi>Q`7;5h!Bq(f7rz9{i&;k1L`2i7tJVH7x6U%~1fi?@|8QXP+AHXjJ`2NwQ zJxKm}2<`X_kWyiWg7KzstiX5k2QIt<=YQ64H`D;n1M(s-@iOn`J-ouJd>QZMea)}& z4&bB!GmYuYU?%)K0`TZ?;Jp!LF_wUzMx3Q#Beda}5r)4;j*lAE~@af=w*HIt{8w<#UQ*XhS>^uP>jNJq8^ThSHm%EGkh41Wyiti zVJkZx9t+#piSSa`$WDfT!X|hpoCdFi9q>jt16~L_*)DhS6t_5_7JSbt>I0u@V|wfCvKk$ABTFl zj=dUw1=qu$;6`>6dIcLRP~cWG$P5N9OyH z#Oc6ShqnvN7~tY0yg`lutvf;GD`Cz5DEn*J+4sT9JB#ux!++@*ehNR0zl87Rm-1Ke z>-pQ2oRU|*s649PQ@Ew8(zT)MLtTH-^@&ovbkPL7-_EuzbWmr*#|`0 zpF-OAv!~$ZQ$kG{}3oe`M*?#%DM=COMo+sxQw zo4&jMJG;M=v5NSN)3+j=h!}3E>~dU}i944dz67><#(pR-4v9qz4KfsKKujC7wo2emTl*uPFE9 zfbYxLk*L=jP_wsziWA|XauRCxMp3s*n>REWALcCn0=mofm_^$zr>f=mwA8( z!Kq7mlBZC2e+zGbXV~x9mGGbWHfrRQTOZe=ZmxmH!Oz)u;j^;`9uAMO@4Z+%sn)z$ zI}g*^39-cnw(Mi}3ETgM^SA8S$7gTZ$2N4_jlN2K$*$%57$4~B+IZoHJNa4oLm9x0 zz9JxXplj2eYR{$bjGiwEaTFCvPv_ zxo$_^2hZKHV-?cTC>?x)*Z1x~3KzL4;8)xl`W;@<2ex$Gsa8(dzHR%RH*Cn?xo*Rb ze6iTI@y`2C*na2z8}h{+JMfm_V+xF4ePPzc*#yo;AD&w>m6NvLxh{Vv+p%{qrFqi! za`Da^_U_H^1s(3+5alg5IBUJJ&b}w8(8FY*2gdqAysU+2Vg0zvaaSP}bo>KwAAY)_`K8In7l~Ow!9Wi( z49zbEy;0sVq4|~ZR?2_Jf=<|c$A(VQm=37p;+4jv6{ts)bi1Fl3hJ8gXiz|#655Yk zHD-bqCTRgyN%%~jihlLeSO;_-dhfl^tl$a(e@Lc$2GF14WY>I)GmV8nTAGGEvm{hj0xIuSle769pw@hPhebW>_^- znAsYcs7+MLB_qN!eLR9SBejXKLH<>3WU?KuCHYKyURR5&PpR!b{kT%Ergd~^0X=G% zAuF`36JAqcei!`d5`|7P8t+dUon6V1;ocxrfWPjxNTfKd<-3WwXdQ{-yJ;b0REw!}dPpa>ic7eaof z%&D6A9RIt%+nu*pZtQ)@nfw!K?5x;I^R&>X6n=+DznfN`@BW7+7tUBH!>`WoQGG`GGVnksG_`U6X}dO$jf21z-y?D<_{imrj9+nFg#V% z?7+yzlluqHE?=6cBzwk-0jFF@g!qY1=o@yf%qqOR@|fPClcuYxlFFSDwUugZdbCSb z(w0WJVr2m1A4Yiuq5GmNzzfskN4+NOM`b}x75q?r$nqg9G!RcwW7H~`l&G20oPYSG z*AAT4dG($fhfgc>yJvRr4^CdI@w=3LBN$k?d9xp2rJ)LmCi50GP@!^AWDQKHX5t4I zUblzuo7t7-cZu)dssA`y*nV0ifbX(|FRs|oeh8N=!*mpwmq1fC(!{$dK8>b_KZu1@ zzYW!Xr6gl%!gi=5dKg zU$vbp(<2@0Ru94Q=C-A`q3i+}FG?Qxb-7-4ctFj%v2t_2a+{5nJ7Z?dD%$(!J3n;P zM=v;QPw&~g_`X|iU482Zx83{cASWrzX;laxMV=07cSD&4smy}1?Qj58S5OElM286p zhEyL|-G5dw=kyMb=gv40)!`ol5q>U*JsNWN?`65}##rX#NIQ>?Q>JZ;a^1(0C|eGh zA*-O}LyixnT?m22;fmcm`ho4(d879z`e!~5JQc{DpP)Sjp=3bu1&#(T z;-RPloKWKpxHc9Vm8~W)G+hW7npL#qT4tK7=Ev7vc^1qpJFg z|JycmRWFsDg7q}NQM!^^+RkQitj!2|)1^lZ^Yfl{;IAL{(E9J?fDg!$< z4N%WC`!v4*^)C&a3sBXd(SvtX){e)+x@>YuOcRM|S>B>g6+FyP?A`3ErX zWy7W3h_o-u4sWcSzxm#V`84cVp{*Fw0$7Dw$deiVj zeWxvtb;Y_j6|diL$Li5!Io?x!%cW?4vrotj``?QC{{ZSgjR`Oe_exZ!64hlDHvn)! zyy-%yP(2X{h=jR|@9DU5%f&~(oZsGdest!sDxaiL2FGfv8U8tbFVd~J>8f7ZCZ%o4 zv=soVTSfCcqh`!gb{6kA;oF$!eDm^|-||5J%w98#^v*zfkMPexQ6xM`&IxH_QCgT8 zCmm7&AjO&LLMS9u81xIu?HhLY-#PVg*Lm;!?#jPBPpT@57|Bxa3OU1=CqO-O=Td`b+gLLpX&V;`t&U`KfHHf<{7?{pPt?g z-HeaTJZ_(zL-b5V!&cyz(V540PK7lIQqKt9GTR} zRBU_TD$}YD**=7|q2j5KNf7o4bBLQyyeDz$lb34eYRZP4Yr8c5iNMV1xzCY;Nld=Z3jv&TP5e%eMvi{JZU9Gwk!;hvWi)JPj zQahb=Fy0;GKZ#e`^i(RWR0GLCI3Iy(@HLEN-=}0SC&1|ADFyCo7?RU;MWtFXzJ?tb zg1LNq$WEl%BC4V#*0d#7@GpkjLT1>2naEabC(;&9YFIKtW8+`*FZ0{@GZ9wJEjbVIyZOafF&h;5K<+}Z6!s;W3`%2yrCh4;sM-bRUsc5XyYK*w z!b6n4$555;=Qk_8n8xcsa+F~Ov)IBK0pmp4#2j5%Nn&c7Uu$%fiUA9oMW{-kJsv6Q z)^ZaQnIRKK9sc7;Dxla#E~o~SL>z1L!r*Moz#13q)esW6Vz-s!*(1O+gV8C?EMatt z8PWo*QPo;{idU+b)qeoVYkDTCXG^^)C*Nsg+7%V+;;^O%i`nchxSX0+zZJ=~>8cfN zgJYS(SMmFmjYa(yZl82p~R}Eu6i1q;t%UPhXnh{erR4AX-qhYMAg`06cp{GIxyQ8b!#&X17r`$J8 z-cOu8#y`eyQ#xAeBpE9P)eKE0AsK#Kda`JxQz50($pm9PasEuK+NP&dVP3IQ!EigA z{;7PYQIGCZR)99D-$WUADdN*thA!Yg+B}V!S_K|PpXdK6>QP2mPw36a(A}U&c>*+H zlEJ3$8fpb5w(2$Ht!igHky5qJL_BqsUWg~sx=JwrMHGt^Vi{TqkS4cZ!f6V#N&A&P z7bjtxptLa!!{2#o?@9cDW$TWixx~usWBjZ9N0@W%fqfdYIlxKGyu@hcCB__@(FwT| z{QF^e@C*TE7ozzVGKrd%2p4wJ2r>~fXw$;*gXYQ44GN>^mO^E9WcBj)qXz6@wYsW1 zXa_Kh)}xvD-|Zaf%m4+rx3wm>lBXdR=+j%S8LVZ-T2DW=vQHbWV#iDsB&MUb;i0aOZ_1gBXj2QW>B(>qa`h4QTn2c3no#k3){Jqd+;DC|P@ zStu1P5n|b!iAtdcn~k$k{HLhSGrtydQlyW=rVLtQsKuLsQ^Ko1jaFqH6W|Gf0@;@( zMD}F~k$qW0WM3u-!nN7HOp>A1#=L`?);xCRZKAc&d>P?(9@<+Baqe-=3Dkk_{ncmoXTe1K6LXCMI zigwIt-9v8nW$ehtT12%);wNiMAJrDosu!s#^%{_v)5V}ZB>Y~+s~NAF z+u6K9+3*3szo}1PDuuZ{&&*p-xt!nB(EUi7-lL3xrUYjFOYD|bn!3RAF1H1A6HV0i zee1^}v{6ri)+UOPS^+`ii*h%3N3u7Dgvo|o^xrDEPy<&QWN~B3ChBcv;{t^`(%62K zSW9uvJSf@{hh1j}WbuAj_y zsar&E=eCGNEVC&41}iM=>2p-hM$7Ejyy|DOy_WxYeq~gXHe6*n_|}6}0Bhl0wU70p zc8`0~>e;a8A~{s~)uPG|p)w7jGA&}^T}YNK(ek@#f!44Ti|}zRZ3OLCmA)sC56iGZ zVjXxnaA>&3 zV*V=A3+ZG__G3A)056vA-*Q$fN2DHc26Q~BN4)9)DmLb;g$fh|c{<1whAP0G?m+j2 z?%;b-98_vb-wBeM5+dC}LZmwo)F30FUpD9tQ_wUoXq0{Yi%>gf{!QAmL?8BYj0;VS zHrnP|-Lk-+3YPSpc2C+LtQVV4((i}1?MeSO7pmh-?Yce=ZII?eEkn|H6D7ZB8K2Jl z7pRhb*c+g8{K58NwFPSGx+dzMXsL}e-)kt-HwpSX;JG?SD=DB%3vQW~4oxeWPyRNP z*7&^Qx4jALf1FqP&iqK=F3WB=#@U`ub^HNngIVD`~+ZyyM(l1UC`o)A8H?5eXU&K*3aTE^8$tvLLJi5lAsT!Jv9l2UH zjeu1i?OasT(4BbmEP@$M$IWVOeYdY^(AZUuJ^FlIBMIDvd}tkeB!%KfV-E?@*h503 z-AjnHdxGX_^pI(-+WRMI2tALcJ|ITbb==kfx1tyq(a2+7+~nATaFY<>CZV|_kGZ%t z$*xu`*R=?+`7l1YMT`M=@=Ik;iunvvcpA>*?LcByaorclPm~5|(Vhh)uS@@Ai^xR@pa`T+OLLRYg-$y>uTX8#X}>hDR0X$$U!s^B=z+u`PqnI7 z^3R4gyQuDp`eQCpPc=|ym!gvn$qMb!MRLcZi!@46qn~rSs9`LTt`pIAmO@uRHY|@W zl36`i3Pa^ZBar8ZuI2{1L<&1v+VE1S9cgXg-q?%giT-HDUYi$?B}?H@ZLXm4>W1Xe z>gUnRnCeBVp=XJ;qkmrEwG<9S=9g$BZ-reJGHn_BA8Gcv4=p4sED>4OC)A7>#+wqN zktab*8DU}qeaVB#E2xuQ^1_JKUO(*O-sj`q-++6+kGq5jcY>CJJ6RQ$jQp3WM_)4X zX(^jLzOMo9D+S+abN|X`JpObN0>nC5v zkZ_pa$4byl)56M;!)s~Lcq%R=2Y$;Q0<%V?eT>$=l?)RmaU*4pMzDseHUg_RFT*3= ztc{}il!x<))kmM$S6!XC(g<6HsZ4iUkD?3(GQl3~e{^K=nBJ{t>V;^GD@ua56<76P z8D`iyhAZtIYc0hYRzk2pUlfh=ZJU&}dJrS-`dX)?uuA$q>-9B1v{n&ESqbbDK17?b zxPI)Tus@EbXa%Xe460@>Yj4}re$2K^eKpkbB474K<87V6YwJs*p1@jOe|;v6F#PqI zu1yr2#q`l=4Skbb9DwysX3vCJqbYJ!+hNdmS7@4Y#b%|4w~4iynH6i|v|RJYpY)b# zcFA>{f1{r%)@vT$X-~OJHi1WB_80tT{9~|W4r66PdP;#g9-OaCsc?RPRUW2G{0XBx z7PirHg|ND-@{*k=WZJfzxNUu(qI69jd(ufgy**0z+HFJK$F5(2Eh)p1QT^6S6+Kby zDNR-r7Z>#Yjpbk=7gKT_#UocOPwA=brV~!uyeb@2Bc;5JJxXtOO8ud90Q+F(vUD5< zwNbGa?e{L9nkXME6>BJ;Shcce*%aU8)C;K8|C28pUn>OH)XV2C1NrOEMgECu_nzuB zKPptuzufn$2aGQjf=AZ#{|vULmg_~7qeOp1o)RlDz&psokp!$Xb?1U5FC+PQixa|< zmzD6_=6EYSpLid5Hu09eQOZU%dPl50@#n8wSDw&>^nOS^EJhJR-&=W-z<|(SeR3@{ zD1QYC|DDi~6gQ6*&r%+jH|6mkZXSWzJNfZgOiSy&`%!N~)URPC4mJzSW{~$n6yh1< zdRQ=M9!}25QQzgQ8{^ePrsOY-zh|IWS=$@e)Y95B)?|mzT%AZoR&-+_e1zZiNiBjM z$;L){?X%+ik)Nom)Oc8~d&dgj!vqhp_D4Al9b-YPN~g(T(a*Q8{3(cXrIkMtqW(-m zwDN}_@b8a& zO&V+rzqF`|%u!+dhLI>yH{ASeqU;KiG4vG6k0>$Yl7{D91w|Baevp0u!3I6zz-F!`5f%+zOT@H7QGK zl6#|Z`7k!N@Rx3Rkm28p`cTY=l0KC3p>`kYa3Rm^l$z#E9xmhc#b4MWvS~AgaD6S< z)^40+)V!~Ps?q8&6?($wl?wkR<|nJr6mA0b`9|vJXw42$?=(=~sGibFyF6MHDg=a4 z*;_kWh9+G``ek@1l(BZS?5!OwW9?`eYe)A(G|MlkEs8xos-z~uAq=BnPZ2w328&e@Dg-4CRg1x(?#&02p$x{gCclP^mtGN4~l{Z zz5e%oE>!0RElu^Ak*UFT6U=Dj#jnaMDsjOJY_D5%M!SN76-LNN*?Khg7AGV)fkOmd zk?IF09$JyVWV7UiwQO0Ueb=~P1TW6!yMtd;i4kqR;lFnoL2cwIWry2F-s83rA#V@T z9I}3M@E`+?M{X4o@}Z~?(P&&gP5MyEhjKpD?n50e5A~k*{^>-$kv2v0 zye2E=JT}EfOCrMrU=Fo^sTRev7pedfuM_8%IpGD{?^d6$hhVF{tZu6vcFW1L8ytZ; zd#%w(wspo!ZgE62UIgJqjM=c^5hjql$s>Ob zYys~Re_m`MgHC;}>{oO83=iMcF95y|F3`dG_$sM6_}1quRI!#!uGgYrA7-_|z~L1( zc7o?O&U~_ycky@4tmxr);-Ran-lzy)Qs}C?TURG|yTsJj>d?w5Y#1*}g{C)z)+$C@ zb7mvz`^FrAsRr|NP=URXP{LF(AJX9KXku|-2O_L0&WQypssA?U-BW^Y)(!DWyv>`w%l2G{-(|` zDm(0E1~${guLq@kDD6UZem1P#Y+!4oVHszxiHJ1~YdUA%Ayj{t*M9~bPSSIID?N?% z;d!JD`&7axC)TAl(55ud*4ISaU?XjRE@`8Ag4c-skkW8sJ3~?in;}MJY1E<&N{W`< zP>sq{NzqPcy6}SVHVvgcROR@e_Pdo()`xN~R4);4`6kx$*2no;)CdJ}?lBf}W>VY< zbks-rGpB38wp2QH~h)m0Yb z((YFE1aeyPYt3_w=dTY1&(jvfvjRN(G4oa5<@f+i+`^+~@%@fr>8`IsK3HwLqj4qs zV*I?sU*+!cap?KL?*mK4@9H`DZT8D~XsPwF*$8zo-nF&bcoyT|yXV+@JU$-vT;mxy z6g=NC2TxV{S16|mJ7}Mn!J!eC&_L?@=h8OfhU-E%?|#_LCiTU3$KKtF@M61V^UZTG zruApovs+oCvrB3v`h|vwMnyEqd!X-JART8nGA7L z>Xcq=@n;#ZpAzmY(an)9N%Ciz^|u{&{aL=UR=BgQ96wrmvtV0DchB=f_NgH+5jDMR zj!#V=@030@eSBg8ry66YbgC&>>s+TAZ(dVDzmmd%04}fUYeo)0JykIDBGY9G#!H%w zrWN6qSeF4)e3My%b`mbPuDqD0-9zS?WxWI&in#ehM}O|}-?l*h=lS{X5^GI6gx46Y z`SDj#*ZDv+M_ERw)wDiELbN_bLbN_bLbP^!PhJI<-L|osU(wHK?U7&(3w% z@{_0A3xe~`gW&wixj1iC=wyM8`Rf@r{(!-j+GHMMc5ml_ycjXgfJehPv+M@>_$~Qkw4kn#MuO0u&K(q4jNBb zzIBjJSCgX%$A{{6N6&Uh=QzmsS`dXKmfOQ%e1RRHoA|fhaBMlq$R>F>&@=b=0wb8q zro>Pq*il}VQpITog!A48oXG+~9?8!>&NQBDMfxZs9MHtbD3|2XVAouv%^(gklt_2> z^kxLop6sLfcxfw~XEzMl?u&lAmk_mk2~oS35Vd=PT9}P92%5B>CT`<&h@ZFi#q-qI zy>ohCiTer4<`)$AUo8Rmx%v*xW8z#2Wdd5mi12f&%+(y~XHwM9sh~0TA)QXqysOp{ z&Z;Q2j4Td*b_G9gp7DjGZ_VLHU-{7KyJSK7R)fAlu}gIs<>y;I>Kf~_Q-<|ka|s2w zrJ++=LgC%j+(*fB8$Jx_nm#nTK0Y5^T56~mY% zBKjqAD3lPLi6bFet1ltix0xV}!0Kn>V06>4&qLD*IhVJ{h?Wy`j-M+JTzuEOF!)}v zIKC5e@D;Ww<*#wRKtk+;MZ3I_pQqq(fLs9sa$yQ}vMO4FgVsTZV9}v!IKWKsoVLa% z2yUbpGe)2lI{5WBB{GX{5JWABRp4_dFC|#EFuRRHir4#D~mIKTR)L#ut?i1 z%JYzv*9#nXQHwn|j`E^0j4Q@$t+*zh?D*cvKBjiL9Sc_O-dLQuua0T4 zxDNWWDEl(@p;0k6?yn80TXdiexhu|F7cSB&@4&pP5?z0k!37o`$~@b}8uZ^I&)8yl z#um*}SGqu_3Hz&CTk3R@ua@W7E437b#s{>@9qc7qV>Aqvz9tumGM02GV$V$zM#@Ff zY)&a$PiYfULVd=5kaT`k92&n{m!W${(H>=GjkypdGwLb-d<@ow#1GC_{rw?xiD>XB zI^pU(e~-vuXLn!PanHLtqwFzF+N-mhhghuG|x?xyIJg+v$V3+qhn&qq#6K7-D_PYacC6Tl~Z<%{xF$(D_2<4=*H~5vHue$agtvHQ8AfroE-dSoF-W zBU(lB;vAW?3Z2H~61O$aI&Q}v8g7Ggx(}fuDg608?~LX&vBnJhwb6i+eEevYfatLr z56_|#1LPL4jVGSbek4t&o~l=Cc|$uV*8lo%7@~){xJr(v5tQf*#+t z-AWIcvPp3HOXCvQkycC^H_`ML-YjtoT~{>C3qQlx@h6_OJnvc{&m$W0L@UQWdq<#P zB4Rejr*o0L_N4!XwBge!XcDqr2zKIzo%m=eSL4om7I@yWC&^RNkm&7?vf??zg?3AA z#3eWvmmfFdvKhGK1z&vY!9n>#<^(#Mh>K+zw3t^yEqrO3b!o)voh`E#&D>J@S|?jP zzHNO0aDDsYxDGCa>lPnZf9!BjzRKYO@zonRNT`{wXoq5Sr;4>3jePx@UQVU5I=044 zC$QEz+``vfs!&L&R%%(v7}wgM<9hy+bao>7!)}LE6B4a)-x!?21{HwDqtD5?eN`xD zOWZ-jf!4JYKhcv(xpQd~c8xzG+BP)MrmPm_wnB`dXa@ zlrtaXY%2{+bjYM78L-YUW$ufjNA`N@wite}QrY99P;=z$LZ~Qq!+*^|=$b+h{$(RxW6#6Ko}f1*I-j zav|X{xzGu=LT;$$!pGPygLZn!qDR^O6_nMPkI{Ly9xW>lQ(7XR<)lSvc|Xyzzmb*` zKuZPF{)3`id>ht*vfM6Gjya5J{YVR~_bp0mrIpq$G$(o<3&+ z%EMdk|3>_L?(jB#Z@lO3rAz129WTz6UbDct((>q;`q2%Xj!!Zpim+G1Ic=Jb53ej+u^vHt<%j?pONSBt&b=$vYC{t>O6s_%nA zUM`Dm!q&6_Thm5x=o`so{9L9_XV)+_C-Bc;w&)_42ATo&*MZe(akYsQsk5nuJv|zC zG?_~+X{8eskOU~qTcc%-ev9n?;&C^1kQurP2 zR(0qnL6dTuOVcS06p0b^BGk-RR7*#`sUVvWZz|O$oKeKU7JHnj7rOX%v#S~~K7=wT zQ=ydQ7(*v#d!b4gJ{0qzxDVxAXra=m&kHY1+#)*}Hj&!8ts#{Y_R)D1bkn*fDknOl z&EIdUej>eF>*`L%WQfIC_3m7y2Zj85VHbkM#XYtjI|xP;{I4eXwcZK#A8D#v{%Q8F zZ>&?Yd?rz!j$`Ly-jDXBxeS;dtR}f{6sb&#vZ2rpHz?{SjtGKY6)CA0)2SHKsTk9# z-k46sm=0S#?38xzJo!sE*xeR_r)YXGqw6J15jDu{f3Bjac4!ct1Fr8=t#Ew zq8zqjEb)MHB=E|JT@ZaA-Fg}9hbY3Pmu{W%ARH|3`Qy5b?rEAD-sSO{_q8Zu{C1z= zGc8&d@m%1ftX9Y(91%Ft8a=`FR-EMNSyUk;L^u(II_=@)+BE9eeAY8A)Uo((gIz)L zBaXa-b=z@0-^PWLULItL_S63pG9uTL{`siKV|TrzZ;w8NG~dyj<~Jx!xkoVRq_ozN zBsPd%${90rb~;}2eze=>x9~4{G5HbmI{|pK(B8Dq8!gBFFKNjyPD@IR6^2B)9AJGY zuYO@x?}s30JUIxf8sR!3&kI^o`Jt*Uxx6l?YP00hxsc|d-LgPkrM;(@&x1cLFh*;H zvkUpoJcrm{a!A;pP;V3R>?XpUc9tK+a#zdLC&~&}*_oD07Ep%zn0e+$t_yN#0iM@@FV!coSXurxhY0=B6 z|6I=6Y3n?3V>R7aO*e2TgE)Jx00TVjM{CF(a_fT{I=0r^%2ILl0NTxRkeljYvMX)r z=D^yG>uZsdqt)(qJ+wMm$=Q}OwriD5n`{TGivtc}oa>au6S(hxWtv zh%=H!1FVfEfRoVEXm?}m$*33B?D4cT^XL<^FG&{Pjpf;%hE^y9FI9FDGTz?in^2Ed z!w>fmdc!$qP}Yw*UUDOUV(tk_4aXrbS^Vypd%9A~xyc@#(=QC2|NZRHdEz0_Ie@i8 zB*|&rW}_sh6A$EW{1Q6EQxM4fwd4Z69|uK$5Qd?pOYqH}X~?geRAz?*E%*E{XyMQ~ zU&HUhn2mPkbkDd&xzL%W6^wLZqD=Z+Xn{V}^IoJa7$C1PVlW12pMly!#S!(_Af=O9 z!0It9-Z9qI(Vta=Rw5ZU7AzGkP0G7lH?(z@6R~h#Tc%A_3#(2T>RdND7>2z4Hu;Jmmh{+pwQeT&zo@ zom|9tzIFfYsHmW{|F(o^|7{7;{@Vm$TBm9MZF19_v+MTHV7HjF(e?o{n_xXQ)`x!s zHk0QImxt!VVMVfoPBzFcUIwiZ02$M z>>NLif5CUt_IWY-Ea(5!V)@_Sn7@=)Q)ug*LSB&#JBG`XSJFOB@=8J^uOvkBilD{h zRSz1|!cvNl(|&6Ui>9?=gEdbc^}R4Su3sF--XMfT_^40?Uzm^Eg|*V-w72)Ozl)x4kC@}T(Yi03v`5g4wS*4g{OXlxaoB4M!zeDTM zN70%F#Tg`I|B#FRDp&@HT|v-RVC%$GK>|;xlb2iJLmh$wD!tTd6KPEK@NyU%&ygNV zlQ|9U(o0wl3o}U?W)iMC8Sdce=lu8Tn%QD)vP$K^1h8O-RFK;Ic86U{r#lPa&%jK_H{PcA}+l8hzPsZYhOk zU-m6NF0L#4VTB9%JZoBz@{kt}THzn|d>{BEw9KoBC*dld5aQC394=wkhK^Fq& zunO%)sif(3oLuB#V%q8l}P>tcRRo06TKN!3nQOV+5K;{%?P z6Uy|Doj$TTuXWd#wV`*$Hj^kbvSN_uMp%rI)2`{WsXy6r;f!A&$n98?qG`R2m; zeCLOb`sf8`?dd&xmq}$I)@o!Dq>RUg!?cPrZ`CtF;Nxy#UV>&I>Kpi<8 zadKu)73Z!wX#ZmG9`MKaMySv5(xgJxT?!j?A+V`oMOovbmP*sIGO|lcah!&vDz~nh zn+Yci1zAt^F)X*G^>b&sIJJwh0+pMOQ+;ilE0E_yvI(`8BAknxSBS}2WDasELQb>m zOKt>y@~k@AIf%ymgr6AW)^U@2KhO@R#5uW$xCyC5ra={KLTL-k`()ThAC_)K=WA4} zVBDAWNvvmtjCyYHxOfpf4m9Eczpk~yCyjgnX$|lg_^||kIg~Jtu3ZXgzo9mJCZ=Of@{O#=Vp^ zH_PVL!yynjbe6~Y-I%jqhJ7TYCPzC8MNungV=cL%9#4i9>?=UWXkkKLP(YhIV{X2n zWN_x^lrlEX?^bl%w5ubN`Oe;WDDRvZDg{$r;mZQi0M`QXP_oC;bcKH+JUF?obLfOs z1y#*ua4ghlcwJ@d+qT*(_Kbvk%2}>VjdrYEIp7@DxE(I__^`o4j-7?SUSRIX+1rJj zM$QiH)$QAZ4?1#|rePX6dq!dp3b^-#hFne55)FHHpWC=ecTOI>#h+d|`&RAcvp}MK6`>kc!qcIB0rtKhQF47ntzdhjsFY( zCjWQ-YbC7oDjStkl`EASmA5MIP(G~OuY5`Qs`AfjP#sdo)$`PA)Em^-s(aOUs~=MD zQ@^D?shL{0HlnT5HfX16S7_I2*K0Rx_h^r4kLww|S6`zat$$Ykf&O#DGCGZZ<1*t_ z#;qoND$FCzYs`x+OHBv^|D4G47 z-b-dC#%uUZO^ng|hFQWZ@{Mt9@dD|KZW$cF1PJn}_H)Bbnn@#ttYl^*wQ;k7EvWItqE23> zM8--)SHB{73IsFomXXO<#(|nhTwsU931NIK(oVXGgQ`q2og$7Q32-vi^I~zmSX_-Q z=*8CcY__hkYN=9=&_*oj%qor+I#C-d<0xjstU<8Uk`Nzd1EZwcL}sJ|cS#abCs!?1 zjecIKLi~(V3rF*o!lO2lp@xliZ$fC094SDcOw=ml6Ezd}AxI`L`vgf)LsH0s(ih?- zB}7DKBr`hFiJXusL`K;t4_6`fAmm0zQb{0|N+M5uO}SF;nRG2_mi^l#s4L@@X?T33 zGx&pEpBBj>d2v@_Hkw8v^dMPE5kaX+O{OtX>)@a=LM|g=9)Z6fs1xs+6Sa|v)i|vl z)1;IZkN~MTpPraEAvIX^jFc=yCY%_s*LZpaQ=<^Uf=0pw@;jMH;mH_LPy^Shf}#Dq zR2>FVf-Fy1f|+GxAu)#dotWn62aFVW4BjBkOtO=Um(edk@OSc2AOaCeNv`HdD@9D4 z7@w#jNAMA)OE<>om2_r|3IwDZ^!4~yc_f9Bp5{U<6Hm%Ub!-LUNraD*EJx`jN7K^^ zQl@lKBq$lm7n~*vfMRW}QZm6(6sPwA)eK6nnyk8?i9%~BGb)|&bf!|JSCP?bF3K6z zBaO}*d?tPaUw9R+A})(0DbtBDltYA5JtLkBp*CZackqFVrl0CIsze#j%2lL}(yXo# z^$&<=Oi}%iA2J4(#0LGjhH#@=Pg=qFm{4F+Y4y6-cmMf^t9$ov z-C_=mEl(%yY9LiA;0Rt5n(53_LH<3f^Q`4PrBct#Z?ZuLJ~OK7*tySVRh^Uas%V<7 zDjXIK#r|B}wiT{80bA!vz=~TAS3;-90~Q`Sb^sczV%v0A4bOxO1u87ZKhxPA!*?oo z>>$Ta(2SdoqK5d(;;K&haXUHl<0x`Mc4{y*YAT(&5eRAqS9Q&@@gJMd=_dYAp|ctW z?r6YHQD<(*+HJO#v)^oX@HYqlw9PP7OSKKn04hirFkU4@5F;Ucq#9f|4a)Y?yk^i1 zO)-f;MFUy*B@l*<+wB7Xb4xXhAd&-GDzY~;-B$6wja&fWRb54D7>}OjL{v58m~ksU zv*AU~zR1}>tUCKUHH}tdXN{m~ht!~!andnMO~+KV%?N}O)a)W~EmzSNtWv%skZ}@0 z3{t77>5dt2Vm7LOFlR-rs9{=mAfiMfAyqX37;GB05mQrWKz7Dau~j6Rdwj4EvJ#oR zj)tGj+i}CxH69FL6)(vdEeIz*T|@eY8AMAoY~9cUs>MeKm5>Gz0$Brzz&qo%u4-+= z5d#N`bGlWC+ZNY5vZ0`%*s7_oQDa;Wpp8NdC`KB$oUjhb6VM$4$?G=BHy+5vsL>Mx zRI^i!sKzHDZrVbIrNs-yY{&=!2u4)L>Q*$)Ehh_NAYRnCq8d)vh(K&PNj+|dAvYr- zJ?doRKwk}oome!eL<~D;gF(nE5XnTHaK_fUdO9-gimDiRtmjo*jmIOIR44csiQC*z zl?1l}nB;;avcdtyh=;+)a7b4mKP_hfQced0G}|ypMC)ohdOyd4P(`tjP>aM#j&&GF zz=;MS?VO|yURosh(ovFix(b#WArhh}5Nz$KYN}y6wnC`l#+qTD)d8ymVqe>qQ_P6o z4q2E<7_lBFo>Ozd{zR8!rNf1cW(1OsYNLvrrvj0n$`wToXN`!HvQw533jq$mmA1!F z^oSWo$%c$%)UqS7lw&)N#SL&%j|AEhL6hrtA{DnC)Eaao(GE3~?6lCw1fvkVQ5B-x zF(Y>PR1HcR9Bok&ii(dw3X-squwzGqq2LMyLOLEmw*!8GmyrCXgX&}|U>XX;w$NDx zjWrn_L$3#s9s*;6X3zw`V{L{VipP~m7tf?LbUk(e(TKmM`rb7f{G9A335eA#)w`%CKPbfe!irzeeRJ87njTqS996g1X@ zOrzgZ4eD!Aav;S}`E(!Jjin6~!#1AuO%I~G(g*#!7T8d~T>@=7CXbW}@d8pBC^o-Q z1aGM897dg>Eb`OSg|KEATEx;UuINSx1%Xtko`iJK84_V;ZhAT%2g;_IHM1ZONPrdS ze^I&d2PzRdc%+Leq~n8tisnm=Gb>55XhsVq6LHXGqCVu2R7w#tz)(>pD0E6i#Y`8< z2SiXIP#>*wO^-}32cX!?r$o-Lr^bsA5fA_g+b~l|P7`Hf}$8t2_hyM}NiaU|0npG^*GSJg< zZbOjJkR%(ixdWUW+tLFVn?TVIKmvv^=vO(W#)Go54znuw#u0!};xRScs!WJr32YNJnuUgThu6bJ@_7;HfngKKI$3Vu<2 zg0ewf4eDu1Rjdd^J!vJVg0_;N>`YYXbjpUW8`^-SIw(&KLtmgnc7^NN`Ln;(&Qt$! z9=pP|3)&T~=eJ<(&zJZ^{9*nr{y2X^i75TbCgn8cD&;2SHszhlN0iShUsk@R{0p*O zq1Mz3)K{uEskf?cQs1k7ME$J#sQQ#wrf{vuhMSRZqe@5exUt_-lh-e zr|DPduhrkBe?6&AiY>#&t>~^ZHBOD z(iAgIFOxCSGjP((urwB89u%|Zp1CpweGC6+t{wkszGYPWNmHU^TEsMK-Lg13ju~cQ zpCIdQKTpBJAZBtaWS1rTD*hq%Ov9t&uA#W$9%lLlHZYyYZ(#!!)>JaO0)3kL1^&Vu z>yZEghUt#DNi)X6?V7NrJX>??5mBj1rVwuZ;>4P?&VPvKGc*VzZdwpBS$rPWB8!n_hCc?$sI0;L`^w zlb$Vvx@#G4WP8tx2C)|nVlNuR{y#8?UGj$RJETF(>K|X8N!Zn3s$2*w|2wk{&CfJi z#4xb>LpO+FTz6Pl#9n0Wb7pLOk+lo5_L=|J-q%ORaoyMb-pqai3xEKz0CvfxmLf%p zl(Yh{;HPCv6hUJlL%R!rv}6$=1(6^L2?S^m6a^TDmDVJc7BD`WI4#pSs+%f}lPEr^ zoYUs$xNT0W)^6(tZtJG5>J$r5P1V+a_z=XYitYW~U6IsB949g3IOh?ZyMw{(d-uM1 z^P4yCzBe-ya!W$xWucJcga1@oRtY;Rgs!0=%p-JByXdP5!4!^QaN@dPIqU><>jX+d za1hk@Du=^S5rF&P24NAD1iPzh(63cj5!w*iaAGTZ+#K|%2mIl>NV$QF11qeqE%ac; zp?ytF`**}2k3Vo|->zLBNumP@o(dLrJE8}s&@YFMeC>y+Kz|@sLg<)>LFMsOAwzWI zp-T^a^yp!S72_Ul-rdx+Z|A1gyWVNsR)(${bjAn0HMO;6=s(i#`;ywn4(?7S_f_79 zemVUrygbK`&Zlyk{@UT>E2~2%KJ0E!>Bh8nlzHKn!ST=ze>`6!00S<7enO<>mTT!K zBVS3#>+v`h=zn6b6Z#hYr6G76j(I}6H%kKOJ@UcK4~5E0PzIqOI@yBg--6|jjwyez zyR0!3O15q--(FF=JyeeFMs!e_{pE>%EtEh-1+=?PDf-gT4;%9PV(5i}9`uRA7F1IL z9jdVJ4fFS!9^WbXqm4RO(Zv11$)bn_DHCr)F1Nc zSPV1|O3GmyhDz7L?87jWlEA_4M^Vi~2fEYgOs3llcM1)dQvddPA4UrzDje=U9PAEm z3T+M^4h9bw);6kZhqDA{I8Hg3VhXx5LWG_~YO=vp!}Z;R9WdHa&nL{SK~T|?%qj7$ zzm?>_8QHoBp&Lz+Y+asPX*)(`xt^f+(eCz8cT*+CLt-EhqEvNLQw16{8o;X6y;V-i zNXKpz{-am}I2z;x#}4);{;K023#>4}3v^hJN-J8>|1T=g%!;V3icuP+Rr}#AYC6HY zptBlcF(wKYGMw-Acxawihq0g#U~7kQU~A~{BDA^zINyGZxl$%@6sy5BSW;aEuN-t> zdHcQLT`<5y$b;4a- z7cjhOd#yU(UO3-=Z-tNBg7?(Y`S!v!)j)XA+3Z}ejE{F80&A1dG&{rcr*qDC! z^T@bVFFOv#QI-3gK-ESa#oqHR0qTB zFnY^T=exYTDp*?!O`pf&l<^91noDa#^^t4vzB9A41R${94;?$G0m~8 zv<{WbYf36kqV{sI3{EPvjw7hQ75Y1x-#8u|lM3fsEpH4?Py^hp2>9WASGsk^k1<~c zBh(x?-#SRh!1;DU;1mk_J*5~#h8n7awa@^E1CLo}TKIInab43kJsRcZjwj*UcdMXr z{@%?(O$OIvuMM?9j0>pPV?tqXd6UnNE2mSf&Nqe@g@Ulp1A0*_4OGF$$D#ImaD$}I zHwdfqZIloqM|l|Gp?rO5jSu%$>*#!ANMG$bb-v5jL5SMkTH9RjX{6(IQN?#64~)OV zm_f{J!$<)A72}!kP+e~zv>v0U%0uqD(h!Evp?aX5?}o6KAH&oz&e4nOE^e)0ePg@> z&SR9CTUCkj()#2WHZx8m)bDKG>32w_}vhWr`LzkXvVR= zxAnb$0`u_hq%UWE)bNje-lRQVoH6@TGtc!-9xv;AtC9V#%Wi#d>wDXYpoQTK7)4?y zf?_JLoe274md!xVR&djm3Mf;b&Xsz#UeQ!Gx*v=nLz6Ti@II-q!cFzPI(g?R;-c5d29!fA&uLa@O~@zV~|{;%w*V|2XI8 zTi@II-gdq>Cb-)NAlnBZ+Xo=?F%x&-0m#<(w!XJc%)r?CpV+gdt?zApZ#&-`Q)BFW zZ=JbN;ZMpa0V}Ki~S^ z*7vr)xAncP?`?f=>wCYo&YH8dv-VO+2y}&H~@OKF*M*#&L6hE zxAnadifVUZphDUbk=~a`u;- zEqCK@+qY?+@6XM?-`l?5+rHo1zTX=cP=qTDDE9r{4?Fh#-ktznIUNl8D!hKz>v0|T zFZ~mvtvPGX-XU|=7VRA?TI+jT-`o1$*7vr)xAncP?`?f=>wDv7!}{L7Xf?)J>T8nj z-(@h|()!-k_qM*b^}Vg{ZGCU+dt2Yz`reIu8h5Fiy5;UB^;7+YdHzkickM~4<+{5G zPON{+cKclVcb`jd=X>AovRmKV`rg*}w!XLZy>~b5(WmBY+ume-Z&=;d_jW?T63pv$ zg2Adl$hhTeW%}fHo$KrPLnkVO`uOfpuoMp`HKqP4f5>sm%uto<<*Rgq)oXStJ&MRa z=lq9HrMJGf^}Vg{ZGCU+dt2Yz`rg*}w!XLZy5^6KJja-G#% zT@zL_`CT8?&iDT5I=`&%ZGCV1oOAn}bNifg`Jne5EK3bZdFOpQyy$Gj-Bsq z=X=}v-gdsXo$qbud)sjecAUbWa-4$oy{+$UeQ)b~Ti@II-q!cFzPI(gt?zAgj=uH1 z@k#^N7zaJi75<>>!z3G@^kI9z?;dU5 z-PE*i=cd-X-f7%c<_7fw8<@+xp(t_qM*b^}Vg{?V2jw8<@+xp)2{ocEp_y+SWcl!!&TF0Y3wrme4@vQ$X+qd}lB=w!>)jogWt?GM{ z*7vr)xAncP?`?f=>w8<@+xp(t_jdhmDHiK{2Vuv%W`B92KjgapKt%;Sf7dC+IpX@f zA-^vcf<5Jdr(fd5V-m2d>%#jlHF)->*93hbZwdZpTH-{ zfUm*!ce@YnZfxB9&L7m^+t&BCzPI(gt?zApZ|i$o-`o1$*7vr)xAnbUU\KDRcE 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 literal 0 HcmV?d00001 diff --git a/abcdefg/polices/traveling.ttf b/abcdefg/polices/traveling.ttf new file mode 100755 index 0000000000000000000000000000000000000000..5d9d7c9baa0d59de29239dd800c67ca357d70a2d GIT binary patch literal 85604 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 literal 0 HcmV?d00001 diff --git a/abcdefg/polices/ubuntu-title.ttf b/abcdefg/polices/ubuntu-title.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d1ad5ef85521909e489fba4dd588a0df32da8efa GIT binary patch literal 22268 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 literal 0 HcmV?d00001 diff --git a/abcdefg/polices/varsity.ttf b/abcdefg/polices/varsity.ttf new file mode 100755 index 0000000000000000000000000000000000000000..c261600980626de1e9f531a1662a34b56b01cf55 GIT binary patch literal 26572 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 literal 0 HcmV?d00001 diff --git a/aleatoire.php b/aleatoire.php deleted file mode 100755 index f3bd499..0000000 --- a/aleatoire.php +++ /dev/null @@ -1,63 +0,0 @@ - -

- Générateur Aléatoire -

- - - - -
- Bienvenue dans ce programme de choix aléatoire.
- Il permet de tirer au sort une possibilité parmis plusieurs.
- 1) Choisissez parmi combien de possibilités vous voulez tirer au sort.
- 2) Donner un nom à chaque possibilité.
- 3) Le programme vous donnera aléatoirement un des noms.
- -
- -
- - - - -
- - - Choix : -
- - - - -
- - - - - - - La valeur choisie aléatoirement est , numéro - - - - - - - - - - Erreur - - - diff --git a/antmusique.php b/antmusique.php deleted file mode 100755 index 5f7932b..0000000 --- a/antmusique.php +++ /dev/null @@ -1,44 +0,0 @@ - - - -

Les AntMusiques

-
- Les AntMusiques sont publiées sous LFTCQTV. -


- - Tout Télécharger (32 Mo) - -

- SHA256 : 06f48e208a4fb517a4d0be98a72ec5c54f662188eed8d9ddc219e3cfd3f93249 -

- SHA1 : 9967acdd91d61e86d9118d7e819ce73504235d91 -

- MD5 : e718e24cc38a95924fa96efd4be10c7c - - -
- -
-

- AntMusique : -

- -

- Télécharger -
- - -
- -
- - diff --git a/apropos.php b/apropos.php deleted file mode 100755 index 20323c7..0000000 --- a/apropos.php +++ /dev/null @@ -1,54 +0,0 @@ - - -

À propos

- -
- Site réalisé par Miraty et publié sous license libre CeCILL. -

- Accéder au code source sur Gitea -
-
-
- Les icones de ce site sont celles du pack Fontello. -
-
-
- Les "publicité" du site sont celles du projet sense3 créé par JosephK et diffusé sous licence MIT. -
-
-
- Merci à Zarkaa pour avoir réalisé le logo Ant et l'image de la page 404. -
- -
-
- -
- Ce site ne charge aucun contenu depuis des sites tiers et n'utilise que des technologies libres. -
- -

-
- - Me contacter : -

- Par E-mail : miraty<arrow-base>antopie<point>org -

- Sur Mastodon : @miraty@social.antopie.org - - - -
- - - - -

- -
- En partenariat avec wiziix et Madaho. -
- - - diff --git a/bdd.sql b/bdd.sql deleted file mode 100755 index 43a9fca..0000000 --- a/bdd.sql +++ /dev/null @@ -1,296 +0,0 @@ --- phpMyAdmin SQL Dump --- version 4.6.6deb5 --- https://www.phpmyadmin.net/ --- --- Client : localhost:3306 --- Généré le : Jeu 30 Août 2018 à 16:06 --- Version du serveur : 5.7.23-0ubuntu0.18.04.1 --- Version de PHP : 7.2.7-0ubuntu0.18.04.2 - -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -SET time_zone = "+00:00"; - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; - --- --- Base de données : `anternet` --- - --- -------------------------------------------------------- - --- --- Structure de la table `articles` --- - -CREATE TABLE `articles` ( - `id` int(11) NOT NULL, - `titre` varchar(255) NOT NULL, - `pseudo` varchar(255) NOT NULL, - `article` text NOT NULL, - `moment` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - --- -------------------------------------------------------- - --- --- Structure de la table `codeFourmie` --- - -CREATE TABLE `codeFourmie` ( - `id` int(11) NOT NULL, - `codeSource` varchar(255) NOT NULL, - `codeCompilé` varchar(255) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - --- --- Contenu de la table `codeFourmie` --- - -INSERT INTO `codeFourmie` (`id`, `codeSource`, `codeCompilé`) VALUES -(1, '#\\[bleu\\]#', ''), -(10, '#\\[vert\\]#', ''), -(11, '#\\[rouge\\]#', ''), -(12, '#\\[rose\\]#', ''), -(13, '#\\[cyan\\]#', ''), -(14, '#\\[gris\\]#', ''), -(15, '#\\[bleufoncé\\]#', ''), -(16, '#\\[cyanfoncé\\]#', ''), -(17, '#\\[jaunefoncé\\]#', ''), -(18, '#\\[rosefoncé\\]#', ''), -(19, '#\\[rougefoncé\\]#', ''), -(20, '#\\[boite\\]#', ''), -(21, '#\\[souligné\\]#', ''), -(22, '#\\[italique\\]#', ''), -(23, '#\\[grand\\]#', ''), -(24, '#\\[gras\\]#', ''), -(25, '#\\[orange\\]#', ''), -(26, '#\\[/lien\\]#', ' '), -(27, '#\\[lien\\|#', ''), -(29, '#\\[l\\]#', '
'), -(30, '#:\\)#', ''), -(31, '#\\[vertfoncé\\]#', ''); - --- -------------------------------------------------------- - --- --- Structure de la table `commentaires` --- - -CREATE TABLE `commentaires` ( - `id` int(11) NOT NULL, - `pseudo` varchar(60) NOT NULL, - `anonyme` varchar(3) NOT NULL, - `commentaire` text NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - --- -------------------------------------------------------- - --- --- Structure de la table `commentairesArticle` --- - -CREATE TABLE `commentairesArticle` ( - `id` int(11) NOT NULL, - `titre` varchar(255) NOT NULL, - `pseudo` varchar(255) NOT NULL, - `commentaire` text NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - --- -------------------------------------------------------- - --- --- Structure de la table `compte` --- - -CREATE TABLE `compte` ( - `id` int(11) NOT NULL, - `pseudo` varchar(60) NOT NULL, - `mdp` varchar(500) NOT NULL, - `confirmerLien` varchar(255) NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - --- -------------------------------------------------------- - --- --- Structure de la table `navigateur` --- - -CREATE TABLE `navigateur` ( - `id` int(11) NOT NULL, - `nomDeCode` text NOT NULL, - `nomComplet` text NOT NULL, - `editeur` text NOT NULL, - `source` text NOT NULL, - `libre` text NOT NULL, - `bibliModule` text NOT NULL, - `description` text NOT NULL, - `monAvis` text NOT NULL, - `lienTelecharger` text NOT NULL, - `lienWikipedia` text NOT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - --- --- Contenu de la table `navigateur` --- - -INSERT INTO `navigateur` (`id`, `nomDeCode`, `nomComplet`, `editeur`, `source`, `libre`, `bibliModule`, `description`, `monAvis`, `lienTelecharger`, `lienWikipedia`) VALUES -(1, 'cliqz', 'Cliqz', 'Cliqz', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Cliqz est navigateur intégrant un moteur de recherche directement dans la barre d\'adresse. Il suffit simplement de taper sa recherche, et les résultats s\'affichent instantanément en dessous. Il existe également sous forme d\'extension Firefox. ', 'C\'est cool', 'https://cliqz.com/en/desktop', 'https://de.wikipedia.org/wiki/Cliqz'), -(2, 'firefoxdeveloperedition', 'Firefox Developer Edition', 'Mozilla', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Firefox Developer Edition est un navigateur spécialisé pour le développement Web. ', 'C\'est Firefox mais pour les développeurs', 'https://www.mozilla.org/fr/firefox/developer/all/', 'https://fr.wikipedia.org/wiki/Mozilla_Firefox#Versions_de_d%C3%A9veloppement'), -(3, 'firefox', 'Firefox', 'Mozilla', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Firefox est le navigateur créé par Mozilla .', 'C\'est le meilleur navigateur !', 'https://www.mozilla.org/fr/firefox/', 'https://fr.wikipedia.org/wiki/Mozilla_Firefox'), -(4, 'tor', 'Tor', 'The Tor Project', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Tor Browser est un navigateur spécial : en plus de permettre de naviguer sur le Web \"banal\", il permet de se connecter au DarkNet Tor pour accéder au DarkWeb. Il inclut donc le \"VPN\" spécial, l\'extention HTTPS Everywhere et NoScript. ', 'C\'est utile à condition d\'avoir besoin d\'être anonyme. Sinon on pert juste du temps à charger les pages.', 'https://www.torproject.org/download/download-easy.html', 'https://fr.wikipedia.org/wiki/Tor_Browser'), -(5, 'waterfox', 'Waterfox', 'Alex Kontos', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Waterfox est un navigateur historiquement optimisé pour les processeurs 64 bits. ', 'C\'est une sotre de version semi-rétro de Firefox.', 'https://www.waterfoxproject.org/downloads', 'https://fr.wikipedia.org/wiki/Waterfox'), -(6, 'cyberfox', 'Cyberfox', ' 8pecxstudios', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Cyberfox est un navigateur basé sur Firefox qui combine le menu à droite et l\'ancien menu en haut à gauche.', 'C\'est pour les nostalgiques des anciennes version de Firefox.', 'https://cyberfox.8pecxstudios.com/', 'https://wikipedia.org/wiki/Cyberfox'), -(7, 'palemoon', 'Pale Moon', 'Moonchild Productions', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Pale Moon est un navigateur basé sur une ancienne version de Firefox (la 27.6.2). ', 'C\'est pour les TRÈS nostalgiques des TRÈS anciennes versions de Firefox', 'https://www.palemoon.org/', 'https://fr.wikipedia.org/wiki/Pale_Moon'), -(8, 'seamonkey', 'SeaMonkey', 'Mozilla', 'Firefox', 'icon-check-1 vert', 'Firefox', 'Sea Monkey est un projet abandonné par Mozilla, remplacé par Firefox et Thunderbird. Il incluait un navigateur Web, un éditeur HTMl, et un client d\'E-mails. ', 'C\'est très vieux et moche...', 'https://www.seamonkey-project.org/releases/', 'https://fr.wikipedia.org/wiki/SeaMonkey'), -(9, 'chromium', 'Chromium', 'Google', 'Chromium', 'icon-check-1 vert', 'Chrome Web Store', 'Chromium est le projet source de Chrome déstiné aux développeurs. ', 'C\'est utile si on veut utiliser Chrome mais en libre.', 'https://download-chromium.appspot.com/', 'https://fr.wikipedia.org/wiki/Chromium_(navigateur_web)'), -(10, 'chrome', 'Chrome', 'Google', 'Chromium', 'icon-cancel-3 rouge', 'Chrome Web Store', 'Chrome est le navigateur développé par Google. ', 'C\'est nul !', 'https://www.google.com/chrome/browser/desktop/index.html', 'https://fr.wikipedia.org/wiki/Google_Chrome'), -(11, 'vivaldi', 'Vivaldi', 'Vivaldi Technologies', 'Chromium', 'icon-cancel-3 rouge', 'Chrome Web Store', 'Vivaldi est le projet lancé par un ancien PDG de Opera. Il est basé sur Chromium, mais dispose d\'une interface graphique très belle, et de quelques petites fonctionnalitées interressantes. ', 'Il y a beaucoup de fonctionnalités et de personnalisation. ', 'https://vivaldi.com/', 'https://fr.wikipedia.org/wiki/Vivaldi_(navigateur_web)'), -(12, 'torch', 'Torch', 'Torch Media', 'Chromium', 'icon-cancel-3 rouge', 'Chrome Web Store', 'Torch est navigateur basé sur le projet Chromium. Il inclu plusieurs fonctionnalitées supplémentaires, comme un client torrent. ', 'Il y a des fonctionnalités inédites, mais peu utiles dans un navigateur Web.', 'https://torchbrowser.com/', 'https://en.wikipedia.org/wiki/Torch_(browser)'), -(13, 'brave', 'Brave', 'Brendan Eich', 'Chromium', 'icon-check-1 vert', 'Aucune', 'Un navigateur créé par un co-fondateur de Mozilla.', 'Protecteur de la vie privée mais avec des publicités', 'https://www.brave.com/', 'https://fr.wikipedia.org/wiki/Brave_(navigateur_web)'), -(14, 'midori', 'Midori', 'Christian Dywan', 'Midori', 'icon-check-1 vert', 'Aucune', 'Midori est un navigateur Web basé sur Chromium pour son moteur de rendu, mais graphiquement original. ', 'C\'est un peu vieillot', 'http://midori-browser.org/', 'https://fr.wikipedia.org/wiki/Midori'), -(15, 'maxthon', 'Maxthon', 'Maxthon', 'Internet Explorer', 'icon-cancel-3 rouge', 'Maxthon', 'Maxthon est un navigateur chinois qui fonctionne avec le moteur de rendu de Internet Explorer. ', 'C\'est original', 'http://fr.maxthon.com/', 'https://fr.wikipedia.org/wiki/Maxthon'), -(16, 'opera', 'Opera', 'Opera Software', 'Opera', 'icon-cancel-3 rouge', 'Opera', 'Opera est un navigateur Web indépendant. ', 'C\'est un navigateur totalement indépendant et original.', 'https://www.opera.com/fr/computer', 'https://fr.wikipedia.org/wiki/Opera'), -(17, 'yandex', 'Yandex Browser', 'Yandex', 'Chromium', 'icon-cancel-3 rouge', 'Opera', 'Yandex Browser est un navigateur web développé par l\'entreprise russe Yandex et basé sur le projet libre Chromium.', 'C\'est plutôt joli.', 'https://browser.yandex.com/', 'https://fr.wikipedia.org/wiki/Yandex_Browser'), -(18, 'internetexplorer', 'Internet Explorer', 'Microsoft', 'Internet Explorer', 'icon-cancel-3 rouge', 'Aucune', 'Internet Explorer est l\'un des plus vieux navigateurs Web. Il appartient à Microsoft et ne fonctionne que sur les ordinateurs sous Windows. ', 'Il a été très utilisé par le passé mais a été dépassé par d\'autres navigateurs.', 'Ben, non.', 'https://fr.wikipedia.org/wiki/Internet_Explorer'), -(19, 'edge', 'Edge', 'Microsoft', 'Internet Explorer', 'icon-cancel-3 rouge', 'Aucune', 'Edge est une nouvelle version graphique d\' Internet Explorer. Comme Internet Explorer, il appartient à Microsoft et ne fonctionne qu\'avec les ordinateurs sous Windows. ', 'C\'est forcément mieux qu\'Internet Explorer, mais ça reste nul.', 'https://fr.wikipedia.org/wiki/Microsoft_Edge', 'https://fr.wikipedia.org/wiki/Microsoft_Edge'), -(20, 'safari', 'Safari', 'Apple', 'Safari', 'icon-cancel-3 rouge', 'Aucune', 'Safari appartient à Apple et ne fonctionne que sur les ordinateurs sous Mac. ', '', 'Ben non, c\'est toujours pas ça !', 'https://fr.wikipedia.org/wiki/Safari_(navigateur_web)'), -(21, 'konqueror', 'Konqueror', 'KDE', 'Konqueror', 'icon-check-1 vert', 'Aucune', 'Le navigateur Web KDE, dont le moteur de rendu, KHTML sert de base à WebKit d\'Apple (utilisé dans Safari). Il peut aussi servir d\'explorateur de fichiers.', '', 'https://kubuntu.org', ''); - --- -------------------------------------------------------- - --- --- Structure de la table `pages` --- - -CREATE TABLE `pages` ( - `id` int(11) NOT NULL, - `adresse` varchar(255) NOT NULL, - `titre` varchar(255) NOT NULL, - `description` varchar(255) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - --- --- Contenu de la table `pages` --- - -INSERT INTO `pages` (`id`, `adresse`, `titre`, `description`) VALUES -(1, 'index.php', 'Accueil', 'Page d\'accueil'), -(2, 'aleatoire.php', 'Tirage au sort', 'Programme de tirage au sort pour choisir aléatoirement quelque chose'), -(3, 'antmusique.php', 'AntMusiques', '10 AntMusiques créées par Miraty'), -(4, 'apropos.php', 'À propos', 'À propos du site Antopie.org/web'), -(5, 'cave.definition.php', 'Définitions', 'Des définitions simples concernant l\'informatique et internet'), -(6, 'cave.mdr.php', 'Moteurs de recherche', 'Liste et descriptions de moteurs de recherche'), -(7, 'cave.module.php', 'Modules complémentaires', 'Liste et descriptions de modules complémentaires (addons) pour Firefox'), -(8, 'cave.navigateur.php', 'Navigateurs Web', 'Liste et descriptions de navigateurs Web pour choisir le meilleur'), -(9, 'cave.os.php', 'Systèmes d\'exploitation', 'Liste et descriptions de systèmes d\'exploitation'), -(10, 'cgu.php', 'Conditions d\'utilisation', 'Conditions générales d\'utilisation de site Antopie.org'), -(11, 'commentaire.php', 'Espace commentaire', 'Espace commentaire pour envoyer un message à propos du site ou lire ceux des autres'), -(12, 'connexion.php', 'Connexion', 'Page de connexion à son compte Ant'), -(13, 'deconnexion.php', 'Déconnexion', 'Effacer sa session PHP (sa connexion à son compte)'), -(14, 'fourmiliere.php', 'La fourmilière', 'Un espace de blog pour n\'importe qui'), -(15, 'liste_des_nombres.php', 'Liste des nombres de 1 à 1 million', 'Un page recensant, ligne par ligne, le premier million des nombres entier'), -(16, 'monnavigateur.php', 'Mon navigateur', 'À propos de mon navigateur'), -(17, 'signup.php', 'Créer un compte Ant', 'Page de création de compte Ant'), -(18, 'confirmationlien.php', 'Confirmation de lien', 'Souhaitez-vous suivre ce lien ?'), -(19, '404.php', 'Erreur 404', 'Erreur 404'); - --- --- Index pour les tables exportées --- - --- --- Index pour la table `articles` --- -ALTER TABLE `articles` - ADD PRIMARY KEY (`id`), - ADD KEY `id` (`id`); - --- --- Index pour la table `codeFourmie` --- -ALTER TABLE `codeFourmie` - ADD PRIMARY KEY (`id`), - ADD KEY `id` (`id`); - --- --- Index pour la table `commentaires` --- -ALTER TABLE `commentaires` - ADD PRIMARY KEY (`id`), - ADD KEY `id` (`id`); - --- --- Index pour la table `commentairesArticle` --- -ALTER TABLE `commentairesArticle` - ADD PRIMARY KEY (`id`), - ADD KEY `id` (`id`); - --- --- Index pour la table `compte` --- -ALTER TABLE `compte` - ADD PRIMARY KEY (`id`), - ADD KEY `id` (`id`); - --- --- Index pour la table `navigateur` --- -ALTER TABLE `navigateur` - ADD PRIMARY KEY (`id`), - ADD KEY `id` (`id`); - --- --- Index pour la table `pages` --- -ALTER TABLE `pages` - ADD PRIMARY KEY (`id`), - ADD KEY `id` (`id`); - --- --- AUTO_INCREMENT pour les tables exportées --- - --- --- AUTO_INCREMENT pour la table `articles` --- -ALTER TABLE `articles` - MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; --- --- AUTO_INCREMENT pour la table `codeFourmie` --- -ALTER TABLE `codeFourmie` - MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=32; --- --- AUTO_INCREMENT pour la table `commentaires` --- -ALTER TABLE `commentaires` - MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=18; --- --- AUTO_INCREMENT pour la table `commentairesArticle` --- -ALTER TABLE `commentairesArticle` - MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; --- --- AUTO_INCREMENT pour la table `compte` --- -ALTER TABLE `compte` - MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42; --- --- AUTO_INCREMENT pour la table `navigateur` --- -ALTER TABLE `navigateur` - MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=22; --- --- AUTO_INCREMENT pour la table `pages` --- -ALTER TABLE `pages` - MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/bibli/animate.min.css b/bibli/animate.min.css new file mode 100644 index 0000000..e5ccfcf --- /dev/null +++ b/bibli/animate.min.css @@ -0,0 +1,11 @@ + @charset "UTF-8"; + +/*! + * animate.css -http://daneden.me/animate + * Version - 3.7.0 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2018 Daniel Eden + */ + +@-webkit-keyframes bounce{0%,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translateZ(0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0);animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0);animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translateZ(0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0);animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0);animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;-webkit-transform-origin:center bottom;animation-name:bounce;transform-origin:center bottom}@-webkit-keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}.headShake{-webkit-animation-name:headShake;-webkit-animation-timing-function:ease-in-out;animation-name:headShake;animation-timing-function:ease-in-out}@-webkit-keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}.swing{-webkit-animation-name:swing;-webkit-transform-origin:top center;animation-name:swing;transform-origin:top center}@-webkit-keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes wobble{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{0%,11.1%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes jello{0%,11.1%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{-webkit-animation-name:jello;-webkit-transform-origin:center;animation-name:jello;transform-origin:center}@-webkit-keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}.heartBeat{-webkit-animation-duration:1.3s;-webkit-animation-name:heartBeat;-webkit-animation-timing-function:ease-in-out;animation-duration:1.3s;animation-name:heartBeat;animation-timing-function:ease-in-out}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{-webkit-transform:scale3d(1.03,1.03,1.03);opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{-webkit-transform:scaleX(1);opacity:1;transform:scaleX(1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{-webkit-transform:scale3d(1.03,1.03,1.03);opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{-webkit-transform:scaleX(1);opacity:1;transform:scaleX(1)}}.bounceIn{-webkit-animation-duration:.75s;-webkit-animation-name:bounceIn;animation-duration:.75s;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(0,-3000px,0);opacity:0;transform:translate3d(0,-3000px,0)}60%{-webkit-transform:translate3d(0,25px,0);opacity:1;transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(0,-3000px,0);opacity:0;transform:translate3d(0,-3000px,0)}60%{-webkit-transform:translate3d(0,25px,0);opacity:1;transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(-3000px,0,0);opacity:0;transform:translate3d(-3000px,0,0)}60%{-webkit-transform:translate3d(25px,0,0);opacity:1;transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(-3000px,0,0);opacity:0;transform:translate3d(-3000px,0,0)}60%{-webkit-transform:translate3d(25px,0,0);opacity:1;transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(3000px,0,0);opacity:0;transform:translate3d(3000px,0,0)}60%{-webkit-transform:translate3d(-25px,0,0);opacity:1;transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(3000px,0,0);opacity:0;transform:translate3d(3000px,0,0)}60%{-webkit-transform:translate3d(-25px,0,0);opacity:1;transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(0,3000px,0);opacity:0;transform:translate3d(0,3000px,0)}60%{-webkit-transform:translate3d(0,-20px,0);opacity:1;transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{-webkit-transform:translate3d(0,3000px,0);opacity:0;transform:translate3d(0,3000px,0)}60%{-webkit-transform:translate3d(0,-20px,0);opacity:1;transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{-webkit-transform:scale3d(1.1,1.1,1.1);opacity:1;transform:scale3d(1.1,1.1,1.1)}to{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{-webkit-transform:scale3d(1.1,1.1,1.1);opacity:1;transform:scale3d(1.1,1.1,1.1)}to{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-duration:.75s;-webkit-animation-name:bounceOut;animation-duration:.75s;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{-webkit-transform:translate3d(0,-20px,0);opacity:1;transform:translate3d(0,-20px,0)}to{-webkit-transform:translate3d(0,2000px,0);opacity:0;transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{-webkit-transform:translate3d(0,-20px,0);opacity:1;transform:translate3d(0,-20px,0)}to{-webkit-transform:translate3d(0,2000px,0);opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{-webkit-transform:translate3d(20px,0,0);opacity:1;transform:translate3d(20px,0,0)}to{-webkit-transform:translate3d(-2000px,0,0);opacity:0;transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{-webkit-transform:translate3d(20px,0,0);opacity:1;transform:translate3d(20px,0,0)}to{-webkit-transform:translate3d(-2000px,0,0);opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{-webkit-transform:translate3d(-20px,0,0);opacity:1;transform:translate3d(-20px,0,0)}to{-webkit-transform:translate3d(2000px,0,0);opacity:0;transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{-webkit-transform:translate3d(-20px,0,0);opacity:1;transform:translate3d(-20px,0,0)}to{-webkit-transform:translate3d(2000px,0,0);opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{-webkit-transform:translate3d(0,20px,0);opacity:1;transform:translate3d(0,20px,0)}to{-webkit-transform:translate3d(0,-2000px,0);opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{-webkit-transform:translate3d(0,20px,0);opacity:1;transform:translate3d(0,20px,0)}to{-webkit-transform:translate3d(0,-2000px,0);opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{-webkit-transform:translate3d(0,-100%,0);opacity:0;transform:translate3d(0,-100%,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInDown{0%{-webkit-transform:translate3d(0,-100%,0);opacity:0;transform:translate3d(0,-100%,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{-webkit-transform:translate3d(0,-2000px,0);opacity:0;transform:translate3d(0,-2000px,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInDownBig{0%{-webkit-transform:translate3d(0,-2000px,0);opacity:0;transform:translate3d(0,-2000px,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{-webkit-transform:translate3d(-100%,0,0);opacity:0;transform:translate3d(-100%,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInLeft{0%{-webkit-transform:translate3d(-100%,0,0);opacity:0;transform:translate3d(-100%,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{-webkit-transform:translate3d(-2000px,0,0);opacity:0;transform:translate3d(-2000px,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInLeftBig{0%{-webkit-transform:translate3d(-2000px,0,0);opacity:0;transform:translate3d(-2000px,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{-webkit-transform:translate3d(100%,0,0);opacity:0;transform:translate3d(100%,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInRight{0%{-webkit-transform:translate3d(100%,0,0);opacity:0;transform:translate3d(100%,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{-webkit-transform:translate3d(2000px,0,0);opacity:0;transform:translate3d(2000px,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInRightBig{0%{-webkit-transform:translate3d(2000px,0,0);opacity:0;transform:translate3d(2000px,0,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{-webkit-transform:translate3d(0,100%,0);opacity:0;transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInUp{0%{-webkit-transform:translate3d(0,100%,0);opacity:0;transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{-webkit-transform:translate3d(0,2000px,0);opacity:0;transform:translate3d(0,2000px,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes fadeInUpBig{0%{-webkit-transform:translate3d(0,2000px,0);opacity:0;transform:translate3d(0,2000px,0)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}to{-webkit-transform:translate3d(0,100%,0);opacity:0;transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}to{-webkit-transform:translate3d(0,100%,0);opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}to{-webkit-transform:translate3d(0,2000px,0);opacity:0;transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}to{-webkit-transform:translate3d(0,2000px,0);opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}to{-webkit-transform:translate3d(-100%,0,0);opacity:0;transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}to{-webkit-transform:translate3d(-100%,0,0);opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}to{-webkit-transform:translate3d(-2000px,0,0);opacity:0;transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}to{-webkit-transform:translate3d(-2000px,0,0);opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0);opacity:0;transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0);opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}to{-webkit-transform:translate3d(2000px,0,0);opacity:0;transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}to{-webkit-transform:translate3d(2000px,0,0);opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}to{-webkit-transform:translate3d(0,-100%,0);opacity:0;transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}to{-webkit-transform:translate3d(0,-100%,0);opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}to{-webkit-transform:translate3d(0,-2000px,0);opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}to{-webkit-transform:translate3d(0,-2000px,0);opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-animation-timing-function:ease-out;-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);animation-timing-function:ease-out;transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn)}40%{-webkit-animation-timing-function:ease-out;-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);animation-timing-function:ease-out;transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg)}50%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);animation-timing-function:ease-in;transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg)}80%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg);animation-timing-function:ease-in;transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg)}to{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);animation-timing-function:ease-in;transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg)}}@keyframes flip{0%{-webkit-animation-timing-function:ease-out;-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);animation-timing-function:ease-out;transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn)}40%{-webkit-animation-timing-function:ease-out;-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);animation-timing-function:ease-out;transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg)}50%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);animation-timing-function:ease-in;transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg)}80%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg);animation-timing-function:ease-in;transform:perspective(400px) scale3d(.95,.95,.95) translateZ(0) rotateY(0deg)}to{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);animation-timing-function:ease-in;transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg)}}.animated.flip{-webkit-animation-name:flip;-webkit-backface-visibility:visible;animation-name:flip;backface-visibility:visible}@-webkit-keyframes flipInX{0%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0;transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in;transform:perspective(400px) rotateX(-20deg)}60%{-webkit-transform:perspective(400px) rotateX(10deg);opacity:1;transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0;transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in;transform:perspective(400px) rotateX(-20deg)}60%{-webkit-transform:perspective(400px) rotateX(10deg);opacity:1;transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-animation-name:flipInX;-webkit-backface-visibility:visible!important;animation-name:flipInX;backface-visibility:visible!important}@-webkit-keyframes flipInY{0%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateY(90deg);animation-timing-function:ease-in;opacity:0;transform:perspective(400px) rotateY(90deg)}40%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateY(-20deg);animation-timing-function:ease-in;transform:perspective(400px) rotateY(-20deg)}60%{-webkit-transform:perspective(400px) rotateY(10deg);opacity:1;transform:perspective(400px) rotateY(10deg)}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateY(90deg);animation-timing-function:ease-in;opacity:0;transform:perspective(400px) rotateY(90deg)}40%{-webkit-animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateY(-20deg);animation-timing-function:ease-in;transform:perspective(400px) rotateY(-20deg)}60%{-webkit-transform:perspective(400px) rotateY(10deg);opacity:1;transform:perspective(400px) rotateY(10deg)}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-animation-name:flipInY;-webkit-backface-visibility:visible!important;animation-name:flipInY;backface-visibility:visible!important}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);opacity:1;transform:perspective(400px) rotateX(-20deg)}to{-webkit-transform:perspective(400px) rotateX(90deg);opacity:0;transform:perspective(400px) rotateX(90deg)}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);opacity:1;transform:perspective(400px) rotateX(-20deg)}to{-webkit-transform:perspective(400px) rotateX(90deg);opacity:0;transform:perspective(400px) rotateX(90deg)}}.flipOutX{-webkit-animation-duration:.75s;-webkit-animation-name:flipOutX;-webkit-backface-visibility:visible!important;animation-duration:.75s;animation-name:flipOutX;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);opacity:1;transform:perspective(400px) rotateY(-15deg)}to{-webkit-transform:perspective(400px) rotateY(90deg);opacity:0;transform:perspective(400px) rotateY(90deg)}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);opacity:1;transform:perspective(400px) rotateY(-15deg)}to{-webkit-transform:perspective(400px) rotateY(90deg);opacity:0;transform:perspective(400px) rotateY(90deg)}}.flipOutY{-webkit-animation-duration:.75s;-webkit-animation-name:flipOutY;-webkit-backface-visibility:visible!important;animation-duration:.75s;animation-name:flipOutY;backface-visibility:visible!important}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);opacity:0;transform:translate3d(100%,0,0) skewX(-30deg)}60%{-webkit-transform:skewX(20deg);opacity:1;transform:skewX(20deg)}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);opacity:0;transform:translate3d(100%,0,0) skewX(-30deg)}60%{-webkit-transform:skewX(20deg);opacity:1;transform:skewX(20deg)}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-name:lightSpeedIn;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);opacity:0;transform:translate3d(100%,0,0) skewX(30deg)}}@keyframes lightSpeedOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);opacity:0;transform:translate3d(100%,0,0) skewX(30deg)}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-name:lightSpeedOut;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform:rotate(-200deg);-webkit-transform-origin:center;opacity:0;transform:rotate(-200deg);transform-origin:center}to{-webkit-transform:translateZ(0);-webkit-transform-origin:center;opacity:1;transform:translateZ(0);transform-origin:center}}@keyframes rotateIn{0%{-webkit-transform:rotate(-200deg);-webkit-transform-origin:center;opacity:0;transform:rotate(-200deg);transform-origin:center}to{-webkit-transform:translateZ(0);-webkit-transform-origin:center;opacity:1;transform:translateZ(0);transform-origin:center}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform:rotate(-45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(-45deg);transform-origin:left bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:left bottom;opacity:1;transform:translateZ(0);transform-origin:left bottom}}@keyframes rotateInDownLeft{0%{-webkit-transform:rotate(-45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(-45deg);transform-origin:left bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:left bottom;opacity:1;transform:translateZ(0);transform-origin:left bottom}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform:rotate(45deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(45deg);transform-origin:right bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:right bottom;opacity:1;transform:translateZ(0);transform-origin:right bottom}}@keyframes rotateInDownRight{0%{-webkit-transform:rotate(45deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(45deg);transform-origin:right bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:right bottom;opacity:1;transform:translateZ(0);transform-origin:right bottom}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform:rotate(45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(45deg);transform-origin:left bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:left bottom;opacity:1;transform:translateZ(0);transform-origin:left bottom}}@keyframes rotateInUpLeft{0%{-webkit-transform:rotate(45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(45deg);transform-origin:left bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:left bottom;opacity:1;transform:translateZ(0);transform-origin:left bottom}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform:rotate(-90deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(-90deg);transform-origin:right bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:right bottom;opacity:1;transform:translateZ(0);transform-origin:right bottom}}@keyframes rotateInUpRight{0%{-webkit-transform:rotate(-90deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(-90deg);transform-origin:right bottom}to{-webkit-transform:translateZ(0);-webkit-transform-origin:right bottom;opacity:1;transform:translateZ(0);transform-origin:right bottom}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;opacity:1;transform-origin:center}to{-webkit-transform:rotate(200deg);-webkit-transform-origin:center;opacity:0;transform:rotate(200deg);transform-origin:center}}@keyframes rotateOut{0%{-webkit-transform-origin:center;opacity:1;transform-origin:center}to{-webkit-transform:rotate(200deg);-webkit-transform-origin:center;opacity:0;transform:rotate(200deg);transform-origin:center}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;opacity:1;transform-origin:left bottom}to{-webkit-transform:rotate(45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(45deg);transform-origin:left bottom}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;opacity:1;transform-origin:left bottom}to{-webkit-transform:rotate(45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(45deg);transform-origin:left bottom}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;opacity:1;transform-origin:right bottom}to{-webkit-transform:rotate(-45deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(-45deg);transform-origin:right bottom}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;opacity:1;transform-origin:right bottom}to{-webkit-transform:rotate(-45deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(-45deg);transform-origin:right bottom}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;opacity:1;transform-origin:left bottom}to{-webkit-transform:rotate(-45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(-45deg);transform-origin:left bottom}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;opacity:1;transform-origin:left bottom}to{-webkit-transform:rotate(-45deg);-webkit-transform-origin:left bottom;opacity:0;transform:rotate(-45deg);transform-origin:left bottom}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;opacity:1;transform-origin:right bottom}to{-webkit-transform:rotate(90deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(90deg);transform-origin:right bottom}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;opacity:1;transform-origin:right bottom}to{-webkit-transform:rotate(90deg);-webkit-transform-origin:right bottom;opacity:0;transform:rotate(90deg);transform-origin:right bottom}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-animation-timing-function:ease-in-out;-webkit-transform-origin:top left;animation-timing-function:ease-in-out;transform-origin:top left}20%,60%{-webkit-animation-timing-function:ease-in-out;-webkit-transform:rotate(80deg);-webkit-transform-origin:top left;animation-timing-function:ease-in-out;transform:rotate(80deg);transform-origin:top left}40%,80%{-webkit-animation-timing-function:ease-in-out;-webkit-transform:rotate(60deg);-webkit-transform-origin:top left;animation-timing-function:ease-in-out;opacity:1;transform:rotate(60deg);transform-origin:top left}to{-webkit-transform:translate3d(0,700px,0);opacity:0;transform:translate3d(0,700px,0)}}@keyframes hinge{0%{-webkit-animation-timing-function:ease-in-out;-webkit-transform-origin:top left;animation-timing-function:ease-in-out;transform-origin:top left}20%,60%{-webkit-animation-timing-function:ease-in-out;-webkit-transform:rotate(80deg);-webkit-transform-origin:top left;animation-timing-function:ease-in-out;transform:rotate(80deg);transform-origin:top left}40%,80%{-webkit-animation-timing-function:ease-in-out;-webkit-transform:rotate(60deg);-webkit-transform-origin:top left;animation-timing-function:ease-in-out;opacity:1;transform:rotate(60deg);transform-origin:top left}to{-webkit-transform:translate3d(0,700px,0);opacity:0;transform:translate3d(0,700px,0)}}.hinge{-webkit-animation-duration:2s;-webkit-animation-name:hinge;animation-duration:2s;animation-name:hinge}@-webkit-keyframes jackInTheBox{0%{-webkit-transform:scale(.1) rotate(30deg);-webkit-transform-origin:center bottom;opacity:0;transform:scale(.1) rotate(30deg);transform-origin:center bottom}50%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}70%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}to{-webkit-transform:scale(1);opacity:1;transform:scale(1)}}@keyframes jackInTheBox{0%{-webkit-transform:scale(.1) rotate(30deg);-webkit-transform-origin:center bottom;opacity:0;transform:scale(.1) rotate(30deg);transform-origin:center bottom}50%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}70%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}to{-webkit-transform:scale(1);opacity:1;transform:scale(1)}}.jackInTheBox{-webkit-animation-name:jackInTheBox;animation-name:jackInTheBox}@-webkit-keyframes rollIn{0%{-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);opacity:0;transform:translate3d(-100%,0,0) rotate(-120deg)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}@keyframes rollIn{0%{-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);opacity:0;transform:translate3d(-100%,0,0) rotate(-120deg)}to{-webkit-transform:translateZ(0);opacity:1;transform:translateZ(0)}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) rotate(120deg);opacity:0;transform:translate3d(100%,0,0) rotate(120deg)}}@keyframes rollOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) rotate(120deg);opacity:0;transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0)}}@keyframes zoomInDown{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(10px,0,0)}}@keyframes zoomInLeft{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(10px,0,0)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(1000px,0,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(-10px,0,0)}}@keyframes zoomInRight{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(1000px,0,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(-10px,0,0)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,1000px,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0)}}@keyframes zoomInUp{0%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,1000px,0)}60%{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{-webkit-transform:scale3d(.3,.3,.3);opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0)}to{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform-origin:center bottom}}@keyframes zoomOutDown{40%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0)}to{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform-origin:center bottom}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);opacity:1;transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{-webkit-transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;opacity:0;transform:scale(.1) translate3d(-2000px,0,0);transform-origin:left center}}@keyframes zoomOutLeft{40%{-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);opacity:1;transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{-webkit-transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;opacity:0;transform:scale(.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);opacity:1;transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{-webkit-transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;opacity:0;transform:scale(.1) translate3d(2000px,0,0);transform-origin:right center}}@keyframes zoomOutRight{40%{-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);opacity:1;transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{-webkit-transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;opacity:0;transform:scale(.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0)}to{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform-origin:center bottom}}@keyframes zoomOutUp{40%{-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19);opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0)}to{-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1);opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform-origin:center bottom}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:hidden}}@keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:hidden}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:hidden}}@keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:hidden}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:hidden}}@keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:hidden}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:hidden}}@keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:hidden}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}.animated{-webkit-animation-duration:1s;-webkit-animation-fill-mode:both;animation-duration:1s;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.delay-1s{-webkit-animation-delay:1s;animation-delay:1s}.animated.delay-2s{-webkit-animation-delay:2s;animation-delay:2s}.animated.delay-3s{-webkit-animation-delay:3s;animation-delay:3s}.animated.delay-4s{-webkit-animation-delay:4s;animation-delay:4s}.animated.delay-5s{-webkit-animation-delay:5s;animation-delay:5s}.animated.fast{-webkit-animation-duration:.8s;animation-duration:.8s}.animated.faster{-webkit-animation-duration:.5s;animation-duration:.5s}.animated.slow{-webkit-animation-duration:2s;animation-duration:2s}.animated.slower{-webkit-animation-duration:3s;animation-duration:3s}@media (prefers-reduced-motion),(print){.animated{-webkit-animation:unset!important;-webkit-transition:none!important;animation:unset!important;transition:none!important}} diff --git a/bibli/fontello/LICENSE.txt b/bibli/fontello/LICENSE similarity index 100% rename from bibli/fontello/LICENSE.txt rename to bibli/fontello/LICENSE diff --git a/bibli/fontello/README.txt b/bibli/fontello/README.txt deleted file mode 100755 index beaab33..0000000 --- a/bibli/fontello/README.txt +++ /dev/null @@ -1,75 +0,0 @@ -This webfont is generated by http://fontello.com open source project. - - -================================================================================ -Please, note, that you should obey original font licenses, used to make this -webfont pack. Details available in LICENSE.txt file. - -- Usually, it's enough to publish content of LICENSE.txt file somewhere on your - site in "About" section. - -- If your project is open-source, usually, it will be ok to make LICENSE.txt - file publicly available in your repository. - -- Fonts, used in Fontello, don't require a clickable link on your site. - But any kind of additional authors crediting is welcome. -================================================================================ - - -Comments on archive content ---------------------------- - -- /font/* - fonts in different formats - -- /css/* - different kinds of css, for all situations. Should be ok with - twitter bootstrap. Also, you can skip style and assign icon classes - directly to text elements, if you don't mind about IE7. - -- demo.html - demo file, to show your webfont content - -- LICENSE.txt - license info about source fonts, used to build your one. - -- config.json - keeps your settings. You can import it back into fontello - anytime, to continue your work - - -Why so many CSS files ? ------------------------ - -Because we like to fit all your needs :) - -- basic file, .css - is usually enough, it contains @font-face - and character code definitions - -- *-ie7.css - if you need IE7 support, but still don't wish to put char codes - directly into html - -- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face - rules, but still wish to benefit from css generation. That can be very - convenient for automated asset build systems. When you need to update font - - no need to manually edit files, just override old version with archive - content. See fontello source code for examples. - -- *-embedded.css - basic css file, but with embedded WOFF font, to avoid - CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. - We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` - server headers. But if you ok with dirty hack - this file is for you. Note, - that data url moved to separate @font-face to avoid problems with konami.pattern.length) { + konami.input = konami.input.substr((konami.input.length - konami.pattern.length)); + } + if (konami.input === konami.pattern) { + konami.code(konami._currentLink); + konami.input = ''; + e.preventDefault(); + return false; + } + }, + load: function (link) { + this._currentLink = link; + this.addEvent(document, "keydown", this.keydownHandler, this); + this.iphone.load(link); + }, + unload: function () { + this.removeEvent(document, 'keydown', this.keydownHandler); + this.iphone.unload(); + }, + code: function (link) { + window.location = link + }, + iphone: { + start_x: 0, + start_y: 0, + stop_x: 0, + stop_y: 0, + tap: false, + capture: false, + orig_keys: "", + keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"], + input: [], + code: function (link) { + konami.code(link); + }, + touchmoveHandler: function (e) { + if (e.touches.length === 1 && konami.iphone.capture === true) { + var touch = e.touches[0]; + konami.iphone.stop_x = touch.pageX; + konami.iphone.stop_y = touch.pageY; + konami.iphone.tap = false; + konami.iphone.capture = false; + konami.iphone.check_direction(); + } + }, + touchendHandler: function () { + konami.iphone.input.push(konami.iphone.check_direction()); + + if (konami.iphone.input.length > konami.iphone.keys.length) konami.iphone.input.shift(); + + if (konami.iphone.input.length === konami.iphone.keys.length) { + var match = true; + for (var i = 0; i < konami.iphone.keys.length; i++) { + if (konami.iphone.input[i] !== konami.iphone.keys[i]) { + match = false; + } + } + if (match) { + konami.iphone.code(konami._currentLink); + } + } + }, + touchstartHandler: function (e) { + konami.iphone.start_x = e.changedTouches[0].pageX; + konami.iphone.start_y = e.changedTouches[0].pageY; + konami.iphone.tap = true; + konami.iphone.capture = true; + }, + load: function (link) { + this.orig_keys = this.keys; + konami.addEvent(document, "touchmove", this.touchmoveHandler); + konami.addEvent(document, "touchend", this.touchendHandler, false); + konami.addEvent(document, "touchstart", this.touchstartHandler); + }, + unload: function () { + konami.removeEvent(document, 'touchmove', this.touchmoveHandler); + konami.removeEvent(document, 'touchend', this.touchendHandler); + konami.removeEvent(document, 'touchstart', this.touchstartHandler); + }, + check_direction: function () { + x_magnitude = Math.abs(this.start_x - this.stop_x); + y_magnitude = Math.abs(this.start_y - this.stop_y); + x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT"; + y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP"; + result = (x_magnitude > y_magnitude) ? x : y; + result = (this.tap === true) ? "TAP" : result; + return result; + } + } + } + + typeof callback === "string" && konami.load(callback); + if (typeof callback === "function") { + konami.code = callback; + konami.load(); + } + + return konami; +}; + + +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = Konami; +} else { + if (typeof define === 'function' && define.amd) { + define([], function() { + return Konami; + }); + } else { + window.Konami = Konami; + } +} diff --git a/bibli/less.js b/bibli/less.js deleted file mode 100755 index fda7fac..0000000 --- a/bibli/less.js +++ /dev/null @@ -1,12522 +0,0 @@ -/*! - * Less - Leaner CSS v3.7.1 - * http://lesscss.org - * - * Copyright (c) 2009-2018, Alexis Sellier - * Licensed under the Apache-2.0 License. - * - */ - - /** * @license Apache-2.0 - */ - -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.less = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) || - options.isFileProtocol ? 'development' - : 'production'); - - var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash); - if (dumpLineNumbers) { - options.dumpLineNumbers = dumpLineNumbers[1]; - } - - if (options.useFileCache === undefined) { - options.useFileCache = true; - } - - if (options.onReady === undefined) { - options.onReady = true; - } -}; - -},{"./browser":3,"./utils":11}],2:[function(require,module,exports){ -/** - * Kicks off less and compiles any stylesheets - * used in the browser distributed version of less - * to kick-start less using the browser api - */ -/* global window, document */ - -// TODO - consider switching this out for a recommendation for this polyfill? -// -// Browsers have good Promise support -require('promise/polyfill'); - -var options = require('../less/default-options')(); - -if (window.less) { - for (key in window.less) { - if (window.less.hasOwnProperty(key)) { - options[key] = window.less[key]; - } - } -} -require('./add-default-options')(window, options); - -options.plugins = options.plugins || []; - -if (window.LESS_PLUGINS) { - options.plugins = options.plugins.concat(window.LESS_PLUGINS); -} - -var less = module.exports = require('./index')(window, options); - -window.less = less; - -var css, head, style; - -// Always restore page visibility -function resolveOrReject(data) { - if (data.filename) { - console.warn(data); - } - if (!options.async) { - head.removeChild(style); - } -} - -if (options.onReady) { - if (/!watch/.test(window.location.hash)) { - less.watch(); - } - // Simulate synchronous stylesheet loading by hiding page rendering - if (!options.async) { - css = 'body { display: none !important }'; - head = document.head || document.getElementsByTagName('head')[0]; - style = document.createElement('style'); - - style.type = 'text/css'; - if (style.styleSheet) { - style.styleSheet.cssText = css; - } else { - style.appendChild(document.createTextNode(css)); - } - - head.appendChild(style); - } - less.registerStylesheetsImmediately(); - less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject); -} - -},{"../less/default-options":16,"./add-default-options":1,"./index":8,"promise/polyfill":103}],3:[function(require,module,exports){ -var utils = require('./utils'); -module.exports = { - createCSS: function (document, styles, sheet) { - // Strip the query-string - var href = sheet.href || ''; - - // If there is no title set, use the filename, minus the extension - var id = 'less:' + (sheet.title || utils.extractId(href)); - - // If this has already been inserted into the DOM, we may need to replace it - var oldStyleNode = document.getElementById(id); - var keepOldStyleNode = false; - - // Create a new stylesheet node for insertion or (if necessary) replacement - var styleNode = document.createElement('style'); - styleNode.setAttribute('type', 'text/css'); - if (sheet.media) { - styleNode.setAttribute('media', sheet.media); - } - styleNode.id = id; - - if (!styleNode.styleSheet) { - styleNode.appendChild(document.createTextNode(styles)); - - // If new contents match contents of oldStyleNode, don't replace oldStyleNode - keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 && - oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue); - } - - var head = document.getElementsByTagName('head')[0]; - - // If there is no oldStyleNode, just append; otherwise, only append if we need - // to replace oldStyleNode with an updated stylesheet - if (oldStyleNode === null || keepOldStyleNode === false) { - var nextEl = sheet && sheet.nextSibling || null; - if (nextEl) { - nextEl.parentNode.insertBefore(styleNode, nextEl); - } else { - head.appendChild(styleNode); - } - } - if (oldStyleNode && keepOldStyleNode === false) { - oldStyleNode.parentNode.removeChild(oldStyleNode); - } - - // For IE. - // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash. - // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head - if (styleNode.styleSheet) { - try { - styleNode.styleSheet.cssText = styles; - } catch (e) { - throw new Error('Couldn\'t reassign styleSheet.cssText.'); - } - } - }, - currentScript: function(window) { - var document = window.document; - return document.currentScript || (function() { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - })(); - } -}; - -},{"./utils":11}],4:[function(require,module,exports){ -// Cache system is a bit outdated and could do with work - -module.exports = function(window, options, logger) { - var cache = null; - if (options.env !== 'development') { - try { - cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage; - } catch (_) {} - } - return { - setCSS: function(path, lastModified, modifyVars, styles) { - if (cache) { - logger.info('saving ' + path + ' to cache.'); - try { - cache.setItem(path, styles); - cache.setItem(path + ':timestamp', lastModified); - if (modifyVars) { - cache.setItem(path + ':vars', JSON.stringify(modifyVars)); - } - } catch (e) { - // TODO - could do with adding more robust error handling - logger.error('failed to save "' + path + '" to local storage for caching.'); - } - } - }, - getCSS: function(path, webInfo, modifyVars) { - var css = cache && cache.getItem(path), - timestamp = cache && cache.getItem(path + ':timestamp'), - vars = cache && cache.getItem(path + ':vars'); - - modifyVars = modifyVars || {}; - vars = vars || "{}"; // if not set, treat as the JSON representation of an empty object - - if (timestamp && webInfo.lastModified && - (new Date(webInfo.lastModified).valueOf() === - new Date(timestamp).valueOf()) && - JSON.stringify(modifyVars) === vars) { - // Use local copy - return css; - } - } - }; -}; - -},{}],5:[function(require,module,exports){ -var utils = require('./utils'), - browser = require('./browser'); - -module.exports = function(window, less, options) { - - function errorHTML(e, rootHref) { - var id = 'less-error-message:' + utils.extractId(rootHref || ''); - var template = '
  • {content}
  • '; - var elem = window.document.createElement('div'), timer, content, errors = []; - var filename = e.filename || rootHref; - var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; - - elem.id = id; - elem.className = 'less-error-message'; - - content = '

    ' + (e.type || 'Syntax') + 'Error: ' + (e.message || 'There is an error in your .less file') + - '

    ' + '
    ' + - '
      ' + errors.join('') + '
    '; - } - if (e.stack && (e.extract || options.logLevel >= 4)) { - content += '
    Stack Trace
    ' + e.stack.split('\n').slice(1).join('
    '); - } - elem.innerHTML = content; - - // CSS for error messages - browser.createCSS(window.document, [ - '.less-error-message ul, .less-error-message li {', - 'list-style-type: none;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'margin: 0;', - '}', - '.less-error-message label {', - 'font-size: 12px;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'color: #cc7777;', - '}', - '.less-error-message pre {', - 'color: #dd6666;', - 'padding: 4px 0;', - 'margin: 0;', - 'display: inline-block;', - '}', - '.less-error-message pre.line {', - 'color: #ff0000;', - '}', - '.less-error-message h3 {', - 'font-size: 20px;', - 'font-weight: bold;', - 'padding: 15px 0 5px 0;', - 'margin: 0;', - '}', - '.less-error-message a {', - 'color: #10a', - '}', - '.less-error-message .error {', - 'color: red;', - 'font-weight: bold;', - 'padding-bottom: 2px;', - 'border-bottom: 1px dashed red;', - '}' - ].join('\n'), { title: 'error-message' }); - - elem.style.cssText = [ - 'font-family: Arial, sans-serif', - 'border: 1px solid #e00', - 'background-color: #eee', - 'border-radius: 5px', - '-webkit-border-radius: 5px', - '-moz-border-radius: 5px', - 'color: #e00', - 'padding: 15px', - 'margin-bottom: 15px' - ].join(';'); - - if (options.env === 'development') { - timer = setInterval(function () { - var document = window.document, - body = document.body; - if (body) { - if (document.getElementById(id)) { - body.replaceChild(elem, document.getElementById(id)); - } else { - body.insertBefore(elem, body.firstChild); - } - clearInterval(timer); - } - }, 10); - } - } - - function removeErrorHTML(path) { - var node = window.document.getElementById('less-error-message:' + utils.extractId(path)); - if (node) { - node.parentNode.removeChild(node); - } - } - - function removeErrorConsole(path) { - // no action - } - - function removeError(path) { - if (!options.errorReporting || options.errorReporting === 'html') { - removeErrorHTML(path); - } else if (options.errorReporting === 'console') { - removeErrorConsole(path); - } else if (typeof options.errorReporting === 'function') { - options.errorReporting('remove', path); - } - } - - function errorConsole(e, rootHref) { - var template = '{line} {content}'; - var filename = e.filename || rootHref; - var errors = []; - var content = (e.type || 'Syntax') + 'Error: ' + (e.message || 'There is an error in your .less file') + - ' in ' + filename; - - var errorline = function (e, i, classname) { - if (e.extract[i] !== undefined) { - errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) - .replace(/\{class\}/, classname) - .replace(/\{content\}/, e.extract[i])); - } - }; - - if (e.line) { - errorline(e, 0, ''); - errorline(e, 1, 'line'); - errorline(e, 2, ''); - content += ' on line ' + e.line + ', column ' + (e.column + 1) + ':\n' + - errors.join('\n'); - } - if (e.stack && (e.extract || options.logLevel >= 4)) { - content += '\nStack Trace\n' + e.stack; - } - less.logger.error(content); - } - - function error(e, rootHref) { - if (!options.errorReporting || options.errorReporting === 'html') { - errorHTML(e, rootHref); - } else if (options.errorReporting === 'console') { - errorConsole(e, rootHref); - } else if (typeof options.errorReporting === 'function') { - options.errorReporting('add', e, rootHref); - } - } - - return { - add: error, - remove: removeError - }; -}; - -},{"./browser":3,"./utils":11}],6:[function(require,module,exports){ -/* global window, XMLHttpRequest */ - -module.exports = function(options, logger) { - - var AbstractFileManager = require('../less/environment/abstract-file-manager.js'); - - var fileCache = {}; - - // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load - var FileManager = function() { - }; - - FileManager.prototype = new AbstractFileManager(); - - FileManager.prototype.alwaysMakePathsAbsolute = function alwaysMakePathsAbsolute() { - return true; - }; - FileManager.prototype.join = function join(basePath, laterPath) { - if (!basePath) { - return laterPath; - } - return this.extractUrlParts(laterPath, basePath).path; - }; - FileManager.prototype.doXHR = function doXHR(url, type, callback, errback) { - - var xhr = new XMLHttpRequest(); - var async = options.isFileProtocol ? options.fileAsync : true; - - if (typeof xhr.overrideMimeType === 'function') { - xhr.overrideMimeType('text/css'); - } - logger.debug('XHR: Getting \'' + url + '\''); - xhr.open('GET', url, async); - xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); - xhr.send(null); - - function handleResponse(xhr, callback, errback) { - if (xhr.status >= 200 && xhr.status < 300) { - callback(xhr.responseText, - xhr.getResponseHeader('Last-Modified')); - } else if (typeof errback === 'function') { - errback(xhr.status, url); - } - } - - if (options.isFileProtocol && !options.fileAsync) { - if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { - callback(xhr.responseText); - } else { - errback(xhr.status, url); - } - } else if (async) { - xhr.onreadystatechange = function () { - if (xhr.readyState == 4) { - handleResponse(xhr, callback, errback); - } - }; - } else { - handleResponse(xhr, callback, errback); - } - }; - FileManager.prototype.supports = function(filename, currentDirectory, options, environment) { - return true; - }; - - FileManager.prototype.clearFileCache = function() { - fileCache = {}; - }; - - FileManager.prototype.loadFile = function loadFile(filename, currentDirectory, options, environment) { - // TODO: Add prefix support like less-node? - // What about multiple paths? - - if (currentDirectory && !this.isPathAbsolute(filename)) { - filename = currentDirectory + filename; - } - - filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename; - - options = options || {}; - - // sheet may be set to the stylesheet for the initial load or a collection of properties including - // some context variables for imports - var hrefParts = this.extractUrlParts(filename, window.location.href); - var href = hrefParts.url; - var self = this; - - return new Promise(function(resolve, reject) { - if (options.useFileCache && fileCache[href]) { - try { - var lessText = fileCache[href]; - return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }}); - } catch (e) { - return reject({ filename: href, message: 'Error loading file ' + href + ' error was ' + e.message }); - } - } - - self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) { - // per file cache - fileCache[href] = data; - - // Use remote copy (re-parse) - resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified }}); - }, function doXHRError(status, url) { - reject({ type: 'File', message: '\'' + url + '\' wasn\'t found (' + status + ')', href: href }); - }); - }); - }; - - return FileManager; -}; - -},{"../less/environment/abstract-file-manager.js":17}],7:[function(require,module,exports){ -module.exports = function() { - - var functionRegistry = require('./../less/functions/function-registry'); - - function imageSize() { - throw { - type: 'Runtime', - message: 'Image size functions are not supported in browser version of less' - }; - } - - var imageFunctions = { - 'image-size': function(filePathNode) { - imageSize(this, filePathNode); - return -1; - }, - 'image-width': function(filePathNode) { - imageSize(this, filePathNode); - return -1; - }, - 'image-height': function(filePathNode) { - imageSize(this, filePathNode); - return -1; - } - }; - - functionRegistry.addMultiple(imageFunctions); -}; - -},{"./../less/functions/function-registry":26}],8:[function(require,module,exports){ -// -// index.js -// Should expose the additional browser functions on to the less object -// -var addDataAttr = require('./utils').addDataAttr, - browser = require('./browser'); - -module.exports = function(window, options) { - var document = window.document; - var less = require('../less')(); - - less.options = options; - var environment = less.environment, - FileManager = require('./file-manager')(options, less.logger), - fileManager = new FileManager(); - environment.addFileManager(fileManager); - less.FileManager = FileManager; - less.PluginLoader = require('./plugin-loader'); - - require('./log-listener')(less, options); - var errors = require('./error-reporting')(window, less, options); - var cache = less.cache = options.cache || require('./cache')(window, options, less.logger); - require('./image-size')(less.environment); - - // Setup user functions - Deprecate? - if (options.functions) { - less.functions.functionRegistry.addMultiple(options.functions); - } - - var typePattern = /^text\/(x-)?less$/; - - function clone(obj) { - return JSON.parse(JSON.stringify(obj || {})); - } - - // only really needed for phantom - function bind(func, thisArg) { - var curryArgs = Array.prototype.slice.call(arguments, 2); - return function() { - var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0)); - return func.apply(thisArg, args); - }; - } - - function loadStyles(modifyVars) { - var styles = document.getElementsByTagName('style'), - style; - - for (var i = 0; i < styles.length; i++) { - style = styles[i]; - if (style.type.match(typePattern)) { - var instanceOptions = clone(options); - instanceOptions.modifyVars = modifyVars; - var lessText = style.innerHTML || ''; - instanceOptions.filename = document.location.href.replace(/#.*$/, ''); - - /* jshint loopfunc:true */ - // use closure to store current style - less.render(lessText, instanceOptions, - bind(function(style, e, result) { - if (e) { - errors.add(e, 'inline'); - } else { - style.type = 'text/css'; - if (style.styleSheet) { - style.styleSheet.cssText = result.css; - } else { - style.innerHTML = result.css; - } - } - }, null, style)); - } - } - } - - function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) { - - var instanceOptions = clone(options); - addDataAttr(instanceOptions, sheet); - instanceOptions.mime = sheet.type; - - if (modifyVars) { - instanceOptions.modifyVars = modifyVars; - } - - function loadInitialFileCallback(loadedFile) { - - var data = loadedFile.contents, - path = loadedFile.filename, - webInfo = loadedFile.webInfo; - - var newFileInfo = { - currentDirectory: fileManager.getPath(path), - filename: path, - rootFilename: path, - relativeUrls: instanceOptions.relativeUrls}; - - newFileInfo.entryPath = newFileInfo.currentDirectory; - newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory; - - if (webInfo) { - webInfo.remaining = remaining; - - var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars); - if (!reload && css) { - webInfo.local = true; - callback(null, css, data, sheet, webInfo, path); - return; - } - - } - - // TODO add tests around how this behaves when reloading - errors.remove(path); - - instanceOptions.rootFileInfo = newFileInfo; - less.render(data, instanceOptions, function(e, result) { - if (e) { - e.href = path; - callback(e); - } else { - cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css); - callback(null, result.css, data, sheet, webInfo, path); - } - }); - } - - fileManager.loadFile(sheet.href, null, instanceOptions, environment) - .then(function(loadedFile) { - loadInitialFileCallback(loadedFile); - }).catch(function(err) { - console.log(err); - callback(err); - }); - - } - - function loadStyleSheets(callback, reload, modifyVars) { - for (var i = 0; i < less.sheets.length; i++) { - loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars); - } - } - - function initRunningMode() { - if (less.env === 'development') { - less.watchTimer = setInterval(function () { - if (less.watchMode) { - fileManager.clearFileCache(); - loadStyleSheets(function (e, css, _, sheet, webInfo) { - if (e) { - errors.add(e, e.href || sheet.href); - } else if (css) { - browser.createCSS(window.document, css, sheet); - } - }); - } - }, options.poll); - } - } - - // - // Watch mode - // - less.watch = function () { - if (!less.watchMode ) { - less.env = 'development'; - initRunningMode(); - } - this.watchMode = true; - return true; - }; - - less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; }; - - // - // Synchronously get all tags with the 'rel' attribute set to - // "stylesheet/less". - // - less.registerStylesheetsImmediately = function() { - var links = document.getElementsByTagName('link'); - less.sheets = []; - - for (var i = 0; i < links.length; i++) { - if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && - (links[i].type.match(typePattern)))) { - less.sheets.push(links[i]); - } - } - }; - - // - // Asynchronously get all tags with the 'rel' attribute set to - // "stylesheet/less", returning a Promise. - // - less.registerStylesheets = function() { - return new Promise(function(resolve, reject) { - less.registerStylesheetsImmediately(); - resolve(); - }); - }; - - // - // With this function, it's possible to alter variables and re-render - // CSS without reloading less-files - // - less.modifyVars = function(record) { - return less.refresh(true, record, false); - }; - - less.refresh = function (reload, modifyVars, clearFileCache) { - if ((reload || clearFileCache) && clearFileCache !== false) { - fileManager.clearFileCache(); - } - return new Promise(function (resolve, reject) { - var startTime, endTime, totalMilliseconds, remainingSheets; - startTime = endTime = new Date(); - - // Set counter for remaining unprocessed sheets - remainingSheets = less.sheets.length; - - if (remainingSheets === 0) { - - endTime = new Date(); - totalMilliseconds = endTime - startTime; - less.logger.info('Less has finished and no sheets were loaded.'); - resolve({ - startTime: startTime, - endTime: endTime, - totalMilliseconds: totalMilliseconds, - sheets: less.sheets.length - }); - - } else { - // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array - loadStyleSheets(function (e, css, _, sheet, webInfo) { - if (e) { - errors.add(e, e.href || sheet.href); - reject(e); - return; - } - if (webInfo.local) { - less.logger.info('Loading ' + sheet.href + ' from cache.'); - } else { - less.logger.info('Rendered ' + sheet.href + ' successfully.'); - } - browser.createCSS(window.document, css, sheet); - less.logger.info('CSS for ' + sheet.href + ' generated in ' + (new Date() - endTime) + 'ms'); - - // Count completed sheet - remainingSheets--; - - // Check if the last remaining sheet was processed and then call the promise - if (remainingSheets === 0) { - totalMilliseconds = new Date() - startTime; - less.logger.info('Less has finished. CSS generated in ' + totalMilliseconds + 'ms'); - resolve({ - startTime: startTime, - endTime: endTime, - totalMilliseconds: totalMilliseconds, - sheets: less.sheets.length - }); - } - endTime = new Date(); - }, reload, modifyVars); - } - - loadStyles(modifyVars); - }); - }; - - less.refreshStyles = loadStyles; - return less; -}; - -},{"../less":36,"./browser":3,"./cache":4,"./error-reporting":5,"./file-manager":6,"./image-size":7,"./log-listener":9,"./plugin-loader":10,"./utils":11}],9:[function(require,module,exports){ -module.exports = function(less, options) { - - var logLevel_debug = 4, - logLevel_info = 3, - logLevel_warn = 2, - logLevel_error = 1; - - // The amount of logging in the javascript console. - // 3 - Debug, information and errors - // 2 - Information and errors - // 1 - Errors - // 0 - None - // Defaults to 2 - options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error); - - if (!options.loggers) { - options.loggers = [{ - debug: function(msg) { - if (options.logLevel >= logLevel_debug) { - console.log(msg); - } - }, - info: function(msg) { - if (options.logLevel >= logLevel_info) { - console.log(msg); - } - }, - warn: function(msg) { - if (options.logLevel >= logLevel_warn) { - console.warn(msg); - } - }, - error: function(msg) { - if (options.logLevel >= logLevel_error) { - console.error(msg); - } - } - }]; - } - for (var i = 0; i < options.loggers.length; i++) { - less.logger.addListener(options.loggers[i]); - } -}; - -},{}],10:[function(require,module,exports){ -// TODO: Add tests for browser @plugin -/* global window */ - -var AbstractPluginLoader = require('../less/environment/abstract-plugin-loader.js'); - -/** - * Browser Plugin Loader - */ -var PluginLoader = function(less) { - this.less = less; - // Should we shim this.require for browser? Probably not? -}; - -PluginLoader.prototype = new AbstractPluginLoader(); - -PluginLoader.prototype.loadPlugin = function(filename, basePath, context, environment, fileManager) { - return new Promise(function(fulfill, reject) { - fileManager.loadFile(filename, basePath, context, environment) - .then(fulfill).catch(reject); - }); -}; - -module.exports = PluginLoader; - - -},{"../less/environment/abstract-plugin-loader.js":18}],11:[function(require,module,exports){ -module.exports = { - extractId: function(href) { - return href.replace(/^[a-z-]+:\/+?[^\/]+/, '') // Remove protocol & domain - .replace(/[\?\&]livereload=\w+/, '') // Remove LiveReload cachebuster - .replace(/^\//, '') // Remove root / - .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension - .replace(/[^\.\w-]+/g, '-') // Replace illegal characters - .replace(/\./g, ':'); // Replace dots with colons(for valid id) - }, - addDataAttr: function(options, tag) { - for (var opt in tag.dataset) { - if (tag.dataset.hasOwnProperty(opt)) { - if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') { - options[opt] = tag.dataset[opt]; - } else { - try { - options[opt] = JSON.parse(tag.dataset[opt]); - } - catch (_) {} - } - } - } - } -}; - -},{}],12:[function(require,module,exports){ -var contexts = {}; -module.exports = contexts; -var MATH = require('./math-constants'); - -var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { - if (!original) { return; } - - for (var i = 0; i < propertiesToCopy.length; i++) { - if (original.hasOwnProperty(propertiesToCopy[i])) { - destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; - } - } -}; - -/* - parse is used whilst parsing - */ -var parseCopyProperties = [ - // options - 'paths', // option - unmodified - paths to search for imports on - 'relativeUrls', // option - whether to adjust URL's to be relative - 'rootpath', // option - rootpath to append to URL's - 'strictImports', // option - - 'insecure', // option - whether to allow imports from insecure ssl hosts - 'dumpLineNumbers', // option - whether to dump line numbers - 'compress', // option - whether to compress - 'syncImport', // option - whether to import synchronously - 'chunkInput', // option - whether to chunk input. more performant but causes parse issues. - 'mime', // browser only - mime type for sheet import - 'useFileCache', // browser only - whether to use the per file session cache - // context - 'processImports', // option & context - whether to process imports. if false then imports will not be imported. - // Used by the import manager to stop multiple import visitors being created. - 'pluginManager' // Used as the plugin manager for the session -]; - -contexts.Parse = function(options) { - copyFromOriginal(options, this, parseCopyProperties); - - if (typeof this.paths === 'string') { this.paths = [this.paths]; } -}; - -var evalCopyProperties = [ - 'paths', // additional include paths - 'compress', // whether to compress - 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri) - 'math', // whether math has to be within parenthesis - 'strictUnits', // whether units need to evaluate correctly - 'sourceMap', // whether to output a source map - 'importMultiple', // whether we are currently importing multiple copies - 'urlArgs', // whether to add args into url tokens - 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false - 'pluginManager', // Used as the plugin manager for the session - 'importantScope' // used to bubble up !important statements -]; - -contexts.Eval = function(options, frames) { - copyFromOriginal(options, this, evalCopyProperties); - - if (typeof this.paths === 'string') { this.paths = [this.paths]; } - - this.frames = frames || []; - this.importantScope = this.importantScope || []; -}; - -contexts.Eval.prototype.enterCalc = function () { - if (!this.calcStack) { - this.calcStack = []; - } - this.calcStack.push(true); - this.inCalc = true; -}; - -contexts.Eval.prototype.exitCalc = function () { - this.calcStack.pop(); - if (!this.calcStack) { - this.inCalc = false; - } -}; - -contexts.Eval.prototype.inParenthesis = function () { - if (!this.parensStack) { - this.parensStack = []; - } - this.parensStack.push(true); -}; - -contexts.Eval.prototype.outOfParenthesis = function () { - this.parensStack.pop(); -}; - -contexts.Eval.prototype.inCalc = false; -contexts.Eval.prototype.mathOn = true; -contexts.Eval.prototype.isMathOn = function (op) { - if (!this.mathOn) { - return false; - } - if (op === '/' && this.math !== MATH.ALWAYS && (!this.parensStack || !this.parensStack.length)) { - return false; - } - if (this.math > MATH.PARENS_DIVISION) { - return this.parensStack && this.parensStack.length; - } - return true; -}; - -contexts.Eval.prototype.isPathRelative = function (path) { - return !/^(?:[a-z-]+:|\/|#)/i.test(path); -}; - -contexts.Eval.prototype.normalizePath = function( path ) { - var - segments = path.split('/').reverse(), - segment; - - path = []; - while (segments.length !== 0 ) { - segment = segments.pop(); - switch ( segment ) { - case '.': - break; - case '..': - if ((path.length === 0) || (path[path.length - 1] === '..')) { - path.push( segment ); - } else { - path.pop(); - } - break; - default: - path.push( segment ); - break; - } - } - - return path.join('/'); -}; - -// todo - do the same for the toCSS ? - -},{"./math-constants":39}],13:[function(require,module,exports){ -module.exports = { - 'aliceblue':'#f0f8ff', - 'antiquewhite':'#faebd7', - 'aqua':'#00ffff', - 'aquamarine':'#7fffd4', - 'azure':'#f0ffff', - 'beige':'#f5f5dc', - 'bisque':'#ffe4c4', - 'black':'#000000', - 'blanchedalmond':'#ffebcd', - 'blue':'#0000ff', - 'blueviolet':'#8a2be2', - 'brown':'#a52a2a', - 'burlywood':'#deb887', - 'cadetblue':'#5f9ea0', - 'chartreuse':'#7fff00', - 'chocolate':'#d2691e', - 'coral':'#ff7f50', - 'cornflowerblue':'#6495ed', - 'cornsilk':'#fff8dc', - 'crimson':'#dc143c', - 'cyan':'#00ffff', - 'darkblue':'#00008b', - 'darkcyan':'#008b8b', - 'darkgoldenrod':'#b8860b', - 'darkgray':'#a9a9a9', - 'darkgrey':'#a9a9a9', - 'darkgreen':'#006400', - 'darkkhaki':'#bdb76b', - 'darkmagenta':'#8b008b', - 'darkolivegreen':'#556b2f', - 'darkorange':'#ff8c00', - 'darkorchid':'#9932cc', - 'darkred':'#8b0000', - 'darksalmon':'#e9967a', - 'darkseagreen':'#8fbc8f', - 'darkslateblue':'#483d8b', - 'darkslategray':'#2f4f4f', - 'darkslategrey':'#2f4f4f', - 'darkturquoise':'#00ced1', - 'darkviolet':'#9400d3', - 'deeppink':'#ff1493', - 'deepskyblue':'#00bfff', - 'dimgray':'#696969', - 'dimgrey':'#696969', - 'dodgerblue':'#1e90ff', - 'firebrick':'#b22222', - 'floralwhite':'#fffaf0', - 'forestgreen':'#228b22', - 'fuchsia':'#ff00ff', - 'gainsboro':'#dcdcdc', - 'ghostwhite':'#f8f8ff', - 'gold':'#ffd700', - 'goldenrod':'#daa520', - 'gray':'#808080', - 'grey':'#808080', - 'green':'#008000', - 'greenyellow':'#adff2f', - 'honeydew':'#f0fff0', - 'hotpink':'#ff69b4', - 'indianred':'#cd5c5c', - 'indigo':'#4b0082', - 'ivory':'#fffff0', - 'khaki':'#f0e68c', - 'lavender':'#e6e6fa', - 'lavenderblush':'#fff0f5', - 'lawngreen':'#7cfc00', - 'lemonchiffon':'#fffacd', - 'lightblue':'#add8e6', - 'lightcoral':'#f08080', - 'lightcyan':'#e0ffff', - 'lightgoldenrodyellow':'#fafad2', - 'lightgray':'#d3d3d3', - 'lightgrey':'#d3d3d3', - 'lightgreen':'#90ee90', - 'lightpink':'#ffb6c1', - 'lightsalmon':'#ffa07a', - 'lightseagreen':'#20b2aa', - 'lightskyblue':'#87cefa', - 'lightslategray':'#778899', - 'lightslategrey':'#778899', - 'lightsteelblue':'#b0c4de', - 'lightyellow':'#ffffe0', - 'lime':'#00ff00', - 'limegreen':'#32cd32', - 'linen':'#faf0e6', - 'magenta':'#ff00ff', - 'maroon':'#800000', - 'mediumaquamarine':'#66cdaa', - 'mediumblue':'#0000cd', - 'mediumorchid':'#ba55d3', - 'mediumpurple':'#9370d8', - 'mediumseagreen':'#3cb371', - 'mediumslateblue':'#7b68ee', - 'mediumspringgreen':'#00fa9a', - 'mediumturquoise':'#48d1cc', - 'mediumvioletred':'#c71585', - 'midnightblue':'#191970', - 'mintcream':'#f5fffa', - 'mistyrose':'#ffe4e1', - 'moccasin':'#ffe4b5', - 'navajowhite':'#ffdead', - 'navy':'#000080', - 'oldlace':'#fdf5e6', - 'olive':'#808000', - 'olivedrab':'#6b8e23', - 'orange':'#ffa500', - 'orangered':'#ff4500', - 'orchid':'#da70d6', - 'palegoldenrod':'#eee8aa', - 'palegreen':'#98fb98', - 'paleturquoise':'#afeeee', - 'palevioletred':'#d87093', - 'papayawhip':'#ffefd5', - 'peachpuff':'#ffdab9', - 'peru':'#cd853f', - 'pink':'#ffc0cb', - 'plum':'#dda0dd', - 'powderblue':'#b0e0e6', - 'purple':'#800080', - 'rebeccapurple':'#663399', - 'red':'#ff0000', - 'rosybrown':'#bc8f8f', - 'royalblue':'#4169e1', - 'saddlebrown':'#8b4513', - 'salmon':'#fa8072', - 'sandybrown':'#f4a460', - 'seagreen':'#2e8b57', - 'seashell':'#fff5ee', - 'sienna':'#a0522d', - 'silver':'#c0c0c0', - 'skyblue':'#87ceeb', - 'slateblue':'#6a5acd', - 'slategray':'#708090', - 'slategrey':'#708090', - 'snow':'#fffafa', - 'springgreen':'#00ff7f', - 'steelblue':'#4682b4', - 'tan':'#d2b48c', - 'teal':'#008080', - 'thistle':'#d8bfd8', - 'tomato':'#ff6347', - 'turquoise':'#40e0d0', - 'violet':'#ee82ee', - 'wheat':'#f5deb3', - 'white':'#ffffff', - 'whitesmoke':'#f5f5f5', - 'yellow':'#ffff00', - 'yellowgreen':'#9acd32' -}; -},{}],14:[function(require,module,exports){ -module.exports = { - colors: require('./colors'), - unitConversions: require('./unit-conversions') -}; - -},{"./colors":13,"./unit-conversions":15}],15:[function(require,module,exports){ -module.exports = { - length: { - 'm': 1, - 'cm': 0.01, - 'mm': 0.001, - 'in': 0.0254, - 'px': 0.0254 / 96, - 'pt': 0.0254 / 72, - 'pc': 0.0254 / 72 * 12 - }, - duration: { - 's': 1, - 'ms': 0.001 - }, - angle: { - 'rad': 1 / (2 * Math.PI), - 'deg': 1 / 360, - 'grad': 1 / 400, - 'turn': 1 - } -}; -},{}],16:[function(require,module,exports){ -// Export a new default each time -module.exports = function() { - return { - /* Inline Javascript - @plugin still allowed */ - javascriptEnabled: false, - - /* Outputs a makefile import dependency list to stdout. */ - depends: false, - - /* (DEPRECATED) Compress using less built-in compression. - * This does an okay job but does not utilise all the tricks of - * dedicated css compression. */ - compress: false, - - /* Runs the less parser and just reports errors without any output. */ - lint: false, - - /* Sets available include paths. - * If the file in an @import rule does not exist at that exact location, - * less will look for it at the location(s) passed to this option. - * You might use this for instance to specify a path to a library which - * you want to be referenced simply and relatively in the less files. */ - paths: [], - - /* color output in the terminal */ - color: true, - - /* The strictImports controls whether the compiler will allow an @import inside of either - * @media blocks or (a later addition) other selector blocks. - * See: https://github.com/less/less.js/issues/656 */ - strictImports: false, - - /* Allow Imports from Insecure HTTPS Hosts */ - insecure: false, - - /* Allows you to add a path to every generated import and url in your css. - * This does not affect less import statements that are processed, just ones - * that are left in the output css. */ - rootpath: '', - - /* By default URLs are kept as-is, so if you import a file in a sub-directory - * that references an image, exactly the same URL will be output in the css. - * This option allows you to re-write URL's in imported files so that the - * URL is always relative to the base imported file */ - relativeUrls: false, - - /* Compatibility with IE8. Used for limiting data-uri length */ - ieCompat: false, // true until 3.0 - - /* How to process math - * 0 always - eagerly try to solve all operations - * 1 parens-division - require parens for division "/" - * 2 parens | strict - require parens for all operations - * 3 strict-legacy - legacy strict behavior (super-strict) - */ - math: 0, - - /* Without this option, less attempts to guess at the output unit when it does maths. */ - strictUnits: false, - - /* Effectively the declaration is put at the top of your base Less file, - * meaning it can be used but it also can be overridden if this variable - * is defined in the file. */ - globalVars: null, - - /* As opposed to the global variable option, this puts the declaration at the - * end of your base file, meaning it will override anything defined in your Less file. */ - modifyVars: null, - - /* This option allows you to specify a argument to go on to every URL. */ - urlArgs: '' - } -} -},{}],17:[function(require,module,exports){ -var abstractFileManager = function() { -}; - -abstractFileManager.prototype.getPath = function (filename) { - var j = filename.lastIndexOf('?'); - if (j > 0) { - filename = filename.slice(0, j); - } - j = filename.lastIndexOf('/'); - if (j < 0) { - j = filename.lastIndexOf('\\'); - } - if (j < 0) { - return ''; - } - return filename.slice(0, j + 1); -}; - -abstractFileManager.prototype.tryAppendExtension = function(path, ext) { - return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext; -}; - -abstractFileManager.prototype.tryAppendLessExtension = function(path) { - return this.tryAppendExtension(path, '.less'); -}; - -abstractFileManager.prototype.supportsSync = function() { - return false; -}; - -abstractFileManager.prototype.alwaysMakePathsAbsolute = function() { - return false; -}; - -abstractFileManager.prototype.isPathAbsolute = function(filename) { - return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename); -}; -// TODO: pull out / replace? -abstractFileManager.prototype.join = function(basePath, laterPath) { - if (!basePath) { - return laterPath; - } - return basePath + laterPath; -}; - -abstractFileManager.prototype.pathDiff = function pathDiff(url, baseUrl) { - // diff between two paths to create a relative path - - var urlParts = this.extractUrlParts(url), - baseUrlParts = this.extractUrlParts(baseUrl), - i, max, urlDirectories, baseUrlDirectories, diff = ''; - if (urlParts.hostPart !== baseUrlParts.hostPart) { - return ''; - } - max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); - for (i = 0; i < max; i++) { - if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; } - } - baseUrlDirectories = baseUrlParts.directories.slice(i); - urlDirectories = urlParts.directories.slice(i); - for (i = 0; i < baseUrlDirectories.length - 1; i++) { - diff += '../'; - } - for (i = 0; i < urlDirectories.length - 1; i++) { - diff += urlDirectories[i] + '/'; - } - return diff; -}; -// helper function, not part of API -abstractFileManager.prototype.extractUrlParts = function extractUrlParts(url, baseUrl) { - // urlParts[1] = protocol://hostname/ OR / - // urlParts[2] = / if path relative to host base - // urlParts[3] = directories - // urlParts[4] = filename - // urlParts[5] = parameters - - var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i, - urlParts = url.match(urlPartsRegex), - returner = {}, rawDirectories = [], directories = [], i, baseUrlParts; - - if (!urlParts) { - throw new Error('Could not parse sheet href - \'' + url + '\''); - } - - // Stylesheets in IE don't always return the full path - if (baseUrl && (!urlParts[1] || urlParts[2])) { - baseUrlParts = baseUrl.match(urlPartsRegex); - if (!baseUrlParts) { - throw new Error('Could not parse page url - \'' + baseUrl + '\''); - } - urlParts[1] = urlParts[1] || baseUrlParts[1] || ''; - if (!urlParts[2]) { - urlParts[3] = baseUrlParts[3] + urlParts[3]; - } - } - - if (urlParts[3]) { - rawDirectories = urlParts[3].replace(/\\/g, '/').split('/'); - - // collapse '..' and skip '.' - for (i = 0; i < rawDirectories.length; i++) { - - if (rawDirectories[i] === '..') { - directories.pop(); - } - else if (rawDirectories[i] !== '.') { - directories.push(rawDirectories[i]); - } - - } - } - - returner.hostPart = urlParts[1]; - returner.directories = directories; - returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/'); - returner.path = (urlParts[1] || '') + directories.join('/'); - returner.filename = urlParts[4]; - returner.fileUrl = returner.path + (urlParts[4] || ''); - returner.url = returner.fileUrl + (urlParts[5] || ''); - return returner; -}; - -module.exports = abstractFileManager; - -},{}],18:[function(require,module,exports){ -var functionRegistry = require('../functions/function-registry'), - LessError = require('../less-error'); - -var AbstractPluginLoader = function() { - // Implemented by Node.js plugin loader - this.require = function() { - return null; - } -}; - -AbstractPluginLoader.prototype.evalPlugin = function(contents, context, imports, pluginOptions, fileInfo) { - - var loader, - registry, - pluginObj, - localModule, - pluginManager, - filename, - result; - - pluginManager = context.pluginManager; - - if (fileInfo) { - if (typeof fileInfo === 'string') { - filename = fileInfo; - } - else { - filename = fileInfo.filename; - } - } - var shortname = (new this.less.FileManager()).extractUrlParts(filename).filename; - - if (filename) { - pluginObj = pluginManager.get(filename); - - if (pluginObj) { - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - try { - if (pluginObj.use) { - pluginObj.use.call(this.context, pluginObj); - } - } - catch (e) { - e.message = e.message || 'Error during @plugin call'; - return new LessError(e, imports, filename); - } - return pluginObj; - } - } - localModule = { - exports: {}, - pluginManager: pluginManager, - fileInfo: fileInfo - }; - registry = functionRegistry.create(); - - var registerPlugin = function(obj) { - pluginObj = obj; - }; - - try { - loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents); - loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo); - } - catch (e) { - return new LessError(e, imports, filename); - } - - if (!pluginObj) { - pluginObj = localModule.exports; - } - pluginObj = this.validatePlugin(pluginObj, filename, shortname); - - if (pluginObj instanceof LessError) { - return pluginObj; - } - - if (pluginObj) { - pluginObj.imports = imports; - pluginObj.filename = filename; - - // For < 3.x (or unspecified minVersion) - setOptions() before install() - if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) { - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - - if (result) { - return result; - } - } - - // Run on first load - pluginManager.addPlugin(pluginObj, fileInfo.filename, registry); - pluginObj.functions = registry.getLocalFunctions(); - - // Need to call setOptions again because the pluginObj might have functions - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - - // Run every @plugin call - try { - if (pluginObj.use) { - pluginObj.use.call(this.context, pluginObj); - } - } - catch (e) { - e.message = e.message || 'Error during @plugin call'; - return new LessError(e, imports, filename); - } - - } - else { - return new LessError({ message: 'Not a valid plugin' }, imports, filename); - } - - return pluginObj; - -}; - -AbstractPluginLoader.prototype.trySetOptions = function(plugin, filename, name, options) { - if (options && !plugin.setOptions) { - return new LessError({ - message: 'Options have been provided but the plugin ' + - name + ' does not support any options.' - }); - } - try { - plugin.setOptions && plugin.setOptions(options); - } - catch (e) { - return new LessError(e); - } -}; - -AbstractPluginLoader.prototype.validatePlugin = function(plugin, filename, name) { - if (plugin) { - // support plugins being a function - // so that the plugin can be more usable programmatically - if (typeof plugin === 'function') { - plugin = new plugin(); - } - - if (plugin.minVersion) { - if (this.compareVersion(plugin.minVersion, this.less.version) < 0) { - return new LessError({ - message: 'Plugin ' + name + ' requires version ' + - this.versionToString(plugin.minVersion) - }); - } - } - return plugin; - } - return null; -}; - -AbstractPluginLoader.prototype.compareVersion = function(aVersion, bVersion) { - if (typeof aVersion === 'string') { - aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/); - aVersion.shift(); - } - for (var i = 0; i < aVersion.length; i++) { - if (aVersion[i] !== bVersion[i]) { - return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1; - } - } - return 0; -}; -AbstractPluginLoader.prototype.versionToString = function(version) { - var versionString = ''; - for (var i = 0; i < version.length; i++) { - versionString += (versionString ? '.' : '') + version[i]; - } - return versionString; -}; -AbstractPluginLoader.prototype.printUsage = function(plugins) { - for (var i = 0; i < plugins.length; i++) { - var plugin = plugins[i]; - if (plugin.printUsage) { - plugin.printUsage(); - } - } -}; - -module.exports = AbstractPluginLoader; - - -},{"../functions/function-registry":26,"../less-error":37}],19:[function(require,module,exports){ -/** - * @todo Document why this abstraction exists, and the relationship between - * environment, file managers, and plugin manager - */ - -var logger = require('../logger'); -var environment = function(externalEnvironment, fileManagers) { - this.fileManagers = fileManagers || []; - externalEnvironment = externalEnvironment || {}; - - var optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'], - requiredFunctions = [], - functions = requiredFunctions.concat(optionalFunctions); - - for (var i = 0; i < functions.length; i++) { - var propName = functions[i], - environmentFunc = externalEnvironment[propName]; - if (environmentFunc) { - this[propName] = environmentFunc.bind(externalEnvironment); - } else if (i < requiredFunctions.length) { - this.warn('missing required function in environment - ' + propName); - } - } -}; - -environment.prototype.getFileManager = function (filename, currentDirectory, options, environment, isSync) { - - if (!filename) { - logger.warn('getFileManager called with no filename.. Please report this issue. continuing.'); - } - if (currentDirectory == null) { - logger.warn('getFileManager called with null directory.. Please report this issue. continuing.'); - } - - var fileManagers = this.fileManagers; - if (options.pluginManager) { - fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers()); - } - for (var i = fileManagers.length - 1; i >= 0 ; i--) { - var fileManager = fileManagers[i]; - if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) { - return fileManager; - } - } - return null; -}; - -environment.prototype.addFileManager = function (fileManager) { - this.fileManagers.push(fileManager); -}; - -environment.prototype.clearFileManagers = function () { - this.fileManagers = []; -}; - -module.exports = environment; - -},{"../logger":38}],20:[function(require,module,exports){ - -var functionRegistry = require('./function-registry'), - Anonymous = require('../tree/anonymous'), - Keyword = require('../tree/keyword'); - -functionRegistry.addMultiple({ - boolean: function(condition) { - return condition ? Keyword.True : Keyword.False; - }, - - 'if': function(condition, trueValue, falseValue) { - return condition ? trueValue - : (falseValue || new Anonymous); - } -}); - -},{"../tree/anonymous":50,"../tree/keyword":70,"./function-registry":26}],21:[function(require,module,exports){ -var Color = require('../tree/color'), - functionRegistry = require('./function-registry'); - -// Color Blending -// ref: http://www.w3.org/TR/compositing-1 - -function colorBlend(mode, color1, color2) { - var ab = color1.alpha, cb, // backdrop - as = color2.alpha, cs, // source - ar, cr, r = []; // result - - ar = as + ab * (1 - as); - for (var i = 0; i < 3; i++) { - cb = color1.rgb[i] / 255; - cs = color2.rgb[i] / 255; - cr = mode(cb, cs); - if (ar) { - cr = (as * cs + ab * (cb - - as * (cb + cs - cr))) / ar; - } - r[i] = cr * 255; - } - - return new Color(r, ar); -} - -var colorBlendModeFunctions = { - multiply: function(cb, cs) { - return cb * cs; - }, - screen: function(cb, cs) { - return cb + cs - cb * cs; - }, - overlay: function(cb, cs) { - cb *= 2; - return (cb <= 1) ? - colorBlendModeFunctions.multiply(cb, cs) : - colorBlendModeFunctions.screen(cb - 1, cs); - }, - softlight: function(cb, cs) { - var d = 1, e = cb; - if (cs > 0.5) { - e = 1; - d = (cb > 0.25) ? Math.sqrt(cb) - : ((16 * cb - 12) * cb + 4) * cb; - } - return cb - (1 - 2 * cs) * e * (d - cb); - }, - hardlight: function(cb, cs) { - return colorBlendModeFunctions.overlay(cs, cb); - }, - difference: function(cb, cs) { - return Math.abs(cb - cs); - }, - exclusion: function(cb, cs) { - return cb + cs - 2 * cb * cs; - }, - - // non-w3c functions: - average: function(cb, cs) { - return (cb + cs) / 2; - }, - negation: function(cb, cs) { - return 1 - Math.abs(cb + cs - 1); - } -}; - -for (var f in colorBlendModeFunctions) { - if (colorBlendModeFunctions.hasOwnProperty(f)) { - colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]); - } -} - -functionRegistry.addMultiple(colorBlend); - -},{"../tree/color":55,"./function-registry":26}],22:[function(require,module,exports){ -var Dimension = require('../tree/dimension'), - Color = require('../tree/color'), - Quoted = require('../tree/quoted'), - Anonymous = require('../tree/anonymous'), - functionRegistry = require('./function-registry'), - colorFunctions; - -function clamp(val) { - return Math.min(1, Math.max(0, val)); -} -function hsla(color) { - return colorFunctions.hsla(color.h, color.s, color.l, color.a); -} -function number(n) { - if (n instanceof Dimension) { - return parseFloat(n.unit.is('%') ? n.value / 100 : n.value); - } else if (typeof n === 'number') { - return n; - } else { - throw { - type: 'Argument', - message: 'color functions take numbers as parameters' - }; - } -} -function scaled(n, size) { - if (n instanceof Dimension && n.unit.is('%')) { - return parseFloat(n.value * size / 100); - } else { - return number(n); - } -} -colorFunctions = { - rgb: function (r, g, b) { - return colorFunctions.rgba(r, g, b, 1.0); - }, - rgba: function (r, g, b, a) { - var rgb = [r, g, b].map(function (c) { return scaled(c, 255); }); - a = number(a); - return new Color(rgb, a); - }, - hsl: function (h, s, l) { - return colorFunctions.hsla(h, s, l, 1.0); - }, - hsla: function (h, s, l, a) { - - var m1, m2; - - function hue(h) { - h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); - if (h * 6 < 1) { - return m1 + (m2 - m1) * h * 6; - } - else if (h * 2 < 1) { - return m2; - } - else if (h * 3 < 2) { - return m1 + (m2 - m1) * (2 / 3 - h) * 6; - } - else { - return m1; - } - } - - h = (number(h) % 360) / 360; - s = clamp(number(s)); l = clamp(number(l)); a = clamp(number(a)); - - m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - m1 = l * 2 - m2; - - return colorFunctions.rgba(hue(h + 1 / 3) * 255, - hue(h) * 255, - hue(h - 1 / 3) * 255, - a); - }, - - hsv: function(h, s, v) { - return colorFunctions.hsva(h, s, v, 1.0); - }, - - hsva: function(h, s, v, a) { - h = ((number(h) % 360) / 360) * 360; - s = number(s); v = number(v); a = number(a); - - var i, f; - i = Math.floor((h / 60) % 6); - f = (h / 60) - i; - - var vs = [v, - v * (1 - s), - v * (1 - f * s), - v * (1 - (1 - f) * s)]; - var perm = [[0, 3, 1], - [2, 0, 1], - [1, 0, 3], - [1, 2, 0], - [3, 1, 0], - [0, 1, 2]]; - - return colorFunctions.rgba(vs[perm[i][0]] * 255, - vs[perm[i][1]] * 255, - vs[perm[i][2]] * 255, - a); - }, - - hue: function (color) { - return new Dimension(color.toHSL().h); - }, - saturation: function (color) { - return new Dimension(color.toHSL().s * 100, '%'); - }, - lightness: function (color) { - return new Dimension(color.toHSL().l * 100, '%'); - }, - hsvhue: function(color) { - return new Dimension(color.toHSV().h); - }, - hsvsaturation: function (color) { - return new Dimension(color.toHSV().s * 100, '%'); - }, - hsvvalue: function (color) { - return new Dimension(color.toHSV().v * 100, '%'); - }, - red: function (color) { - return new Dimension(color.rgb[0]); - }, - green: function (color) { - return new Dimension(color.rgb[1]); - }, - blue: function (color) { - return new Dimension(color.rgb[2]); - }, - alpha: function (color) { - return new Dimension(color.toHSL().a); - }, - luma: function (color) { - return new Dimension(color.luma() * color.alpha * 100, '%'); - }, - luminance: function (color) { - var luminance = - (0.2126 * color.rgb[0] / 255) + - (0.7152 * color.rgb[1] / 255) + - (0.0722 * color.rgb[2] / 255); - - return new Dimension(luminance * color.alpha * 100, '%'); - }, - saturate: function (color, amount, method) { - // filter: saturate(3.2); - // should be kept as is, so check for color - if (!color.rgb) { - return null; - } - var hsl = color.toHSL(); - - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.s += hsl.s * amount.value / 100; - } - else { - hsl.s += amount.value / 100; - } - hsl.s = clamp(hsl.s); - return hsla(hsl); - }, - desaturate: function (color, amount, method) { - var hsl = color.toHSL(); - - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.s -= hsl.s * amount.value / 100; - } - else { - hsl.s -= amount.value / 100; - } - hsl.s = clamp(hsl.s); - return hsla(hsl); - }, - lighten: function (color, amount, method) { - var hsl = color.toHSL(); - - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.l += hsl.l * amount.value / 100; - } - else { - hsl.l += amount.value / 100; - } - hsl.l = clamp(hsl.l); - return hsla(hsl); - }, - darken: function (color, amount, method) { - var hsl = color.toHSL(); - - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.l -= hsl.l * amount.value / 100; - } - else { - hsl.l -= amount.value / 100; - } - hsl.l = clamp(hsl.l); - return hsla(hsl); - }, - fadein: function (color, amount, method) { - var hsl = color.toHSL(); - - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.a += hsl.a * amount.value / 100; - } - else { - hsl.a += amount.value / 100; - } - hsl.a = clamp(hsl.a); - return hsla(hsl); - }, - fadeout: function (color, amount, method) { - var hsl = color.toHSL(); - - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.a -= hsl.a * amount.value / 100; - } - else { - hsl.a -= amount.value / 100; - } - hsl.a = clamp(hsl.a); - return hsla(hsl); - }, - fade: function (color, amount) { - var hsl = color.toHSL(); - - hsl.a = amount.value / 100; - hsl.a = clamp(hsl.a); - return hsla(hsl); - }, - spin: function (color, amount) { - var hsl = color.toHSL(); - var hue = (hsl.h + amount.value) % 360; - - hsl.h = hue < 0 ? 360 + hue : hue; - - return hsla(hsl); - }, - // - // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein - // http://sass-lang.com - // - mix: function (color1, color2, weight) { - if (!color1.toHSL || !color2.toHSL) { - console.log(color2.type); - console.dir(color2); - } - if (!weight) { - weight = new Dimension(50); - } - var p = weight.value / 100.0; - var w = p * 2 - 1; - var a = color1.toHSL().a - color2.toHSL().a; - - var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - - var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, - color1.rgb[1] * w1 + color2.rgb[1] * w2, - color1.rgb[2] * w1 + color2.rgb[2] * w2]; - - var alpha = color1.alpha * p + color2.alpha * (1 - p); - - return new Color(rgb, alpha); - }, - greyscale: function (color) { - return colorFunctions.desaturate(color, new Dimension(100)); - }, - contrast: function (color, dark, light, threshold) { - // filter: contrast(3.2); - // should be kept as is, so check for color - if (!color.rgb) { - return null; - } - if (typeof light === 'undefined') { - light = colorFunctions.rgba(255, 255, 255, 1.0); - } - if (typeof dark === 'undefined') { - dark = colorFunctions.rgba(0, 0, 0, 1.0); - } - // Figure out which is actually light and dark: - if (dark.luma() > light.luma()) { - var t = light; - light = dark; - dark = t; - } - if (typeof threshold === 'undefined') { - threshold = 0.43; - } else { - threshold = number(threshold); - } - if (color.luma() < threshold) { - return light; - } else { - return dark; - } - }, - // Changes made in 2.7.0 - Reverted in 3.0.0 - // contrast: function (color, color1, color2, threshold) { - // // Return which of `color1` and `color2` has the greatest contrast with `color` - // // according to the standard WCAG contrast ratio calculation. - // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - // // The threshold param is no longer used, in line with SASS. - // // filter: contrast(3.2); - // // should be kept as is, so check for color - // if (!color.rgb) { - // return null; - // } - // if (typeof color1 === 'undefined') { - // color1 = colorFunctions.rgba(0, 0, 0, 1.0); - // } - // if (typeof color2 === 'undefined') { - // color2 = colorFunctions.rgba(255, 255, 255, 1.0); - // } - // var contrast1, contrast2; - // var luma = color.luma(); - // var luma1 = color1.luma(); - // var luma2 = color2.luma(); - // // Calculate contrast ratios for each color - // if (luma > luma1) { - // contrast1 = (luma + 0.05) / (luma1 + 0.05); - // } else { - // contrast1 = (luma1 + 0.05) / (luma + 0.05); - // } - // if (luma > luma2) { - // contrast2 = (luma + 0.05) / (luma2 + 0.05); - // } else { - // contrast2 = (luma2 + 0.05) / (luma + 0.05); - // } - // if (contrast1 > contrast2) { - // return color1; - // } else { - // return color2; - // } - // }, - argb: function (color) { - return new Anonymous(color.toARGB()); - }, - color: function(c) { - if ((c instanceof Quoted) && - (/^#([a-f0-9]{6}|[a-f0-9]{3})$/i.test(c.value))) { - return new Color(c.value.slice(1)); - } - if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) { - c.value = undefined; - return c; - } - throw { - type: 'Argument', - message: 'argument must be a color keyword or 3/6 digit hex e.g. #FFF' - }; - }, - tint: function(color, amount) { - return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount); - }, - shade: function(color, amount) { - return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount); - } -}; -functionRegistry.addMultiple(colorFunctions); - -},{"../tree/anonymous":50,"../tree/color":55,"../tree/dimension":62,"../tree/quoted":80,"./function-registry":26}],23:[function(require,module,exports){ -module.exports = function(environment) { - var Quoted = require('../tree/quoted'), - URL = require('../tree/url'), - utils = require('../utils'), - functionRegistry = require('./function-registry'), - fallback = function(functionThis, node) { - return new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); - }, - logger = require('../logger'); - - functionRegistry.add('data-uri', function(mimetypeNode, filePathNode) { - - if (!filePathNode) { - filePathNode = mimetypeNode; - mimetypeNode = null; - } - - var mimetype = mimetypeNode && mimetypeNode.value; - var filePath = filePathNode.value; - var currentFileInfo = this.currentFileInfo; - var currentDirectory = currentFileInfo.relativeUrls ? - currentFileInfo.currentDirectory : currentFileInfo.entryPath; - - var fragmentStart = filePath.indexOf('#'); - var fragment = ''; - if (fragmentStart !== -1) { - fragment = filePath.slice(fragmentStart); - filePath = filePath.slice(0, fragmentStart); - } - var context = utils.clone(this.context); - context.rawBuffer = true; - - var fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true); - - if (!fileManager) { - return fallback(this, filePathNode); - } - - var useBase64 = false; - - // detect the mimetype if not given - if (!mimetypeNode) { - - mimetype = environment.mimeLookup(filePath); - - if (mimetype === 'image/svg+xml') { - useBase64 = false; - } else { - // use base 64 unless it's an ASCII or UTF-8 format - var charset = environment.charsetLookup(mimetype); - useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; - } - if (useBase64) { mimetype += ';base64'; } - } - else { - useBase64 = /;base64$/.test(mimetype); - } - - var fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment); - if (!fileSync.contents) { - logger.warn('Skipped data-uri embedding of ' + filePath + ' because file not found'); - return fallback(this, filePathNode || mimetypeNode); - } - var buf = fileSync.contents; - if (useBase64 && !environment.encodeBase64) { - return fallback(this, filePathNode); - } - - buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf); - - var uri = 'data:' + mimetype + ',' + buf + fragment; - - // IE8 cannot handle a data-uri larger than 32,768 characters. If this is exceeded - // and the --ieCompat flag is enabled, return a normal url() instead. - var DATA_URI_MAX = 32768; - if (uri.length >= DATA_URI_MAX) { - - if (this.context.ieCompat !== false) { - logger.warn('Skipped data-uri embedding of ' + filePath + ' because its size (' + uri.length + - ' characters) exceeds IE8-safe ' + DATA_URI_MAX + ' characters!'); - - return fallback(this, filePathNode || mimetypeNode); - } - } - - return new URL(new Quoted('"' + uri + '"', uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); - }); -}; - -},{"../logger":38,"../tree/quoted":80,"../tree/url":85,"../utils":89,"./function-registry":26}],24:[function(require,module,exports){ -var Keyword = require('../tree/keyword'), - functionRegistry = require('./function-registry'); - -var defaultFunc = { - eval: function () { - var v = this.value_, e = this.error_; - if (e) { - throw e; - } - if (v != null) { - return v ? Keyword.True : Keyword.False; - } - }, - value: function (v) { - this.value_ = v; - }, - error: function (e) { - this.error_ = e; - }, - reset: function () { - this.value_ = this.error_ = null; - } -}; - -functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc)); - -module.exports = defaultFunc; - -},{"../tree/keyword":70,"./function-registry":26}],25:[function(require,module,exports){ -var Expression = require('../tree/expression'); - -var functionCaller = function(name, context, index, currentFileInfo) { - this.name = name.toLowerCase(); - this.index = index; - this.context = context; - this.currentFileInfo = currentFileInfo; - - this.func = context.frames[0].functionRegistry.get(this.name); -}; -functionCaller.prototype.isValid = function() { - return Boolean(this.func); -}; - -functionCaller.prototype.call = function(args) { - // This code is terrible and should be replaced as per this issue... - // https://github.com/less/less.js/issues/2477 - if (Array.isArray(args)) { - args = args.filter(function (item) { - if (item.type === 'Comment') { - return false; - } - return true; - }) - .map(function(item) { - if (item.type === 'Expression') { - var subNodes = item.value.filter(function (item) { - if (item.type === 'Comment') { - return false; - } - return true; - }); - if (subNodes.length === 1) { - return subNodes[0]; - } else { - return new Expression(subNodes); - } - } - return item; - }); - } - - return this.func.apply(this, args); -}; - -module.exports = functionCaller; - -},{"../tree/expression":64}],26:[function(require,module,exports){ -function makeRegistry( base ) { - return { - _data: {}, - add: function(name, func) { - // precautionary case conversion, as later querying of - // the registry by function-caller uses lower case as well. - name = name.toLowerCase(); - - if (this._data.hasOwnProperty(name)) { - // TODO warn - } - this._data[name] = func; - }, - addMultiple: function(functions) { - Object.keys(functions).forEach( - function(name) { - this.add(name, functions[name]); - }.bind(this)); - }, - get: function(name) { - return this._data[name] || ( base && base.get( name )); - }, - getLocalFunctions: function() { - return this._data; - }, - inherit: function() { - return makeRegistry( this ); - }, - create: function(base) { - return makeRegistry(base); - } - }; -} - -module.exports = makeRegistry( null ); -},{}],27:[function(require,module,exports){ -module.exports = function(environment) { - var functions = { - functionRegistry: require('./function-registry'), - functionCaller: require('./function-caller') - }; - - // register functions - require('./boolean'); - require('./default'); - require('./color'); - require('./color-blending'); - require('./data-uri')(environment); - require('./list'); - require('./math'); - require('./number'); - require('./string'); - require('./svg')(environment); - require('./types'); - - return functions; -}; - -},{"./boolean":20,"./color":22,"./color-blending":21,"./data-uri":23,"./default":24,"./function-caller":25,"./function-registry":26,"./list":28,"./math":30,"./number":31,"./string":32,"./svg":33,"./types":34}],28:[function(require,module,exports){ -var Dimension = require('../tree/dimension'), - Declaration = require('../tree/declaration'), - Ruleset = require('../tree/ruleset'), - Selector = require('../tree/selector'), - Element = require('../tree/element'), - functionRegistry = require('./function-registry'); - -var getItemsFromNode = function(node) { - // handle non-array values as an array of length 1 - // return 'undefined' if index is invalid - var items = Array.isArray(node.value) ? - node.value : Array(node); - - return items; -}; - -functionRegistry.addMultiple({ - _SELF: function(n) { - return n; - }, - extract: function(values, index) { - index = index.value - 1; // (1-based index) - - return getItemsFromNode(values)[index]; - }, - length: function(values) { - return new Dimension(getItemsFromNode(values).length); - }, - each: function(list, rs) { - var i = 0, rules = [], newRules, iterator; - - if (list.value) { - if (Array.isArray(list.value)) { - iterator = list.value; - } else { - iterator = [list.value]; - } - } else if (list.ruleset) { - iterator = list.ruleset.rules; - } else if (Array.isArray(list)) { - iterator = list; - } else { - iterator = [list]; - } - - var valueName = '@value', - keyName = '@key', - indexName = '@index'; - - if (rs.params) { - valueName = rs.params[0] && rs.params[0].name; - keyName = rs.params[1] && rs.params[1].name; - indexName = rs.params[2] && rs.params[2].name; - rs = rs.rules; - } else { - rs = rs.ruleset; - } - - iterator.forEach(function(item) { - i = i + 1; - var key, value; - if (item instanceof Declaration) { - key = typeof item.name === 'string' ? item.name : item.name[0].value; - value = item.value; - } else { - key = new Dimension(i); - value = item; - } - - newRules = rs.rules.slice(0); - if (valueName) { - newRules.push(new Declaration(valueName, - value, - false, false, this.index, this.currentFileInfo)); - } - if (indexName) { - newRules.push(new Declaration(indexName, - new Dimension(i), - false, false, this.index, this.currentFileInfo)); - } - if (keyName) { - newRules.push(new Declaration(keyName, - key, - false, false, this.index, this.currentFileInfo)); - } - - rules.push(new Ruleset([ new(Selector)([ new Element("", '&') ]) ], - newRules, - rs.strictImports, - rs.visibilityInfo() - )); - }); - - return new Ruleset([ new(Selector)([ new Element("", '&') ]) ], - rules, - rs.strictImports, - rs.visibilityInfo() - ).eval(this.context); - - } -}); - -},{"../tree/declaration":60,"../tree/dimension":62,"../tree/element":63,"../tree/ruleset":81,"../tree/selector":82,"./function-registry":26}],29:[function(require,module,exports){ -var Dimension = require('../tree/dimension'); - -var MathHelper = function() { -}; -MathHelper._math = function (fn, unit, n) { - if (!(n instanceof Dimension)) { - throw { type: 'Argument', message: 'argument must be a number' }; - } - if (unit == null) { - unit = n.unit; - } else { - n = n.unify(); - } - return new Dimension(fn(parseFloat(n.value)), unit); -}; -module.exports = MathHelper; -},{"../tree/dimension":62}],30:[function(require,module,exports){ -var functionRegistry = require('./function-registry'), - mathHelper = require('./math-helper.js'); - -var mathFunctions = { - // name, unit - ceil: null, - floor: null, - sqrt: null, - abs: null, - tan: '', - sin: '', - cos: '', - atan: 'rad', - asin: 'rad', - acos: 'rad' -}; - -for (var f in mathFunctions) { - if (mathFunctions.hasOwnProperty(f)) { - mathFunctions[f] = mathHelper._math.bind(null, Math[f], mathFunctions[f]); - } -} - -mathFunctions.round = function (n, f) { - var fraction = typeof f === 'undefined' ? 0 : f.value; - return mathHelper._math(function(num) { return num.toFixed(fraction); }, null, n); -}; - -functionRegistry.addMultiple(mathFunctions); - -},{"./function-registry":26,"./math-helper.js":29}],31:[function(require,module,exports){ -var Dimension = require('../tree/dimension'), - Anonymous = require('../tree/anonymous'), - functionRegistry = require('./function-registry'), - mathHelper = require('./math-helper.js'); - -var minMax = function (isMin, args) { - args = Array.prototype.slice.call(args); - switch (args.length) { - case 0: throw { type: 'Argument', message: 'one or more arguments required' }; - } - var i, j, current, currentUnified, referenceUnified, unit, unitStatic, unitClone, - order = [], // elems only contains original argument values. - values = {}; // key is the unit.toString() for unified Dimension values, - // value is the index into the order array. - for (i = 0; i < args.length; i++) { - current = args[i]; - if (!(current instanceof Dimension)) { - if (Array.isArray(args[i].value)) { - Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); - } - continue; - } - currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify(); - unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString(); - unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic; - unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone; - j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit]; - if (j === undefined) { - if (unitStatic !== undefined && unit !== unitStatic) { - throw { type: 'Argument', message: 'incompatible types' }; - } - values[unit] = order.length; - order.push(current); - continue; - } - referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify(); - if ( isMin && currentUnified.value < referenceUnified.value || - !isMin && currentUnified.value > referenceUnified.value) { - order[j] = current; - } - } - if (order.length == 1) { - return order[0]; - } - args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', '); - return new Anonymous((isMin ? 'min' : 'max') + '(' + args + ')'); -}; -functionRegistry.addMultiple({ - min: function () { - return minMax(true, arguments); - }, - max: function () { - return minMax(false, arguments); - }, - convert: function (val, unit) { - return val.convertTo(unit.value); - }, - pi: function () { - return new Dimension(Math.PI); - }, - mod: function(a, b) { - return new Dimension(a.value % b.value, a.unit); - }, - pow: function(x, y) { - if (typeof x === 'number' && typeof y === 'number') { - x = new Dimension(x); - y = new Dimension(y); - } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) { - throw { type: 'Argument', message: 'arguments must be numbers' }; - } - - return new Dimension(Math.pow(x.value, y.value), x.unit); - }, - percentage: function (n) { - var result = mathHelper._math(function(num) { - return num * 100; - }, '%', n); - - return result; - } -}); - -},{"../tree/anonymous":50,"../tree/dimension":62,"./function-registry":26,"./math-helper.js":29}],32:[function(require,module,exports){ -var Quoted = require('../tree/quoted'), - Anonymous = require('../tree/anonymous'), - JavaScript = require('../tree/javascript'), - functionRegistry = require('./function-registry'); - -functionRegistry.addMultiple({ - e: function (str) { - return new Anonymous(str instanceof JavaScript ? str.evaluated : str.value); - }, - escape: function (str) { - return new Anonymous( - encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B') - .replace(/\(/g, '%28').replace(/\)/g, '%29')); - }, - replace: function (string, pattern, replacement, flags) { - var result = string.value; - replacement = (replacement.type === 'Quoted') ? - replacement.value : replacement.toCSS(); - result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement); - return new Quoted(string.quote || '', result, string.escaped); - }, - '%': function (string /* arg, arg, ... */) { - var args = Array.prototype.slice.call(arguments, 1), - result = string.value; - - for (var i = 0; i < args.length; i++) { - /* jshint loopfunc:true */ - result = result.replace(/%[sda]/i, function(token) { - var value = ((args[i].type === 'Quoted') && - token.match(/s/i)) ? args[i].value : args[i].toCSS(); - return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; - }); - } - result = result.replace(/%%/g, '%'); - return new Quoted(string.quote || '', result, string.escaped); - } -}); - -},{"../tree/anonymous":50,"../tree/javascript":68,"../tree/quoted":80,"./function-registry":26}],33:[function(require,module,exports){ -module.exports = function(environment) { - var Dimension = require('../tree/dimension'), - Color = require('../tree/color'), - Expression = require('../tree/expression'), - Quoted = require('../tree/quoted'), - URL = require('../tree/url'), - functionRegistry = require('./function-registry'); - - functionRegistry.add('svg-gradient', function(direction) { - - var stops, - gradientDirectionSvg, - gradientType = 'linear', - rectangleDimension = 'x="0" y="0" width="1" height="1"', - renderEnv = {compress: false}, - returner, - directionValue = direction.toCSS(renderEnv), - i, color, position, positionValue, alpha; - - function throwArgumentDescriptor() { - throw { type: 'Argument', - message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' + - ' end_color [end_position] or direction, color list' }; - } - - if (arguments.length == 2) { - if (arguments[1].value.length < 2) { - throwArgumentDescriptor(); - } - stops = arguments[1].value; - } else if (arguments.length < 3) { - throwArgumentDescriptor(); - } else { - stops = Array.prototype.slice.call(arguments, 1); - } - - switch (directionValue) { - case 'to bottom': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; - break; - case 'to right': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; - break; - case 'to bottom right': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; - break; - case 'to top right': - gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; - break; - case 'ellipse': - case 'ellipse at center': - gradientType = 'radial'; - gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; - rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; - break; - default: - throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' + - ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' }; - } - returner = '' + - '<' + gradientType + 'Gradient id="g" ' + gradientDirectionSvg + '>'; - - for (i = 0; i < stops.length; i += 1) { - if (stops[i] instanceof Expression) { - color = stops[i].value[0]; - position = stops[i].value[1]; - } else { - color = stops[i]; - position = undefined; - } - - if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) { - throwArgumentDescriptor(); - } - positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%'; - alpha = color.alpha; - returner += ''; - } - returner += '' + - ''; - - returner = encodeURIComponent(returner); - - returner = 'data:image/svg+xml,' + returner; - return new URL(new Quoted('\'' + returner + '\'', returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); - }); -}; - -},{"../tree/color":55,"../tree/dimension":62,"../tree/expression":64,"../tree/quoted":80,"../tree/url":85,"./function-registry":26}],34:[function(require,module,exports){ -var Keyword = require('../tree/keyword'), - DetachedRuleset = require('../tree/detached-ruleset'), - Dimension = require('../tree/dimension'), - Color = require('../tree/color'), - Quoted = require('../tree/quoted'), - Anonymous = require('../tree/anonymous'), - URL = require('../tree/url'), - Operation = require('../tree/operation'), - functionRegistry = require('./function-registry'); - -var isa = function (n, Type) { - return (n instanceof Type) ? Keyword.True : Keyword.False; - }, - isunit = function (n, unit) { - if (unit === undefined) { - throw { type: 'Argument', message: 'missing the required second argument to isunit.' }; - } - unit = typeof unit.value === 'string' ? unit.value : unit; - if (typeof unit !== 'string') { - throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' }; - } - return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False; - }; - -functionRegistry.addMultiple({ - isruleset: function (n) { - return isa(n, DetachedRuleset); - }, - iscolor: function (n) { - return isa(n, Color); - }, - isnumber: function (n) { - return isa(n, Dimension); - }, - isstring: function (n) { - return isa(n, Quoted); - }, - iskeyword: function (n) { - return isa(n, Keyword); - }, - isurl: function (n) { - return isa(n, URL); - }, - ispixel: function (n) { - return isunit(n, 'px'); - }, - ispercentage: function (n) { - return isunit(n, '%'); - }, - isem: function (n) { - return isunit(n, 'em'); - }, - isunit: isunit, - unit: function (val, unit) { - if (!(val instanceof Dimension)) { - throw { type: 'Argument', - message: 'the first argument to unit must be a number' + - (val instanceof Operation ? '. Have you forgotten parenthesis?' : '') }; - } - if (unit) { - if (unit instanceof Keyword) { - unit = unit.value; - } else { - unit = unit.toCSS(); - } - } else { - unit = ''; - } - return new Dimension(val.value, unit); - }, - 'get-unit': function (n) { - return new Anonymous(n.unit); - } -}); - -},{"../tree/anonymous":50,"../tree/color":55,"../tree/detached-ruleset":61,"../tree/dimension":62,"../tree/keyword":70,"../tree/operation":77,"../tree/quoted":80,"../tree/url":85,"./function-registry":26}],35:[function(require,module,exports){ -var contexts = require('./contexts'), - Parser = require('./parser/parser'), - LessError = require('./less-error'), - utils = require('./utils'), - PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise, - logger = require('./logger'); - -module.exports = function(environment) { - - // FileInfo = { - // 'relativeUrls' - option - whether to adjust URL's to be relative - // 'filename' - full resolved filename of current file - // 'rootpath' - path to append to normal URLs for this node - // 'currentDirectory' - path to the current file, absolute - // 'rootFilename' - filename of the base file - // 'entryPath' - absolute path to the entry file - // 'reference' - whether the file should not be output and only output parts that are referenced - - var ImportManager = function(less, context, rootFileInfo) { - this.less = less; - this.rootFilename = rootFileInfo.filename; - this.paths = context.paths || []; // Search paths, when importing - this.contents = {}; // map - filename to contents of all the files - this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore - this.mime = context.mime; - this.error = null; - this.context = context; - // Deprecated? Unused outside of here, could be useful. - this.queue = []; // Files which haven't been imported yet - this.files = {}; // Holds the imported parse trees. - }; - - /** - * Add an import to be imported - * @param path - the raw path - * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension) - * @param currentFileInfo - the current file info (used for instance to work out relative paths) - * @param importOptions - import options - * @param callback - callback for when it is imported - */ - ImportManager.prototype.push = function (path, tryAppendExtension, currentFileInfo, importOptions, callback) { - var importManager = this, - pluginLoader = this.context.pluginManager.Loader; - - this.queue.push(path); - - var fileParsedFunc = function (e, root, fullPath) { - importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue - - var importedEqualsRoot = fullPath === importManager.rootFilename; - if (importOptions.optional && e) { - callback(null, {rules:[]}, false, null); - logger.info('The file ' + fullPath + ' was skipped because it was not found and the import was marked optional.'); - } - else { - // Inline imports aren't cached here. - // If we start to cache them, please make sure they won't conflict with non-inline imports of the - // same name as they used to do before this comment and the condition below have been added. - if (!importManager.files[fullPath] && !importOptions.inline) { - importManager.files[fullPath] = { root: root, options: importOptions }; - } - if (e && !importManager.error) { importManager.error = e; } - callback(e, root, importedEqualsRoot, fullPath); - } - }; - - var newFileInfo = { - relativeUrls: this.context.relativeUrls, - entryPath: currentFileInfo.entryPath, - rootpath: currentFileInfo.rootpath, - rootFilename: currentFileInfo.rootFilename - }; - - var fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment); - - if (!fileManager) { - fileParsedFunc({ message: 'Could not find a file-manager for ' + path }); - return; - } - - var loadFileCallback = function(loadedFile) { - var plugin, - resolvedFilename = loadedFile.filename, - contents = loadedFile.contents.replace(/^\uFEFF/, ''); - - // Pass on an updated rootpath if path of imported file is relative and file - // is in a (sub|sup) directory - // - // Examples: - // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/', - // then rootpath should become 'less/module/nav/' - // - If path of imported file is '../mixins.less' and rootpath is 'less/', - // then rootpath should become 'less/../' - newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename); - if (newFileInfo.relativeUrls) { - newFileInfo.rootpath = fileManager.join( - (importManager.context.rootpath || ''), - fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath)); - - if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) { - newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath); - } - } - newFileInfo.filename = resolvedFilename; - - var newEnv = new contexts.Parse(importManager.context); - - newEnv.processImports = false; - importManager.contents[resolvedFilename] = contents; - - if (currentFileInfo.reference || importOptions.reference) { - newFileInfo.reference = true; - } - - if (importOptions.isPlugin) { - plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo); - if (plugin instanceof LessError) { - fileParsedFunc(plugin, null, resolvedFilename); - } - else { - fileParsedFunc(null, plugin, resolvedFilename); - } - } else if (importOptions.inline) { - fileParsedFunc(null, contents, resolvedFilename); - } else { - - // import (multiple) parse trees apparently get altered and can't be cached. - // TODO: investigate why this is - if (importManager.files[resolvedFilename] - && !importManager.files[resolvedFilename].options.multiple - && !importOptions.multiple) { - - fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename); - } - else { - new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) { - fileParsedFunc(e, root, resolvedFilename); - }); - } - } - }; - var promise, context = utils.clone(this.context); - - if (tryAppendExtension) { - context.ext = importOptions.isPlugin ? '.js' : '.less'; - } - - if (importOptions.isPlugin) { - promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager); - } - else { - promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment, - function(err, loadedFile) { - if (err) { - fileParsedFunc(err); - } else { - loadFileCallback(loadedFile); - } - }); - } - if (promise) { - promise.then(loadFileCallback, fileParsedFunc); - } - - }; - return ImportManager; -}; - -},{"./contexts":12,"./less-error":37,"./logger":38,"./parser/parser":44,"./utils":89,"promise":undefined}],36:[function(require,module,exports){ -module.exports = function(environment, fileManagers) { - var SourceMapOutput, SourceMapBuilder, ParseTree, ImportManager, Environment; - - var initial = { - version: [3, 7, 1], - data: require('./data'), - tree: require('./tree'), - Environment: (Environment = require('./environment/environment')), - AbstractFileManager: require('./environment/abstract-file-manager'), - AbstractPluginLoader: require('./environment/abstract-plugin-loader'), - environment: (environment = new Environment(environment, fileManagers)), - visitors: require('./visitors'), - Parser: require('./parser/parser'), - functions: require('./functions')(environment), - contexts: require('./contexts'), - SourceMapOutput: (SourceMapOutput = require('./source-map-output')(environment)), - SourceMapBuilder: (SourceMapBuilder = require('./source-map-builder')(SourceMapOutput, environment)), - ParseTree: (ParseTree = require('./parse-tree')(SourceMapBuilder)), - ImportManager: (ImportManager = require('./import-manager')(environment)), - render: require('./render')(environment, ParseTree, ImportManager), - parse: require('./parse')(environment, ParseTree, ImportManager), - LessError: require('./less-error'), - transformTree: require('./transform-tree'), - utils: require('./utils'), - PluginManager: require('./plugin-manager'), - logger: require('./logger') - }; - - // Create a public API - - var ctor = function(t) { - return function() { - var obj = Object.create(t.prototype); - t.apply(obj, Array.prototype.slice.call(arguments, 0)); - return obj; - }; - }; - var t, api = Object.create(initial); - for (var n in initial.tree) { - /* eslint guard-for-in: 0 */ - t = initial.tree[n]; - if (typeof t === 'function') { - api[n.toLowerCase()] = ctor(t); - } - else { - api[n] = Object.create(null); - for (var o in t) { - /* eslint guard-for-in: 0 */ - api[n][o.toLowerCase()] = ctor(t[o]); - } - } - } - - return api; -}; - -},{"./contexts":12,"./data":14,"./environment/abstract-file-manager":17,"./environment/abstract-plugin-loader":18,"./environment/environment":19,"./functions":27,"./import-manager":35,"./less-error":37,"./logger":38,"./parse":41,"./parse-tree":40,"./parser/parser":44,"./plugin-manager":45,"./render":46,"./source-map-builder":47,"./source-map-output":48,"./transform-tree":49,"./tree":67,"./utils":89,"./visitors":93}],37:[function(require,module,exports){ -var utils = require('./utils'); -/** - * This is a centralized class of any error that could be thrown internally (mostly by the parser). - * Besides standard .message it keeps some additional data like a path to the file where the error - * occurred along with line and column numbers. - * - * @class - * @extends Error - * @type {module.LessError} - * - * @prop {string} type - * @prop {string} filename - * @prop {number} index - * @prop {number} line - * @prop {number} column - * @prop {number} callLine - * @prop {number} callExtract - * @prop {string[]} extract - * - * @param {Object} e - An error object to wrap around or just a descriptive object - * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager? - * @param {string} [currentFilename] - */ -var LessError = module.exports = function LessError(e, fileContentMap, currentFilename) { - Error.call(this); - - var filename = e.filename || currentFilename; - - this.message = e.message; - this.stack = e.stack; - - if (fileContentMap && filename) { - var input = fileContentMap.contents[filename], - loc = utils.getLocation(e.index, input), - line = loc.line, - col = loc.column, - callLine = e.call && utils.getLocation(e.call, input).line, - lines = input ? input.split('\n') : ''; - - this.type = e.type || 'Syntax'; - this.filename = filename; - this.index = e.index; - this.line = typeof line === 'number' ? line + 1 : null; - this.column = col; - - if (!this.line && this.stack) { - var found = this.stack.match(/(|Function):(\d+):(\d+)/); - - if (found) { - if (found[2]) { - this.line = parseInt(found[2]) - 2; - } - if (found[3]) { - this.column = parseInt(found[3]); - } - } - } - - this.callLine = callLine + 1; - this.callExtract = lines[callLine]; - - this.extract = [ - lines[this.line - 2], - lines[this.line - 1], - lines[this.line] - ]; - - } - -}; - -if (typeof Object.create === 'undefined') { - var F = function () {}; - F.prototype = Error.prototype; - LessError.prototype = new F(); -} else { - LessError.prototype = Object.create(Error.prototype); -} - -LessError.prototype.constructor = LessError; - -/** - * An overridden version of the default Object.prototype.toString - * which uses additional information to create a helpful message. - * - * @param {Object} options - * @returns {string} - */ -LessError.prototype.toString = function(options) { - options = options || {}; - - var message = ''; - var extract = this.extract || []; - var error = []; - var stylize = function (str) { return str; }; - if (options.stylize) { - var type = typeof options.stylize; - if (type !== 'function') { - throw Error('options.stylize should be a function, got a ' + type + '!'); - } - stylize = options.stylize; - } - - if (this.line !== null) { - if (typeof extract[0] === 'string') { - error.push(stylize((this.line - 1) + ' ' + extract[0], 'grey')); - } - - if (typeof extract[1] === 'string') { - var errorTxt = this.line + ' '; - if (extract[1]) { - errorTxt += extract[1].slice(0, this.column) + - stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') + - extract[1].slice(this.column + 1), 'red'), 'inverse'); - } - error.push(errorTxt); - } - - if (typeof extract[2] === 'string') { - error.push(stylize((this.line + 1) + ' ' + extract[2], 'grey')); - } - error = error.join('\n') + stylize('', 'reset') + '\n'; - } - - message += stylize(this.type + 'Error: ' + this.message, 'red'); - if (this.filename) { - message += stylize(' in ', 'red') + this.filename; - } - if (this.line) { - message += stylize(' on line ' + this.line + ', column ' + (this.column + 1) + ':', 'grey'); - } - - message += '\n' + error; - - if (this.callLine) { - message += stylize('from ', 'red') + (this.filename || '') + '/n'; - message += stylize(this.callLine, 'grey') + ' ' + this.callExtract + '/n'; - } - - return message; -}; - -},{"./utils":89}],38:[function(require,module,exports){ -module.exports = { - error: function(msg) { - this._fireEvent('error', msg); - }, - warn: function(msg) { - this._fireEvent('warn', msg); - }, - info: function(msg) { - this._fireEvent('info', msg); - }, - debug: function(msg) { - this._fireEvent('debug', msg); - }, - addListener: function(listener) { - this._listeners.push(listener); - }, - removeListener: function(listener) { - for (var i = 0; i < this._listeners.length; i++) { - if (this._listeners[i] === listener) { - this._listeners.splice(i, 1); - return; - } - } - }, - _fireEvent: function(type, msg) { - for (var i = 0; i < this._listeners.length; i++) { - var logFunction = this._listeners[i][type]; - if (logFunction) { - logFunction(msg); - } - } - }, - _listeners: [] -}; - -},{}],39:[function(require,module,exports){ -module.exports = { - ALWAYS: 0, - PARENS_DIVISION: 1, - PARENS: 2, - STRICT_LEGACY: 3 -}; -},{}],40:[function(require,module,exports){ -var LessError = require('./less-error'), - transformTree = require('./transform-tree'), - logger = require('./logger'); - -module.exports = function(SourceMapBuilder) { - var ParseTree = function(root, imports) { - this.root = root; - this.imports = imports; - }; - - ParseTree.prototype.toCSS = function(options) { - var evaldRoot, result = {}, sourceMapBuilder; - try { - evaldRoot = transformTree(this.root, options); - } catch (e) { - throw new LessError(e, this.imports); - } - - try { - var compress = Boolean(options.compress); - if (compress) { - logger.warn('The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.'); - } - - var toCSSOptions = { - compress: compress, - dumpLineNumbers: options.dumpLineNumbers, - strictUnits: Boolean(options.strictUnits), - numPrecision: 8}; - - if (options.sourceMap) { - sourceMapBuilder = new SourceMapBuilder(options.sourceMap); - result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports); - } else { - result.css = evaldRoot.toCSS(toCSSOptions); - } - } catch (e) { - throw new LessError(e, this.imports); - } - - if (options.pluginManager) { - var postProcessors = options.pluginManager.getPostProcessors(); - for (var i = 0; i < postProcessors.length; i++) { - result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports }); - } - } - if (options.sourceMap) { - result.map = sourceMapBuilder.getExternalSourceMap(); - } - - result.imports = []; - for (var file in this.imports.files) { - if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) { - result.imports.push(file); - } - } - return result; - }; - return ParseTree; -}; - -},{"./less-error":37,"./logger":38,"./transform-tree":49}],41:[function(require,module,exports){ -var PromiseConstructor, - contexts = require('./contexts'), - Parser = require('./parser/parser'), - PluginManager = require('./plugin-manager'), - LessError = require('./less-error'), - utils = require('./utils'); - -module.exports = function(environment, ParseTree, ImportManager) { - var parse = function (input, options, callback) { - - if (typeof options === 'function') { - callback = options; - options = utils.copyOptions(this.options, {}); - } - else { - options = utils.copyOptions(this.options, options || {}); - } - - if (!callback) { - if (!PromiseConstructor) { - PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise; - } - var self = this; - return new PromiseConstructor(function (resolve, reject) { - parse.call(self, input, options, function(err, output) { - if (err) { - reject(err); - } else { - resolve(output); - } - }); - }); - } else { - var context, - rootFileInfo, - pluginManager = new PluginManager(this, !options.reUsePluginManager); - - options.pluginManager = pluginManager; - - context = new contexts.Parse(options); - - if (options.rootFileInfo) { - rootFileInfo = options.rootFileInfo; - } else { - var filename = options.filename || 'input'; - var entryPath = filename.replace(/[^\/\\]*$/, ''); - rootFileInfo = { - filename: filename, - relativeUrls: context.relativeUrls, - rootpath: context.rootpath || '', - currentDirectory: entryPath, - entryPath: entryPath, - rootFilename: filename - }; - // add in a missing trailing slash - if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') { - rootFileInfo.rootpath += '/'; - } - } - - var imports = new ImportManager(this, context, rootFileInfo); - this.importManager = imports; - - // TODO: allow the plugins to be just a list of paths or names - // Do an async plugin queue like lessc - - if (options.plugins) { - options.plugins.forEach(function(plugin) { - var evalResult, contents; - if (plugin.fileContent) { - contents = plugin.fileContent.replace(/^\uFEFF/, ''); - evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename); - if (evalResult instanceof LessError) { - return callback(evalResult); - } - } - else { - pluginManager.addPlugin(plugin); - } - }); - } - - new Parser(context, imports, rootFileInfo) - .parse(input, function (e, root) { - if (e) { return callback(e); } - callback(null, root, imports, options); - }, options); - } - }; - return parse; -}; - -},{"./contexts":12,"./less-error":37,"./parser/parser":44,"./plugin-manager":45,"./utils":89,"promise":undefined}],42:[function(require,module,exports){ -// Split the input into chunks. -module.exports = function (input, fail) { - var len = input.length, level = 0, parenLevel = 0, - lastOpening, lastOpeningParen, lastMultiComment, lastMultiCommentEndBrace, - chunks = [], emitFrom = 0, - chunkerCurrentIndex, currentChunkStartIndex, cc, cc2, matched; - - function emitChunk(force) { - var len = chunkerCurrentIndex - emitFrom; - if (((len < 512) && !force) || !len) { - return; - } - chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1)); - emitFrom = chunkerCurrentIndex + 1; - } - - for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc = input.charCodeAt(chunkerCurrentIndex); - if (((cc >= 97) && (cc <= 122)) || (cc < 34)) { - // a-z or whitespace - continue; - } - - switch (cc) { - case 40: // ( - parenLevel++; - lastOpeningParen = chunkerCurrentIndex; - continue; - case 41: // ) - if (--parenLevel < 0) { - return fail('missing opening `(`', chunkerCurrentIndex); - } - continue; - case 59: // ; - if (!parenLevel) { emitChunk(); } - continue; - case 123: // { - level++; - lastOpening = chunkerCurrentIndex; - continue; - case 125: // } - if (--level < 0) { - return fail('missing opening `{`', chunkerCurrentIndex); - } - if (!level && !parenLevel) { emitChunk(); } - continue; - case 92: // \ - if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; } - return fail('unescaped `\\`', chunkerCurrentIndex); - case 34: - case 39: - case 96: // ", ' and ` - matched = 0; - currentChunkStartIndex = chunkerCurrentIndex; - for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if (cc2 > 96) { continue; } - if (cc2 == cc) { matched = 1; break; } - if (cc2 == 92) { // \ - if (chunkerCurrentIndex == len - 1) { - return fail('unescaped `\\`', chunkerCurrentIndex); - } - chunkerCurrentIndex++; - } - } - if (matched) { continue; } - return fail('unmatched `' + String.fromCharCode(cc) + '`', currentChunkStartIndex); - case 47: // /, check for comment - if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; } - cc2 = input.charCodeAt(chunkerCurrentIndex + 1); - if (cc2 == 47) { - // //, find lnfeed - for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; } - } - } else if (cc2 == 42) { - // /*, find */ - lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex; - for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; } - if (cc2 != 42) { continue; } - if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; } - } - if (chunkerCurrentIndex == len - 1) { - return fail('missing closing `*/`', currentChunkStartIndex); - } - chunkerCurrentIndex++; - } - continue; - case 42: // *, check for unmatched */ - if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) { - return fail('unmatched `/*`', chunkerCurrentIndex); - } - continue; - } - } - - if (level !== 0) { - if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) { - return fail('missing closing `}` or `*/`', lastOpening); - } else { - return fail('missing closing `}`', lastOpening); - } - } else if (parenLevel !== 0) { - return fail('missing closing `)`', lastOpeningParen); - } - - emitChunk(true); - return chunks; -}; - -},{}],43:[function(require,module,exports){ -var chunker = require('./chunker'); - -module.exports = function() { - var input, // Less input string - j, // current chunk - saveStack = [], // holds state for backtracking - furthest, // furthest index the parser has gone to - furthestPossibleErrorMessage, // if this is furthest we got to, this is the probably cause - chunks, // chunkified input - current, // current chunk - currentPos, // index of current chunk, in `input` - parserInput = {}; - - var CHARCODE_SPACE = 32, - CHARCODE_TAB = 9, - CHARCODE_LF = 10, - CHARCODE_CR = 13, - CHARCODE_PLUS = 43, - CHARCODE_COMMA = 44, - CHARCODE_FORWARD_SLASH = 47, - CHARCODE_9 = 57; - - function skipWhitespace(length) { - var oldi = parserInput.i, oldj = j, - curr = parserInput.i - currentPos, - endIndex = parserInput.i + current.length - curr, - mem = (parserInput.i += length), - inp = input, - c, nextChar, comment; - - for (; parserInput.i < endIndex; parserInput.i++) { - c = inp.charCodeAt(parserInput.i); - - if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) { - nextChar = inp.charAt(parserInput.i + 1); - if (nextChar === '/') { - comment = {index: parserInput.i, isLineComment: true}; - var nextNewLine = inp.indexOf('\n', parserInput.i + 2); - if (nextNewLine < 0) { - nextNewLine = endIndex; - } - parserInput.i = nextNewLine; - comment.text = inp.substr(comment.index, parserInput.i - comment.index); - parserInput.commentStore.push(comment); - continue; - } else if (nextChar === '*') { - var nextStarSlash = inp.indexOf('*/', parserInput.i + 2); - if (nextStarSlash >= 0) { - comment = { - index: parserInput.i, - text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i), - isLineComment: false - }; - parserInput.i += comment.text.length - 1; - parserInput.commentStore.push(comment); - continue; - } - } - break; - } - - if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) { - break; - } - } - - current = current.slice(length + parserInput.i - mem + curr); - currentPos = parserInput.i; - - if (!current.length) { - if (j < chunks.length - 1) { - current = chunks[++j]; - skipWhitespace(0); // skip space at the beginning of a chunk - return true; // things changed - } - parserInput.finished = true; - } - - return oldi !== parserInput.i || oldj !== j; - } - - parserInput.save = function() { - currentPos = parserInput.i; - saveStack.push( { current: current, i: parserInput.i, j: j }); - }; - parserInput.restore = function(possibleErrorMessage) { - - if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) { - furthest = parserInput.i; - furthestPossibleErrorMessage = possibleErrorMessage; - } - var state = saveStack.pop(); - current = state.current; - currentPos = parserInput.i = state.i; - j = state.j; - }; - parserInput.forget = function() { - saveStack.pop(); - }; - parserInput.isWhitespace = function (offset) { - var pos = parserInput.i + (offset || 0), - code = input.charCodeAt(pos); - return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF); - }; - - // Specialization of $(tok) - parserInput.$re = function(tok) { - if (parserInput.i > currentPos) { - current = current.slice(parserInput.i - currentPos); - currentPos = parserInput.i; - } - - var m = tok.exec(current); - if (!m) { - return null; - } - - skipWhitespace(m[0].length); - if (typeof m === 'string') { - return m; - } - - return m.length === 1 ? m[0] : m; - }; - - parserInput.$char = function(tok) { - if (input.charAt(parserInput.i) !== tok) { - return null; - } - skipWhitespace(1); - return tok; - }; - - parserInput.$str = function(tok) { - var tokLength = tok.length; - - // https://jsperf.com/string-startswith/21 - for (var i = 0; i < tokLength; i++) { - if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { - return null; - } - } - - skipWhitespace(tokLength); - return tok; - }; - - parserInput.$quoted = function(loc) { - var pos = loc || parserInput.i, - startChar = input.charAt(pos); - - if (startChar !== '\'' && startChar !== '"') { - return; - } - var length = input.length, - currentPosition = pos; - - for (var i = 1; i + currentPosition < length; i++) { - var nextChar = input.charAt(i + currentPosition); - switch (nextChar) { - case '\\': - i++; - continue; - case '\r': - case '\n': - break; - case startChar: - var str = input.substr(currentPosition, i + 1); - if (!loc && loc !== 0) { - skipWhitespace(i + 1); - return str - } - return [startChar, str]; - default: - } - } - return null; - }; - - /** - * Permissive parsing. Ignores everything except matching {} [] () and quotes - * until matching token (outside of blocks) - */ - parserInput.$parseUntil = function(tok) { - var quote = '', - returnVal = null, - inComment = false, - blockDepth = 0, - blockStack = [], - parseGroups = [], - length = input.length, - startPos = parserInput.i, - lastPos = parserInput.i, - i = parserInput.i, - loop = true, - testChar; - - if (typeof tok === 'string') { - testChar = function(char) { - return char === tok; - } - } else { - testChar = function(char) { - return tok.test(char); - } - } - - do { - var prevChar, nextChar = input.charAt(i); - if (blockDepth === 0 && testChar(nextChar)) { - returnVal = input.substr(lastPos, i - lastPos); - if (returnVal) { - parseGroups.push(returnVal); - } - else { - parseGroups.push(' '); - } - returnVal = parseGroups; - skipWhitespace(i - startPos); - loop = false - } else { - if (inComment) { - if (nextChar === '*' && - input.charAt(i + 1) === '/') { - i++; - blockDepth--; - inComment = false; - } - i++; - continue; - } - switch (nextChar) { - case '\\': - i++; - nextChar = input.charAt(i); - parseGroups.push(input.substr(lastPos, i - lastPos + 1)); - lastPos = i + 1; - break; - case '/': - if (input.charAt(i + 1) === '*') { - i++; - inComment = true; - blockDepth++; - } - break; - case '\'': - case '"': - quote = parserInput.$quoted(i); - if (quote) { - parseGroups.push(input.substr(lastPos, i - lastPos), quote); - i += quote[1].length - 1; - lastPos = i + 1; - } - else { - skipWhitespace(i - startPos); - returnVal = nextChar; - loop = false; - } - break; - case '{': - blockStack.push('}'); - blockDepth++; - break; - case '(': - blockStack.push(')'); - blockDepth++; - break; - case '[': - blockStack.push(']'); - blockDepth++; - break; - case '}': - case ')': - case ']': - var expected = blockStack.pop(); - if (nextChar === expected) { - blockDepth--; - } else { - // move the parser to the error and return expected - skipWhitespace(i - startPos); - returnVal = expected; - loop = false; - } - } - i++; - if (i > length) { - loop = false; - } - } - prevChar = nextChar; - } while (loop); - - return returnVal ? returnVal : null; - } - - parserInput.autoCommentAbsorb = true; - parserInput.commentStore = []; - parserInput.finished = false; - - // Same as $(), but don't change the state of the parser, - // just return the match. - parserInput.peek = function(tok) { - if (typeof tok === 'string') { - // https://jsperf.com/string-startswith/21 - for (var i = 0; i < tok.length; i++) { - if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { - return false; - } - } - return true; - } else { - return tok.test(current); - } - }; - - // Specialization of peek() - // TODO remove or change some currentChar calls to peekChar - parserInput.peekChar = function(tok) { - return input.charAt(parserInput.i) === tok; - }; - - parserInput.currentChar = function() { - return input.charAt(parserInput.i); - }; - - parserInput.prevChar = function() { - return input.charAt(parserInput.i - 1); - }; - - parserInput.getInput = function() { - return input; - }; - - parserInput.peekNotNumeric = function() { - var c = input.charCodeAt(parserInput.i); - // Is the first char of the dimension 0-9, '.', '+' or '-' - return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA; - }; - - parserInput.start = function(str, chunkInput, failFunction) { - input = str; - parserInput.i = j = currentPos = furthest = 0; - - // chunking apparently makes things quicker (but my tests indicate - // it might actually make things slower in node at least) - // and it is a non-perfect parse - it can't recognise - // unquoted urls, meaning it can't distinguish comments - // meaning comments with quotes or {}() in them get 'counted' - // and then lead to parse errors. - // In addition if the chunking chunks in the wrong place we might - // not be able to parse a parser statement in one go - // this is officially deprecated but can be switched on via an option - // in the case it causes too much performance issues. - if (chunkInput) { - chunks = chunker(str, failFunction); - } else { - chunks = [str]; - } - - current = chunks[0]; - - skipWhitespace(0); - }; - - parserInput.end = function() { - var message, - isFinished = parserInput.i >= input.length; - - if (parserInput.i < furthest) { - message = furthestPossibleErrorMessage; - parserInput.i = furthest; - } - return { - isFinished: isFinished, - furthest: parserInput.i, - furthestPossibleErrorMessage: message, - furthestReachedEnd: parserInput.i >= input.length - 1, - furthestChar: input[parserInput.i] - }; - }; - - return parserInput; -}; - -},{"./chunker":42}],44:[function(require,module,exports){ -var LessError = require('../less-error'), - tree = require('../tree'), - visitors = require('../visitors'), - getParserInput = require('./parser-input'), - utils = require('../utils'), - functionRegistry = require('../functions/function-registry'); - -// -// less.js - parser -// -// A relatively straight-forward predictive parser. -// There is no tokenization/lexing stage, the input is parsed -// in one sweep. -// -// To make the parser fast enough to run in the browser, several -// optimization had to be made: -// -// - Matching and slicing on a huge input is often cause of slowdowns. -// The solution is to chunkify the input into smaller strings. -// The chunks are stored in the `chunks` var, -// `j` holds the current chunk index, and `currentPos` holds -// the index of the current chunk in relation to `input`. -// This gives us an almost 4x speed-up. -// -// - In many cases, we don't need to match individual tokens; -// for example, if a value doesn't hold any variables, operations -// or dynamic references, the parser can effectively 'skip' it, -// treating it as a literal. -// An example would be '1px solid #000' - which evaluates to itself, -// we don't need to know what the individual components are. -// The drawback, of course is that you don't get the benefits of -// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, -// and a smaller speed-up in the code-gen. -// -// -// Token matching is done with the `$` function, which either takes -// a terminal string or regexp, or a non-terminal function to call. -// It also takes care of moving all the indices forwards. -// - -var Parser = function Parser(context, imports, fileInfo) { - var parsers, - parserInput = getParserInput(); - - function error(msg, type) { - throw new LessError( - { - index: parserInput.i, - filename: fileInfo.filename, - type: type || 'Syntax', - message: msg - }, - imports - ); - } - - function expect(arg, msg) { - // some older browsers return typeof 'function' for RegExp - var result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg); - if (result) { - return result; - } - - error(msg || (typeof arg === 'string' - ? 'expected \'' + arg + '\' got \'' + parserInput.currentChar() + '\'' - : 'unexpected token')); - } - - // Specialization of expect() - function expectChar(arg, msg) { - if (parserInput.$char(arg)) { - return arg; - } - error(msg || 'expected \'' + arg + '\' got \'' + parserInput.currentChar() + '\''); - } - - function getDebugInfo(index) { - var filename = fileInfo.filename; - - return { - lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1, - fileName: filename - }; - } - - /** - * Used after initial parsing to create nodes on the fly - * - * @param {String} str - string to parse - * @param {Array} parseList - array of parsers to run input through e.g. ["value", "important"] - * @param {Number} currentIndex - start number to begin indexing - * @param {Object} fileInfo - fileInfo to attach to created nodes - */ - function parseNode(str, parseList, currentIndex, fileInfo, callback) { - var result, returnNodes = []; - var parser = parserInput; - - try { - parser.start(str, false, function fail(msg, index) { - callback({ - message: msg, - index: index + currentIndex - }); - }); - for (var x = 0, p, i; (p = parseList[x]); x++) { - i = parser.i; - result = parsers[p](); - if (result) { - result._index = i + currentIndex; - result._fileInfo = fileInfo; - returnNodes.push(result); - } - else { - returnNodes.push(null); - } - } - - var endInfo = parser.end(); - if (endInfo.isFinished) { - callback(null, returnNodes); - } - else { - callback(true, null); - } - } catch (e) { - throw new LessError({ - index: e.index + currentIndex, - message: e.message - }, imports, fileInfo.filename); - } - } - - // - // The Parser - // - return { - parserInput: parserInput, - imports: imports, - fileInfo: fileInfo, - parseNode: parseNode, - // - // Parse an input string into an abstract syntax tree, - // @param str A string containing 'less' markup - // @param callback call `callback` when done. - // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply - // - parse: function (str, callback, additionalData) { - var root, error = null, globalVars, modifyVars, ignored, preText = ''; - - globalVars = (additionalData && additionalData.globalVars) ? Parser.serializeVars(additionalData.globalVars) + '\n' : ''; - modifyVars = (additionalData && additionalData.modifyVars) ? '\n' + Parser.serializeVars(additionalData.modifyVars) : ''; - - if (context.pluginManager) { - var preProcessors = context.pluginManager.getPreProcessors(); - for (var i = 0; i < preProcessors.length; i++) { - str = preProcessors[i].process(str, { context: context, imports: imports, fileInfo: fileInfo }); - } - } - - if (globalVars || (additionalData && additionalData.banner)) { - preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars; - ignored = imports.contentsIgnoredChars; - ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0; - ignored[fileInfo.filename] += preText.length; - } - - str = str.replace(/\r\n?/g, '\n'); - // Remove potential UTF Byte Order Mark - str = preText + str.replace(/^\uFEFF/, '') + modifyVars; - imports.contents[fileInfo.filename] = str; - - // Start with the primary rule. - // The whole syntax tree is held under a Ruleset node, - // with the `root` property set to true, so no `{}` are - // output. The callback is called when the input is parsed. - try { - parserInput.start(str, context.chunkInput, function fail(msg, index) { - throw new LessError({ - index: index, - type: 'Parse', - message: msg, - filename: fileInfo.filename - }, imports); - }); - - tree.Node.prototype.parse = this; - root = new tree.Ruleset(null, this.parsers.primary()); - tree.Node.prototype.rootNode = root; - root.root = true; - root.firstRoot = true; - root.functionRegistry = functionRegistry.inherit(); - - } catch (e) { - return callback(new LessError(e, imports, fileInfo.filename)); - } - - // If `i` is smaller than the `input.length - 1`, - // it means the parser wasn't able to parse the whole - // string, so we've got a parsing error. - // - // We try to extract a \n delimited string, - // showing the line where the parse error occurred. - // We split it up into two parts (the part which parsed, - // and the part which didn't), so we can color them differently. - var endInfo = parserInput.end(); - if (!endInfo.isFinished) { - - var message = endInfo.furthestPossibleErrorMessage; - - if (!message) { - message = 'Unrecognised input'; - if (endInfo.furthestChar === '}') { - message += '. Possibly missing opening \'{\''; - } else if (endInfo.furthestChar === ')') { - message += '. Possibly missing opening \'(\''; - } else if (endInfo.furthestReachedEnd) { - message += '. Possibly missing something'; - } - } - - error = new LessError({ - type: 'Parse', - message: message, - index: endInfo.furthest, - filename: fileInfo.filename - }, imports); - } - - var finish = function (e) { - e = error || e || imports.error; - - if (e) { - if (!(e instanceof LessError)) { - e = new LessError(e, imports, fileInfo.filename); - } - - return callback(e); - } - else { - return callback(null, root); - } - }; - - if (context.processImports !== false) { - new visitors.ImportVisitor(imports, finish) - .run(root); - } else { - return finish(); - } - }, - - // - // Here in, the parsing rules/functions - // - // The basic structure of the syntax tree generated is as follows: - // - // Ruleset -> Declaration -> Value -> Expression -> Entity - // - // Here's some Less code: - // - // .class { - // color: #fff; - // border: 1px solid #000; - // width: @w + 4px; - // > .child {...} - // } - // - // And here's what the parse tree might look like: - // - // Ruleset (Selector '.class', [ - // Declaration ("color", Value ([Expression [Color #fff]])) - // Declaration ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) - // Declaration ("width", Value ([Expression [Operation " + " [Variable "@w"][Dimension 4px]]])) - // Ruleset (Selector [Element '>', '.child'], [...]) - // ]) - // - // In general, most rules will try to parse a token with the `$re()` function, and if the return - // value is truly, will return a new node, of the relevant type. Sometimes, we need to check - // first, before parsing, that's when we use `peek()`. - // - parsers: parsers = { - // - // The `primary` rule is the *entry* and *exit* point of the parser. - // The rules here can appear at any level of the parse tree. - // - // The recursive nature of the grammar is an interplay between the `block` - // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, - // as represented by this simplified grammar: - // - // primary → (ruleset | declaration)+ - // ruleset → selector+ block - // block → '{' primary '}' - // - // Only at one point is the primary rule not called from the - // block rule: at the root level. - // - primary: function () { - var mixin = this.mixin, root = [], node; - - while (true) { - while (true) { - node = this.comment(); - if (!node) { break; } - root.push(node); - } - // always process comments before deciding if finished - if (parserInput.finished) { - break; - } - if (parserInput.peek('}')) { - break; - } - - node = this.extendRule(); - if (node) { - root = root.concat(node); - continue; - } - - node = mixin.definition() || this.declaration() || this.ruleset() || - mixin.call(false, false) || this.variableCall() || this.entities.call() || this.atrule(); - if (node) { - root.push(node); - } else { - var foundSemiColon = false; - while (parserInput.$char(';')) { - foundSemiColon = true; - } - if (!foundSemiColon) { - break; - } - } - } - - return root; - }, - - // comments are collected by the main parsing mechanism and then assigned to nodes - // where the current structure allows it - comment: function () { - if (parserInput.commentStore.length) { - var comment = parserInput.commentStore.shift(); - return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo); - } - }, - - // - // Entities are tokens which can be found inside an Expression - // - entities: { - mixinLookup: function() { - return parsers.mixin.call(true, true); - }, - // - // A string, which supports escaping " and ' - // - // "milky way" 'he\'s the one!' - // - quoted: function (forceEscaped) { - var str, index = parserInput.i, isEscaped = false; - - parserInput.save(); - if (parserInput.$char('~')) { - isEscaped = true; - } else if (forceEscaped) { - parserInput.restore(); - return; - } - - str = parserInput.$quoted(); - if (!str) { - parserInput.restore(); - return; - } - parserInput.forget(); - - return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo); - }, - - // - // A catch-all word, such as: - // - // black border-collapse - // - keyword: function () { - var k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/); - if (k) { - return tree.Color.fromKeyword(k) || new(tree.Keyword)(k); - } - }, - - // - // A function call - // - // rgb(255, 0, 255) - // - // The arguments are parsed with the `entities.arguments` parser. - // - call: function () { - var name, args, func, index = parserInput.i; - - // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 - if (parserInput.peek(/^url\(/i)) { - return; - } - - parserInput.save(); - - name = parserInput.$re(/^([\w-]+|%|progid:[\w\.]+)\(/); - if (!name) { - parserInput.forget(); - return; - } - - name = name[1]; - func = this.customFuncCall(name); - if (func) { - args = func.parse(); - if (args && func.stop) { - parserInput.forget(); - return args; - } - } - - args = this.arguments(args); - - if (!parserInput.$char(')')) { - parserInput.restore('Could not parse call arguments or missing \')\''); - return; - } - - parserInput.forget(); - - return new(tree.Call)(name, args, index, fileInfo); - }, - - // - // Parsing rules for functions with non-standard args, e.g.: - // - // boolean(not(2 > 1)) - // - // This is a quick prototype, to be modified/improved when - // more custom-parsed funcs come (e.g. `selector(...)`) - // - - customFuncCall: function (name) { - /* Ideally the table is to be moved out of here for faster perf., - but it's quite tricky since it relies on all these `parsers` - and `expect` available only here */ - return { - alpha: f(parsers.ieAlpha, true), - boolean: f(condition), - 'if': f(condition) - }[name.toLowerCase()]; - - function f(parse, stop) { - return { - parse: parse, // parsing function - stop: stop // when true - stop after parse() and return its result, - // otherwise continue for plain args - }; - } - - function condition() { - return [expect(parsers.condition, 'expected condition')]; - } - }, - - arguments: function (prevArgs) { - var argsComma = prevArgs || [], - argsSemiColon = [], - isSemiColonSeparated, value; - - parserInput.save(); - - while (true) { - if (prevArgs) { - prevArgs = false; - } else { - value = parsers.detachedRuleset() || this.assignment() || parsers.expression(); - if (!value) { - break; - } - - if (value.value && value.value.length == 1) { - value = value.value[0]; - } - - argsComma.push(value); - } - - if (parserInput.$char(',')) { - continue; - } - - if (parserInput.$char(';') || isSemiColonSeparated) { - isSemiColonSeparated = true; - value = (argsComma.length < 1) ? argsComma[0] - : new tree.Value(argsComma); - argsSemiColon.push(value); - argsComma = []; - } - } - - parserInput.forget(); - return isSemiColonSeparated ? argsSemiColon : argsComma; - }, - literal: function () { - return this.dimension() || - this.color() || - this.quoted() || - this.unicodeDescriptor(); - }, - - // Assignments are argument entities for calls. - // They are present in ie filter properties as shown below. - // - // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) - // - - assignment: function () { - var key, value; - parserInput.save(); - key = parserInput.$re(/^\w+(?=\s?=)/i); - if (!key) { - parserInput.restore(); - return; - } - if (!parserInput.$char('=')) { - parserInput.restore(); - return; - } - value = parsers.entity(); - if (value) { - parserInput.forget(); - return new(tree.Assignment)(key, value); - } else { - parserInput.restore(); - } - }, - - // - // Parse url() tokens - // - // We use a specific rule for urls, because they don't really behave like - // standard function calls. The difference is that the argument doesn't have - // to be enclosed within a string, so it can't be parsed as an Expression. - // - url: function () { - var value, index = parserInput.i; - - parserInput.autoCommentAbsorb = false; - - if (!parserInput.$str('url(')) { - parserInput.autoCommentAbsorb = true; - return; - } - - value = this.quoted() || this.variable() || this.property() || - parserInput.$re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ''; - - parserInput.autoCommentAbsorb = true; - - expectChar(')'); - - return new(tree.URL)((value.value != null || - value instanceof tree.Variable || - value instanceof tree.Property) ? - value : new(tree.Anonymous)(value, index), index, fileInfo); - }, - - // - // A Variable entity, such as `@fink`, in - // - // width: @fink + 2px - // - // We use a different parser for variable definitions, - // see `parsers.variable`. - // - variable: function () { - var ch, name, index = parserInput.i; - - parserInput.save(); - if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) { - ch = parserInput.currentChar(); - if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\s/)) { - // this may be a VariableCall lookup - var result = parsers.variableCall(name); - if (result) { - parserInput.forget(); - return result; - } - } - parserInput.forget(); - return new(tree.Variable)(name, index, fileInfo); - } - parserInput.restore(); - }, - - // A variable entity using the protective {} e.g. @{var} - variableCurly: function () { - var curly, index = parserInput.i; - - if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) { - return new(tree.Variable)('@' + curly[1], index, fileInfo); - } - }, - // - // A Property accessor, such as `$color`, in - // - // background-color: $color - // - property: function () { - var name, index = parserInput.i; - - if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) { - return new(tree.Property)(name, index, fileInfo); - } - }, - - // A property entity useing the protective {} e.g. ${prop} - propertyCurly: function () { - var curly, index = parserInput.i; - - if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\$\{([\w-]+)\}/))) { - return new(tree.Property)('$' + curly[1], index, fileInfo); - } - }, - // - // A Hexadecimal color - // - // #4F3C2F - // - // `rgb` and `hsl` colors are parsed through the `entities.call` parser. - // - color: function () { - var rgb; - - if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))) { - // strip colons, brackets, whitespaces and other characters that should not - // definitely be part of color string - var colorCandidateString = rgb.input.match(/^#([\w]+).*/); - colorCandidateString = colorCandidateString[1]; - if (!colorCandidateString.match(/^[A-Fa-f0-9]+$/)) { // verify if candidate consists only of allowed HEX characters - error('Invalid HEX color code'); - } - return new(tree.Color)(rgb[1], undefined, '#' + colorCandidateString); - } - }, - - colorKeyword: function () { - parserInput.save(); - var autoCommentAbsorb = parserInput.autoCommentAbsorb; - parserInput.autoCommentAbsorb = false; - var k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/); - parserInput.autoCommentAbsorb = autoCommentAbsorb; - if (!k) { - parserInput.forget(); - return; - } - parserInput.restore(); - var color = tree.Color.fromKeyword(k); - if (color) { - parserInput.$str(k); - return color; - } - }, - - // - // A Dimension, that is, a number and a unit - // - // 0.5em 95% - // - dimension: function () { - if (parserInput.peekNotNumeric()) { - return; - } - - var value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i); - if (value) { - return new(tree.Dimension)(value[1], value[2]); - } - }, - - // - // A unicode descriptor, as is used in unicode-range - // - // U+0?? or U+00A1-00A9 - // - unicodeDescriptor: function () { - var ud; - - ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/); - if (ud) { - return new(tree.UnicodeDescriptor)(ud[0]); - } - }, - - // - // JavaScript code to be evaluated - // - // `window.location.href` - // - javascript: function () { - var js, index = parserInput.i; - - parserInput.save(); - - var escape = parserInput.$char('~'); - var jsQuote = parserInput.$char('`'); - - if (!jsQuote) { - parserInput.restore(); - return; - } - - js = parserInput.$re(/^[^`]*`/); - if (js) { - parserInput.forget(); - return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo); - } - parserInput.restore('invalid javascript definition'); - } - }, - - // - // The variable part of a variable definition. Used in the `rule` parser - // - // @fink: - // - variable: function () { - var name; - - if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) { return name[1]; } - }, - - // - // Call a variable value to retrieve a detached ruleset - // or a value from a detached ruleset's rules. - // - // @fink(); - // @fink; - // color: @fink[@color]; - // - variableCall: function (parsedName) { - var lookups, important, i = parserInput.i, - inValue = !!parsedName, name = parsedName; - - parserInput.save(); - - if (name || (parserInput.currentChar() === '@' - && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) { - - lookups = this.mixin.ruleLookups(); - - if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) { - parserInput.restore('Missing \'[...]\' lookup in variable call'); - return; - } - - if (!inValue) { - name = name[1]; - } - - if (lookups && parsers.important()) { - important = true; - } - - var call = new tree.VariableCall(name, i, fileInfo); - if (!inValue && parsers.end()) { - parserInput.forget(); - return call; - } - else { - parserInput.forget(); - return new tree.NamespaceValue(call, lookups, important, i, fileInfo); - } - } - - parserInput.restore(); - }, - - // - // extend syntax - used to extend selectors - // - extend: function(isRule) { - var elements, e, index = parserInput.i, option, extendList, extend; - - if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) { - return; - } - - do { - option = null; - elements = null; - while (!(option = parserInput.$re(/^(all)(?=\s*(\)|,))/))) { - e = this.element(); - if (!e) { - break; - } - if (elements) { - elements.push(e); - } else { - elements = [ e ]; - } - } - - option = option && option[1]; - if (!elements) { - error('Missing target selector for :extend().'); - } - extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo); - if (extendList) { - extendList.push(extend); - } else { - extendList = [ extend ]; - } - } while (parserInput.$char(',')); - - expect(/^\)/); - - if (isRule) { - expect(/^;/); - } - - return extendList; - }, - - // - // extendRule - used in a rule to extend all the parent selectors - // - extendRule: function() { - return this.extend(true); - }, - - // - // Mixins - // - mixin: { - // - // A Mixin call, with an optional argument list - // - // #mixins > .square(#fff); - // #mixins.square(#fff); - // .rounded(4px, black); - // .button; - // - // We can lookup / return a value using the lookup syntax: - // - // color: #mixin.square(#fff)[@color]; - // - // The `while` loop is there because mixins can be - // namespaced, but we only support the child and descendant - // selector for now. - // - call: function (inValue, getLookup) { - var s = parserInput.currentChar(), important = false, lookups, - index = parserInput.i, elements, args, hasParens; - - if (s !== '.' && s !== '#') { return; } - - parserInput.save(); // stop us absorbing part of an invalid selector - - elements = this.elements(); - - if (elements) { - if (parserInput.$char('(')) { - args = this.args(true).args; - expectChar(')'); - hasParens = true; - } - - if (getLookup !== false) { - lookups = this.ruleLookups(); - } - if (getLookup === true && !lookups) { - parserInput.restore(); - return; - } - - if (inValue && !lookups && !hasParens) { - // This isn't a valid in-value mixin call - parserInput.restore(); - return; - } - - if (!inValue && parsers.important()) { - important = true; - } - - if (inValue || parsers.end()) { - parserInput.forget(); - var mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important); - if (lookups) { - return new tree.NamespaceValue(mixin, lookups, important); - } - else { - return mixin; - } - } - } - - parserInput.restore(); - }, - /** - * Matching elements for mixins - * (Start with . or # and can have > ) - */ - elements: function() { - var elements, e, c, elem, elemIndex, - re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/; - while (true) { - elemIndex = parserInput.i; - e = parserInput.$re(re); - - if (!e) { - break; - } - elem = new(tree.Element)(c, e, false, elemIndex, fileInfo); - if (elements) { - elements.push(elem); - } else { - elements = [ elem ]; - } - c = parserInput.$char('>'); - } - return elements; - }, - args: function (isCall) { - var entities = parsers.entities, - returner = { args:null, variadic: false }, - expressions = [], argsSemiColon = [], argsComma = [], - isSemiColonSeparated, expressionContainsNamed, name, nameLoop, - value, arg, expand, hasSep = true; - - parserInput.save(); - - while (true) { - if (isCall) { - arg = parsers.detachedRuleset() || parsers.expression(); - } else { - parserInput.commentStore.length = 0; - if (parserInput.$str('...')) { - returner.variadic = true; - if (parserInput.$char(';') && !isSemiColonSeparated) { - isSemiColonSeparated = true; - } - (isSemiColonSeparated ? argsSemiColon : argsComma) - .push({ variadic: true }); - break; - } - arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true); - } - - if (!arg || !hasSep) { - break; - } - - nameLoop = null; - if (arg.throwAwayComments) { - arg.throwAwayComments(); - } - value = arg; - var val = null; - - if (isCall) { - // Variable - if (arg.value && arg.value.length == 1) { - val = arg.value[0]; - } - } else { - val = arg; - } - - if (val && (val instanceof tree.Variable || val instanceof tree.Property)) { - if (parserInput.$char(':')) { - if (expressions.length > 0) { - if (isSemiColonSeparated) { - error('Cannot mix ; and , as delimiter types'); - } - expressionContainsNamed = true; - } - - value = parsers.detachedRuleset() || parsers.expression(); - - if (!value) { - if (isCall) { - error('could not understand value for named argument'); - } else { - parserInput.restore(); - returner.args = []; - return returner; - } - } - nameLoop = (name = val.name); - } else if (parserInput.$str('...')) { - if (!isCall) { - returner.variadic = true; - if (parserInput.$char(';') && !isSemiColonSeparated) { - isSemiColonSeparated = true; - } - (isSemiColonSeparated ? argsSemiColon : argsComma) - .push({ name: arg.name, variadic: true }); - break; - } else { - expand = true; - } - } else if (!isCall) { - name = nameLoop = val.name; - value = null; - } - } - - if (value) { - expressions.push(value); - } - - argsComma.push({ name:nameLoop, value:value, expand:expand }); - - if (parserInput.$char(',')) { - hasSep = true; - continue; - } - hasSep = parserInput.$char(';') === ';'; - - if (hasSep || isSemiColonSeparated) { - - if (expressionContainsNamed) { - error('Cannot mix ; and , as delimiter types'); - } - - isSemiColonSeparated = true; - - if (expressions.length > 1) { - value = new(tree.Value)(expressions); - } - argsSemiColon.push({ name:name, value:value, expand:expand }); - - name = null; - expressions = []; - expressionContainsNamed = false; - } - } - - parserInput.forget(); - returner.args = isSemiColonSeparated ? argsSemiColon : argsComma; - return returner; - }, - // - // A Mixin definition, with a list of parameters - // - // .rounded (@radius: 2px, @color) { - // ... - // } - // - // Until we have a finer grained state-machine, we have to - // do a look-ahead, to make sure we don't have a mixin call. - // See the `rule` function for more information. - // - // We start by matching `.rounded (`, and then proceed on to - // the argument list, which has optional default values. - // We store the parameters in `params`, with a `value` key, - // if there is a value, such as in the case of `@radius`. - // - // Once we've got our params list, and a closing `)`, we parse - // the `{...}` block. - // - definition: function () { - var name, params = [], match, ruleset, cond, variadic = false; - if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') || - parserInput.peek(/^[^{]*\}/)) { - return; - } - - parserInput.save(); - - match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/); - if (match) { - name = match[1]; - - var argInfo = this.args(false); - params = argInfo.args; - variadic = argInfo.variadic; - - // .mixincall("@{a}"); - // looks a bit like a mixin definition.. - // also - // .mixincall(@a: {rule: set;}); - // so we have to be nice and restore - if (!parserInput.$char(')')) { - parserInput.restore('Missing closing \')\''); - return; - } - - parserInput.commentStore.length = 0; - - if (parserInput.$str('when')) { // Guard - cond = expect(parsers.conditions, 'expected condition'); - } - - ruleset = parsers.block(); - - if (ruleset) { - parserInput.forget(); - return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic); - } else { - parserInput.restore(); - } - } else { - parserInput.forget(); - } - }, - - ruleLookups: function() { - var rule, args, lookups = []; - - if (parserInput.currentChar() !== '[') { - return; - } - - while (true) { - parserInput.save(); - args = null; - rule = this.lookupValue(); - if (!rule && rule !== '') { - parserInput.restore(); - break; - } - lookups.push(rule); - parserInput.forget(); - } - if (lookups.length > 0) { - return lookups; - } - }, - - lookupValue: function() { - parserInput.save(); - - if (!parserInput.$char('[')) { - parserInput.restore(); - return; - } - - var name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/); - - if (!parserInput.$char(']')) { - parserInput.restore(); - return; - } - - if (name || name === '') { - parserInput.forget(); - return name; - } - - parserInput.restore(); - } - }, - // - // Entities are the smallest recognized token, - // and can be found inside a rule's value. - // - entity: function () { - var entities = this.entities; - - return this.comment() || entities.literal() || entities.variable() || entities.url() || - entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) || - entities.javascript(); - }, - - // - // A Declaration terminator. Note that we use `peek()` to check for '}', - // because the `block` rule will be expecting it, but we still need to make sure - // it's there, if ';' was omitted. - // - end: function () { - return parserInput.$char(';') || parserInput.peek('}'); - }, - - // - // IE's alpha function - // - // alpha(opacity=88) - // - ieAlpha: function () { - var value; - - // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 - if (!parserInput.$re(/^opacity=/i)) { return; } - value = parserInput.$re(/^\d+/); - if (!value) { - value = expect(parsers.entities.variable, 'Could not parse alpha'); - value = '@{' + value.name.slice(1) + '}'; - } - expectChar(')'); - return new tree.Quoted('', 'alpha(opacity=' + value + ')'); - }, - - // - // A Selector Element - // - // div - // + h1 - // #socks - // input[type="text"] - // - // Elements are the building blocks for Selectors, - // they are made out of a `Combinator` (see combinator rule), - // and an element name, such as a tag a class, or `*`. - // - element: function () { - var e, c, v, index = parserInput.i; - - c = this.combinator(); - - e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) || - parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || - parserInput.$char('*') || parserInput.$char('&') || this.attribute() || - parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[\.#:](?=@)/) || - this.entities.variableCurly(); - - if (!e) { - parserInput.save(); - if (parserInput.$char('(')) { - if ((v = this.selector(false)) && parserInput.$char(')')) { - e = new(tree.Paren)(v); - parserInput.forget(); - } else { - parserInput.restore('Missing closing \')\''); - } - } else { - parserInput.forget(); - } - } - - if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); } - }, - - // - // Combinators combine elements together, in a Selector. - // - // Because our parser isn't white-space sensitive, special care - // has to be taken, when parsing the descendant combinator, ` `, - // as it's an empty space. We have to check the previous character - // in the input, to see if it's a ` ` character. More info on how - // we deal with this in *combinator.js*. - // - combinator: function () { - var c = parserInput.currentChar(); - - if (c === '/') { - parserInput.save(); - var slashedCombinator = parserInput.$re(/^\/[a-z]+\//i); - if (slashedCombinator) { - parserInput.forget(); - return new(tree.Combinator)(slashedCombinator); - } - parserInput.restore(); - } - - if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') { - parserInput.i++; - if (c === '^' && parserInput.currentChar() === '^') { - c = '^^'; - parserInput.i++; - } - while (parserInput.isWhitespace()) { parserInput.i++; } - return new(tree.Combinator)(c); - } else if (parserInput.isWhitespace(-1)) { - return new(tree.Combinator)(' '); - } else { - return new(tree.Combinator)(null); - } - }, - // - // A CSS Selector - // with less extensions e.g. the ability to extend and guard - // - // .class > div + h1 - // li a:hover - // - // Selectors are made out of one or more Elements, see above. - // - selector: function (isLess) { - var index = parserInput.i, elements, extendList, c, e, allExtends, when, condition; - isLess = isLess !== false; - while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) { - if (when) { - condition = expect(this.conditions, 'expected condition'); - } else if (condition) { - error('CSS guard can only be used at the end of selector'); - } else if (extendList) { - if (allExtends) { - allExtends = allExtends.concat(extendList); - } else { - allExtends = extendList; - } - } else { - if (allExtends) { error('Extend can only be used at the end of selector'); } - c = parserInput.currentChar(); - if (elements) { - elements.push(e); - } else { - elements = [ e ]; - } - e = null; - } - if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { - break; - } - } - - if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); } - if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); } - }, - selectors: function () { - var s, selectors; - while (true) { - s = this.selector(); - if (!s) { - break; - } - if (selectors) { - selectors.push(s); - } else { - selectors = [ s ]; - } - parserInput.commentStore.length = 0; - if (s.condition && selectors.length > 1) { - error("Guards are only currently allowed on a single selector."); - } - if (!parserInput.$char(',')) { break; } - if (s.condition) { - error("Guards are only currently allowed on a single selector."); - } - parserInput.commentStore.length = 0; - } - return selectors; - }, - attribute: function () { - if (!parserInput.$char('[')) { return; } - - var entities = this.entities, - key, val, op; - - if (!(key = entities.variableCurly())) { - key = expect(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/); - } - - op = parserInput.$re(/^[|~*$^]?=/); - if (op) { - val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly(); - } - - expectChar(']'); - - return new(tree.Attribute)(key, op, val); - }, - - // - // The `block` rule is used by `ruleset` and `mixin.definition`. - // It's a wrapper around the `primary` rule, with added `{}`. - // - block: function () { - var content; - if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) { - return content; - } - }, - - blockRuleset: function() { - var block = this.block(); - - if (block) { - block = new tree.Ruleset(null, block); - } - return block; - }, - - detachedRuleset: function() { - var argInfo, params, variadic; - - parserInput.save(); - if (parserInput.$re(/^[.#]\(/)) { - /** - * DR args currently only implemented for each() function, and not - * yet settable as `@dr: #(@arg) {}` - * This should be done when DRs are merged with mixins. - * See: https://github.com/less/less-meta/issues/16 - */ - argInfo = this.mixin.args(false); - params = argInfo.args; - variadic = argInfo.variadic; - if (!parserInput.$char(')')) { - parserInput.restore(); - return; - } - } - var blockRuleset = this.blockRuleset(); - if (blockRuleset) { - parserInput.forget(); - if (params) { - return new tree.mixin.Definition(null, params, blockRuleset, null, variadic); - } - return new tree.DetachedRuleset(blockRuleset); - } - parserInput.restore(); - }, - - // - // div, .class, body > p {...} - // - ruleset: function () { - var selectors, rules, debugInfo; - - parserInput.save(); - - if (context.dumpLineNumbers) { - debugInfo = getDebugInfo(parserInput.i); - } - - selectors = this.selectors(); - - if (selectors && (rules = this.block())) { - parserInput.forget(); - var ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports); - if (context.dumpLineNumbers) { - ruleset.debugInfo = debugInfo; - } - return ruleset; - } else { - parserInput.restore(); - } - }, - declaration: function () { - var name, value, index = parserInput.i, hasDR, - c = parserInput.currentChar(), important, merge, isVariable; - - if (c === '.' || c === '#' || c === '&' || c === ':') { return; } - - parserInput.save(); - - name = this.variable() || this.ruleProperty(); - if (name) { - isVariable = typeof name === 'string'; - - if (isVariable) { - value = this.detachedRuleset(); - if (value) { - hasDR = true; - } - } - - parserInput.commentStore.length = 0; - if (!value) { - // a name returned by this.ruleProperty() is always an array of the form: - // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] - // where each item is a tree.Keyword or tree.Variable - merge = !isVariable && name.length > 1 && name.pop().value; - - // Custom property values get permissive parsing - if (name[0].value && name[0].value.slice(0, 2) === '--') { - value = this.permissiveValue(); - } - // Try to store values as anonymous - // If we need the value later we'll re-parse it in ruleset.parseValue - else { - value = this.anonymousValue(); - } - if (value) { - parserInput.forget(); - // anonymous values absorb the end ';' which is required for them to work - return new (tree.Declaration)(name, value, false, merge, index, fileInfo); - } - - if (!value) { - value = this.value(); - } - - if (value) { - important = this.important(); - } else if (isVariable) { - // As a last resort, try permissiveValue - value = this.permissiveValue(); - } - } - - if (value && (this.end() || hasDR)) { - parserInput.forget(); - return new (tree.Declaration)(name, value, important, merge, index, fileInfo); - } - else { - parserInput.restore(); - } - } else { - parserInput.restore(); - } - }, - anonymousValue: function () { - var index = parserInput.i; - var match = parserInput.$re(/^([^.#@\$+\/'"*`(;{}-]*);/); - if (match) { - return new(tree.Anonymous)(match[1], index); - } - }, - /** - * Used for custom properties, at-rules, and variables (as fallback) - * Parses almost anything inside of {} [] () "" blocks - * until it reaches outer-most tokens. - * - * First, it will try to parse comments and entities to reach - * the end. This is mostly like the Expression parser except no - * math is allowed. - */ - permissiveValue: function (untilTokens) { - var i, e, done, value, - tok = untilTokens || ';', - index = parserInput.i, result = []; - - function testCurrentChar() { - var char = parserInput.currentChar(); - if (typeof tok === 'string') { - return char === tok; - } else { - return tok.test(char); - } - } - if (testCurrentChar()) { - return; - } - value = []; - do { - e = this.comment(); - if (e) { - value.push(e); - continue; - } - e = this.entity(); - if (e) { - value.push(e); - } - } while (e); - - done = testCurrentChar(); - - if (value.length > 0) { - value = new(tree.Expression)(value); - if (done) { - return value; - } - else { - result.push(value); - } - // Preserve space before $parseUntil as it will not - if (parserInput.prevChar() === ' ') { - result.push(new tree.Anonymous(' ', index)); - } - } - parserInput.save(); - - value = parserInput.$parseUntil(tok); - - if (value) { - if (typeof value === 'string') { - error('Expected \'' + value + '\'', 'Parse'); - } - if (value.length === 1 && value[0] === ' ') { - parserInput.forget(); - return new tree.Anonymous('', index); - } - var item; - for (i = 0; i < value.length; i++) { - item = value[i]; - if (Array.isArray(item)) { - // Treat actual quotes as normal quoted values - result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo)); - } - else { - if (i === value.length - 1) { - item = item.trim(); - } - // Treat like quoted values, but replace vars like unquoted expressions - var quote = new tree.Quoted('\'', item, true, index, fileInfo); - quote.variableRegex = /@([\w-]+)/g; - quote.propRegex = /\$([\w-]+)/g; - result.push(quote); - } - } - parserInput.forget(); - return new tree.Expression(result, true); - } - parserInput.restore(); - }, - - // - // An @import atrule - // - // @import "lib"; - // - // Depending on our environment, importing is done differently: - // In the browser, it's an XHR request, in Node, it would be a - // file-system operation. The function used for importing is - // stored in `import`, which we pass to the Import constructor. - // - 'import': function () { - var path, features, index = parserInput.i; - - var dir = parserInput.$re(/^@import?\s+/); - - if (dir) { - var options = (dir ? this.importOptions() : null) || {}; - - if ((path = this.entities.quoted() || this.entities.url())) { - features = this.mediaFeatures(); - - if (!parserInput.$char(';')) { - parserInput.i = index; - error('missing semi-colon or unrecognised media features on import'); - } - features = features && new(tree.Value)(features); - return new(tree.Import)(path, features, options, index, fileInfo); - } - else { - parserInput.i = index; - error('malformed import statement'); - } - } - }, - - importOptions: function() { - var o, options = {}, optionName, value; - - // list of options, surrounded by parens - if (!parserInput.$char('(')) { return null; } - do { - o = this.importOption(); - if (o) { - optionName = o; - value = true; - switch (optionName) { - case 'css': - optionName = 'less'; - value = false; - break; - case 'once': - optionName = 'multiple'; - value = false; - break; - } - options[optionName] = value; - if (!parserInput.$char(',')) { break; } - } - } while (o); - expectChar(')'); - return options; - }, - - importOption: function() { - var opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/); - if (opt) { - return opt[1]; - } - }, - - mediaFeature: function () { - var entities = this.entities, nodes = [], e, p; - parserInput.save(); - do { - e = entities.keyword() || entities.variable() || entities.mixinLookup(); - if (e) { - nodes.push(e); - } else if (parserInput.$char('(')) { - p = this.property(); - e = this.value(); - if (parserInput.$char(')')) { - if (p && e) { - nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true))); - } else if (e) { - nodes.push(new(tree.Paren)(e)); - } else { - error('badly formed media feature definition'); - } - } else { - error('Missing closing \')\'', 'Parse'); - } - } - } while (e); - - parserInput.forget(); - if (nodes.length > 0) { - return new(tree.Expression)(nodes); - } - }, - - mediaFeatures: function () { - var entities = this.entities, features = [], e; - do { - e = this.mediaFeature(); - if (e) { - features.push(e); - if (!parserInput.$char(',')) { break; } - } else { - e = entities.variable() || entities.mixinLookup(); - if (e) { - features.push(e); - if (!parserInput.$char(',')) { break; } - } - } - } while (e); - - return features.length > 0 ? features : null; - }, - - media: function () { - var features, rules, media, debugInfo, index = parserInput.i; - - if (context.dumpLineNumbers) { - debugInfo = getDebugInfo(index); - } - - parserInput.save(); - - if (parserInput.$str('@media')) { - features = this.mediaFeatures(); - - rules = this.block(); - - if (!rules) { - error('media definitions require block statements after any features'); - } - - parserInput.forget(); - - media = new(tree.Media)(rules, features, index, fileInfo); - if (context.dumpLineNumbers) { - media.debugInfo = debugInfo; - } - - return media; - } - - parserInput.restore(); - }, - - // - - // A @plugin directive, used to import plugins dynamically. - // - // @plugin (args) "lib"; - // - plugin: function () { - var path, args, options, - index = parserInput.i, - dir = parserInput.$re(/^@plugin?\s+/); - - if (dir) { - args = this.pluginArgs(); - - if (args) { - options = { - pluginArgs: args, - isPlugin: true - }; - } - else { - options = { isPlugin: true }; - } - - if ((path = this.entities.quoted() || this.entities.url())) { - - if (!parserInput.$char(';')) { - parserInput.i = index; - error('missing semi-colon on @plugin'); - } - return new(tree.Import)(path, null, options, index, fileInfo); - } - else { - parserInput.i = index; - error('malformed @plugin statement'); - } - } - }, - - pluginArgs: function() { - // list of options, surrounded by parens - parserInput.save(); - if (!parserInput.$char('(')) { - parserInput.restore(); - return null; - } - var args = parserInput.$re(/^\s*([^\);]+)\)\s*/); - if (args[1]) { - parserInput.forget(); - return args[1].trim(); - } - else { - parserInput.restore(); - return null; - } - }, - - // - // A CSS AtRule - // - // @charset "utf-8"; - // - atrule: function () { - var index = parserInput.i, name, value, rules, nonVendorSpecificName, - hasIdentifier, hasExpression, hasUnknown, hasBlock = true, isRooted = true; - - if (parserInput.currentChar() !== '@') { return; } - - value = this['import']() || this.plugin() || this.media(); - if (value) { - return value; - } - - parserInput.save(); - - name = parserInput.$re(/^@[a-z-]+/); - - if (!name) { return; } - - nonVendorSpecificName = name; - if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { - nonVendorSpecificName = '@' + name.slice(name.indexOf('-', 2) + 1); - } - - switch (nonVendorSpecificName) { - case '@charset': - hasIdentifier = true; - hasBlock = false; - break; - case '@namespace': - hasExpression = true; - hasBlock = false; - break; - case '@keyframes': - case '@counter-style': - hasIdentifier = true; - break; - case '@document': - case '@supports': - hasUnknown = true; - isRooted = false; - break; - default: - hasUnknown = true; - break; - } - - parserInput.commentStore.length = 0; - - if (hasIdentifier) { - value = this.entity(); - if (!value) { - error('expected ' + name + ' identifier'); - } - } else if (hasExpression) { - value = this.expression(); - if (!value) { - error('expected ' + name + ' expression'); - } - } else if (hasUnknown) { - value = this.permissiveValue(/^[{;]/); - hasBlock = (parserInput.currentChar() === '{'); - if (!value) { - if (!hasBlock && parserInput.currentChar() !== ';') { - error(name + ' rule is missing block or ending semi-colon'); - } - } - else if (!value.value) { - value = null; - } - } - - if (hasBlock) { - rules = this.blockRuleset(); - } - - if (rules || (!hasBlock && value && parserInput.$char(';'))) { - parserInput.forget(); - return new (tree.AtRule)(name, value, rules, index, fileInfo, - context.dumpLineNumbers ? getDebugInfo(index) : null, - isRooted - ); - } - - parserInput.restore('at-rule options not recognised'); - }, - - // - // A Value is a comma-delimited list of Expressions - // - // font-family: Baskerville, Georgia, serif; - // - // In a Rule, a Value represents everything after the `:`, - // and before the `;`. - // - value: function () { - var e, expressions = [], index = parserInput.i; - - do { - e = this.expression(); - if (e) { - expressions.push(e); - if (!parserInput.$char(',')) { break; } - } - } while (e); - - if (expressions.length > 0) { - return new(tree.Value)(expressions, index); - } - }, - important: function () { - if (parserInput.currentChar() === '!') { - return parserInput.$re(/^! *important/); - } - }, - sub: function () { - var a, e; - - parserInput.save(); - if (parserInput.$char('(')) { - a = this.addition(); - if (a && parserInput.$char(')')) { - parserInput.forget(); - e = new(tree.Expression)([a]); - e.parens = true; - return e; - } - parserInput.restore('Expected \')\''); - return; - } - parserInput.restore(); - }, - multiplication: function () { - var m, a, op, operation, isSpaced; - m = this.operand(); - if (m) { - isSpaced = parserInput.isWhitespace(-1); - while (true) { - if (parserInput.peek(/^\/[*\/]/)) { - break; - } - - parserInput.save(); - - op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./'); - - if (!op) { parserInput.forget(); break; } - - a = this.operand(); - - if (!a) { parserInput.restore(); break; } - parserInput.forget(); - - m.parensInOp = true; - a.parensInOp = true; - operation = new(tree.Operation)(op, [operation || m, a], isSpaced); - isSpaced = parserInput.isWhitespace(-1); - } - return operation || m; - } - }, - addition: function () { - var m, a, op, operation, isSpaced; - m = this.multiplication(); - if (m) { - isSpaced = parserInput.isWhitespace(-1); - while (true) { - op = parserInput.$re(/^[-+]\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-'))); - if (!op) { - break; - } - a = this.multiplication(); - if (!a) { - break; - } - - m.parensInOp = true; - a.parensInOp = true; - operation = new(tree.Operation)(op, [operation || m, a], isSpaced); - isSpaced = parserInput.isWhitespace(-1); - } - return operation || m; - } - }, - conditions: function () { - var a, b, index = parserInput.i, condition; - - a = this.condition(true); - if (a) { - while (true) { - if (!parserInput.peek(/^,\s*(not\s*)?\(/) || !parserInput.$char(',')) { - break; - } - b = this.condition(true); - if (!b) { - break; - } - condition = new(tree.Condition)('or', condition || a, b, index); - } - return condition || a; - } - }, - condition: function (needsParens) { - var result, logical, next; - function or() { - return parserInput.$str('or'); - } - - result = this.conditionAnd(needsParens); - if (!result) { - return ; - } - logical = or(); - if (logical) { - next = this.condition(needsParens); - if (next) { - result = new(tree.Condition)(logical, result, next); - } else { - return ; - } - } - return result; - }, - conditionAnd: function (needsParens) { - var result, logical, next, self = this; - function insideCondition() { - var cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens); - if (!cond && !needsParens) { - return self.atomicCondition(needsParens); - } - return cond; - } - function and() { - return parserInput.$str('and'); - } - - result = insideCondition(); - if (!result) { - return ; - } - logical = and(); - if (logical) { - next = this.conditionAnd(needsParens); - if (next) { - result = new(tree.Condition)(logical, result, next); - } else { - return ; - } - } - return result; - }, - negatedCondition: function (needsParens) { - if (parserInput.$str('not')) { - var result = this.parenthesisCondition(needsParens); - if (result) { - result.negate = !result.negate; - } - return result; - } - }, - parenthesisCondition: function (needsParens) { - function tryConditionFollowedByParenthesis(me) { - var body; - parserInput.save(); - body = me.condition(needsParens); - if (!body) { - parserInput.restore(); - return ; - } - if (!parserInput.$char(')')) { - parserInput.restore(); - return ; - } - parserInput.forget(); - return body; - } - - var body; - parserInput.save(); - if (!parserInput.$str('(')) { - parserInput.restore(); - return ; - } - body = tryConditionFollowedByParenthesis(this); - if (body) { - parserInput.forget(); - return body; - } - - body = this.atomicCondition(needsParens); - if (!body) { - parserInput.restore(); - return ; - } - if (!parserInput.$char(')')) { - parserInput.restore('expected \')\' got \'' + parserInput.currentChar() + '\''); - return ; - } - parserInput.forget(); - return body; - }, - atomicCondition: function (needsParens) { - var entities = this.entities, index = parserInput.i, a, b, c, op; - - function cond() { - return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup(); - } - cond = cond.bind(this); - - a = cond(); - if (a) { - if (parserInput.$char('>')) { - if (parserInput.$char('=')) { - op = '>='; - } else { - op = '>'; - } - } else - if (parserInput.$char('<')) { - if (parserInput.$char('=')) { - op = '<='; - } else { - op = '<'; - } - } else - if (parserInput.$char('=')) { - if (parserInput.$char('>')) { - op = '=>'; - } else if (parserInput.$char('<')) { - op = '=<'; - } else { - op = '='; - } - } - if (op) { - b = cond(); - if (b) { - c = new(tree.Condition)(op, a, b, index, false); - } else { - error('expected expression'); - } - } else { - c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false); - } - return c; - } - }, - - // - // An operand is anything that can be part of an operation, - // such as a Color, or a Variable - // - operand: function () { - var entities = this.entities, negate; - - if (parserInput.peek(/^-[@\$\(]/)) { - negate = parserInput.$char('-'); - } - - var o = this.sub() || entities.dimension() || - entities.color() || entities.variable() || - entities.property() || entities.call() || - entities.quoted(true) || entities.colorKeyword() || - entities.mixinLookup(); - - if (negate) { - o.parensInOp = true; - o = new(tree.Negative)(o); - } - - return o; - }, - - // - // Expressions either represent mathematical operations, - // or white-space delimited Entities. - // - // 1px solid black - // @var * 2 - // - expression: function () { - var entities = [], e, delim, index = parserInput.i; - - do { - e = this.comment(); - if (e) { - entities.push(e); - continue; - } - e = this.addition() || this.entity(); - if (e) { - entities.push(e); - // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here - if (!parserInput.peek(/^\/[\/*]/)) { - delim = parserInput.$char('/'); - if (delim) { - entities.push(new(tree.Anonymous)(delim, index)); - } - } - } - } while (e); - if (entities.length > 0) { - return new(tree.Expression)(entities); - } - }, - property: function () { - var name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/); - if (name) { - return name[1]; - } - }, - ruleProperty: function () { - var name = [], index = [], s, k; - - parserInput.save(); - - var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/); - if (simpleProperty) { - name = [new(tree.Keyword)(simpleProperty[1])]; - parserInput.forget(); - return name; - } - - function match(re) { - var i = parserInput.i, - chunk = parserInput.$re(re); - if (chunk) { - index.push(i); - return name.push(chunk[1]); - } - } - - match(/^(\*?)/); - while (true) { - if (!match(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/)) { - break; - } - } - - if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) { - parserInput.forget(); - - // at last, we have the complete match now. move forward, - // convert name particles to tree objects and return: - if (name[0] === '') { - name.shift(); - index.shift(); - } - for (k = 0; k < name.length; k++) { - s = name[k]; - name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ? - new(tree.Keyword)(s) : - (s.charAt(0) === '@' ? - new(tree.Variable)('@' + s.slice(2, -1), index[k], fileInfo) : - new(tree.Property)('$' + s.slice(2, -1), index[k], fileInfo)); - } - return name; - } - parserInput.restore(); - } - } - }; -}; -Parser.serializeVars = function(vars) { - var s = ''; - - for (var name in vars) { - if (Object.hasOwnProperty.call(vars, name)) { - var value = vars[name]; - s += ((name[0] === '@') ? '' : '@') + name + ': ' + value + - ((String(value).slice(-1) === ';') ? '' : ';'); - } - } - - return s; -}; - -module.exports = Parser; - -},{"../functions/function-registry":26,"../less-error":37,"../tree":67,"../utils":89,"../visitors":93,"./parser-input":43}],45:[function(require,module,exports){ -/** - * Plugin Manager - */ -var PluginManager = function(less) { - this.less = less; - this.visitors = []; - this.preProcessors = []; - this.postProcessors = []; - this.installedPlugins = []; - this.fileManagers = []; - this.iterator = -1; - this.pluginCache = {}; - this.Loader = new less.PluginLoader(less); -}; - -var pm, PluginManagerFactory = function(less, newFactory) { - if (newFactory || !pm) { - pm = new PluginManager(less); - } - return pm; - }; - -/** - * Adds all the plugins in the array - * @param {Array} plugins - */ -PluginManager.prototype.addPlugins = function(plugins) { - if (plugins) { - for (var i = 0; i < plugins.length; i++) { - this.addPlugin(plugins[i]); - } - } -}; -/** - * - * @param plugin - * @param {String} filename - */ -PluginManager.prototype.addPlugin = function(plugin, filename, functionRegistry) { - this.installedPlugins.push(plugin); - if (filename) { - this.pluginCache[filename] = plugin; - } - if (plugin.install) { - plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry); - } -}; -/** - * - * @param filename - */ -PluginManager.prototype.get = function(filename) { - return this.pluginCache[filename]; -}; - -/** - * Adds a visitor. The visitor object has options on itself to determine - * when it should run. - * @param visitor - */ -PluginManager.prototype.addVisitor = function(visitor) { - this.visitors.push(visitor); -}; -/** - * Adds a pre processor object - * @param {object} preProcessor - * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import - */ -PluginManager.prototype.addPreProcessor = function(preProcessor, priority) { - var indexToInsertAt; - for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) { - if (this.preProcessors[indexToInsertAt].priority >= priority) { - break; - } - } - this.preProcessors.splice(indexToInsertAt, 0, {preProcessor: preProcessor, priority: priority}); -}; -/** - * Adds a post processor object - * @param {object} postProcessor - * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression - */ -PluginManager.prototype.addPostProcessor = function(postProcessor, priority) { - var indexToInsertAt; - for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) { - if (this.postProcessors[indexToInsertAt].priority >= priority) { - break; - } - } - this.postProcessors.splice(indexToInsertAt, 0, {postProcessor: postProcessor, priority: priority}); -}; -/** - * - * @param manager - */ -PluginManager.prototype.addFileManager = function(manager) { - this.fileManagers.push(manager); -}; -/** - * - * @returns {Array} - * @private - */ -PluginManager.prototype.getPreProcessors = function() { - var preProcessors = []; - for (var i = 0; i < this.preProcessors.length; i++) { - preProcessors.push(this.preProcessors[i].preProcessor); - } - return preProcessors; -}; -/** - * - * @returns {Array} - * @private - */ -PluginManager.prototype.getPostProcessors = function() { - var postProcessors = []; - for (var i = 0; i < this.postProcessors.length; i++) { - postProcessors.push(this.postProcessors[i].postProcessor); - } - return postProcessors; -}; -/** - * - * @returns {Array} - * @private - */ -PluginManager.prototype.getVisitors = function() { - return this.visitors; -}; - -PluginManager.prototype.visitor = function() { - var self = this; - return { - first: function() { - self.iterator = -1; - return self.visitors[self.iterator]; - }, - get: function() { - self.iterator += 1; - return self.visitors[self.iterator]; - } - }; -}; -/** - * - * @returns {Array} - * @private - */ -PluginManager.prototype.getFileManagers = function() { - return this.fileManagers; -}; - -// -module.exports = PluginManagerFactory; - -},{}],46:[function(require,module,exports){ -var PromiseConstructor, - utils = require('./utils'); - -module.exports = function(environment, ParseTree, ImportManager) { - var render = function (input, options, callback) { - if (typeof options === 'function') { - callback = options; - options = utils.copyOptions(this.options, {}); - } - else { - options = utils.copyOptions(this.options, options || {}); - } - - if (!callback) { - if (!PromiseConstructor) { - PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise; - } - var self = this; - return new PromiseConstructor(function (resolve, reject) { - render.call(self, input, options, function(err, output) { - if (err) { - reject(err); - } else { - resolve(output); - } - }); - }); - } else { - this.parse(input, options, function(err, root, imports, options) { - if (err) { return callback(err); } - - var result; - try { - var parseTree = new ParseTree(root, imports); - result = parseTree.toCSS(options); - } - catch (err) { return callback(err); } - - callback(null, result); - }); - } - }; - - return render; -}; - -},{"./utils":89,"promise":undefined}],47:[function(require,module,exports){ -module.exports = function (SourceMapOutput, environment) { - - var SourceMapBuilder = function (options) { - this.options = options; - }; - - SourceMapBuilder.prototype.toCSS = function(rootNode, options, imports) { - var sourceMapOutput = new SourceMapOutput( - { - contentsIgnoredCharsMap: imports.contentsIgnoredChars, - rootNode: rootNode, - contentsMap: imports.contents, - sourceMapFilename: this.options.sourceMapFilename, - sourceMapURL: this.options.sourceMapURL, - outputFilename: this.options.sourceMapOutputFilename, - sourceMapBasepath: this.options.sourceMapBasepath, - sourceMapRootpath: this.options.sourceMapRootpath, - outputSourceFiles: this.options.outputSourceFiles, - sourceMapGenerator: this.options.sourceMapGenerator, - sourceMapFileInline: this.options.sourceMapFileInline - }); - - var css = sourceMapOutput.toCSS(options); - this.sourceMap = sourceMapOutput.sourceMap; - this.sourceMapURL = sourceMapOutput.sourceMapURL; - if (this.options.sourceMapInputFilename) { - this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename); - } - if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) { - this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL); - } - return css + this.getCSSAppendage(); - }; - - SourceMapBuilder.prototype.getCSSAppendage = function() { - - var sourceMapURL = this.sourceMapURL; - if (this.options.sourceMapFileInline) { - if (this.sourceMap === undefined) { - return ''; - } - sourceMapURL = 'data:application/json;base64,' + environment.encodeBase64(this.sourceMap); - } - - if (sourceMapURL) { - return '/*# sourceMappingURL=' + sourceMapURL + ' */'; - } - return ''; - }; - - SourceMapBuilder.prototype.getExternalSourceMap = function() { - return this.sourceMap; - }; - SourceMapBuilder.prototype.setExternalSourceMap = function(sourceMap) { - this.sourceMap = sourceMap; - }; - - SourceMapBuilder.prototype.isInline = function() { - return this.options.sourceMapFileInline; - }; - SourceMapBuilder.prototype.getSourceMapURL = function() { - return this.sourceMapURL; - }; - SourceMapBuilder.prototype.getOutputFilename = function() { - return this.options.sourceMapOutputFilename; - }; - SourceMapBuilder.prototype.getInputFilename = function() { - return this.sourceMapInputFilename; - }; - - return SourceMapBuilder; -}; - -},{}],48:[function(require,module,exports){ -module.exports = function (environment) { - - var SourceMapOutput = function (options) { - this._css = []; - this._rootNode = options.rootNode; - this._contentsMap = options.contentsMap; - this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap; - if (options.sourceMapFilename) { - this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/'); - } - this._outputFilename = options.outputFilename; - this.sourceMapURL = options.sourceMapURL; - if (options.sourceMapBasepath) { - this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/'); - } - if (options.sourceMapRootpath) { - this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/'); - if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') { - this._sourceMapRootpath += '/'; - } - } else { - this._sourceMapRootpath = ''; - } - this._outputSourceFiles = options.outputSourceFiles; - this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator(); - - this._lineNumber = 0; - this._column = 0; - }; - - SourceMapOutput.prototype.removeBasepath = function(path) { - if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) { - path = path.substring(this._sourceMapBasepath.length); - if (path.charAt(0) === '\\' || path.charAt(0) === '/') { - path = path.substring(1); - } - } - - return path; - }; - - SourceMapOutput.prototype.normalizeFilename = function(filename) { - filename = filename.replace(/\\/g, '/'); - filename = this.removeBasepath(filename); - return (this._sourceMapRootpath || '') + filename; - }; - - SourceMapOutput.prototype.add = function(chunk, fileInfo, index, mapLines) { - - // ignore adding empty strings - if (!chunk) { - return; - } - - var lines, - sourceLines, - columns, - sourceColumns, - i; - - if (fileInfo) { - var inputSource = this._contentsMap[fileInfo.filename]; - - // remove vars/banner added to the top of the file - if (this._contentsIgnoredCharsMap[fileInfo.filename]) { - // adjust the index - index -= this._contentsIgnoredCharsMap[fileInfo.filename]; - if (index < 0) { index = 0; } - // adjust the source - inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]); - } - inputSource = inputSource.substring(0, index); - sourceLines = inputSource.split('\n'); - sourceColumns = sourceLines[sourceLines.length - 1]; - } - - lines = chunk.split('\n'); - columns = lines[lines.length - 1]; - - if (fileInfo) { - if (!mapLines) { - this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column}, - original: { line: sourceLines.length, column: sourceColumns.length}, - source: this.normalizeFilename(fileInfo.filename)}); - } else { - for (i = 0; i < lines.length; i++) { - this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0}, - original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0}, - source: this.normalizeFilename(fileInfo.filename)}); - } - } - } - - if (lines.length === 1) { - this._column += columns.length; - } else { - this._lineNumber += lines.length - 1; - this._column = columns.length; - } - - this._css.push(chunk); - }; - - SourceMapOutput.prototype.isEmpty = function() { - return this._css.length === 0; - }; - - SourceMapOutput.prototype.toCSS = function(context) { - this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null }); - - if (this._outputSourceFiles) { - for (var filename in this._contentsMap) { - if (this._contentsMap.hasOwnProperty(filename)) { - var source = this._contentsMap[filename]; - if (this._contentsIgnoredCharsMap[filename]) { - source = source.slice(this._contentsIgnoredCharsMap[filename]); - } - this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source); - } - } - } - - this._rootNode.genCSS(context, this); - - if (this._css.length > 0) { - var sourceMapURL, - sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON()); - - if (this.sourceMapURL) { - sourceMapURL = this.sourceMapURL; - } else if (this._sourceMapFilename) { - sourceMapURL = this._sourceMapFilename; - } - this.sourceMapURL = sourceMapURL; - - this.sourceMap = sourceMapContent; - } - - return this._css.join(''); - }; - - return SourceMapOutput; -}; - -},{}],49:[function(require,module,exports){ -var contexts = require('./contexts'), - visitor = require('./visitors'), - tree = require('./tree'); - -module.exports = function(root, options) { - options = options || {}; - var evaldRoot, - variables = options.variables, - evalEnv = new contexts.Eval(options); - - // - // Allows setting variables with a hash, so: - // - // `{ color: new tree.Color('#f01') }` will become: - // - // new tree.Declaration('@color', - // new tree.Value([ - // new tree.Expression([ - // new tree.Color('#f01') - // ]) - // ]) - // ) - // - if (typeof variables === 'object' && !Array.isArray(variables)) { - variables = Object.keys(variables).map(function (k) { - var value = variables[k]; - - if (!(value instanceof tree.Value)) { - if (!(value instanceof tree.Expression)) { - value = new tree.Expression([value]); - } - value = new tree.Value([value]); - } - return new tree.Declaration('@' + k, value, false, null, 0); - }); - evalEnv.frames = [new tree.Ruleset(null, variables)]; - } - - var visitors = [ - new visitor.JoinSelectorVisitor(), - new visitor.MarkVisibleSelectorsVisitor(true), - new visitor.ExtendVisitor(), - new visitor.ToCSSVisitor({compress: Boolean(options.compress)}) - ], preEvalVisitors = [], v, visitorIterator; - - /** - * first() / get() allows visitors to be added while visiting - * - * @todo Add scoping for visitors just like functions for @plugin; right now they're global - */ - if (options.pluginManager) { - visitorIterator = options.pluginManager.visitor(); - for (var i = 0; i < 2; i++) { - visitorIterator.first(); - while ((v = visitorIterator.get())) { - if (v.isPreEvalVisitor) { - if (i === 0 || preEvalVisitors.indexOf(v) === -1) { - preEvalVisitors.push(v); - v.run(root); - } - } - else { - if (i === 0 || visitors.indexOf(v) === -1) { - if (v.isPreVisitor) { - visitors.unshift(v); - } - else { - visitors.push(v); - } - } - } - } - } - } - - evaldRoot = root.eval(evalEnv); - - for (var i = 0; i < visitors.length; i++) { - visitors[i].run(evaldRoot); - } - - // Run any remaining visitors added after eval pass - if (options.pluginManager) { - visitorIterator.first(); - while ((v = visitorIterator.get())) { - if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) { - v.run(evaldRoot); - } - } - } - - return evaldRoot; -}; - -},{"./contexts":12,"./tree":67,"./visitors":93}],50:[function(require,module,exports){ -var Node = require('./node'); - -var Anonymous = function (value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { - this.value = value; - this._index = index; - this._fileInfo = currentFileInfo; - this.mapLines = mapLines; - this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; - this.allowRoot = true; - this.copyVisibilityInfo(visibilityInfo); -}; -Anonymous.prototype = new Node(); -Anonymous.prototype.type = 'Anonymous'; -Anonymous.prototype.eval = function () { - return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); -}; -Anonymous.prototype.compare = function (other) { - return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; -}; -Anonymous.prototype.isRulesetLike = function() { - return this.rulesetLike; -}; -Anonymous.prototype.genCSS = function (context, output) { - this.nodeVisible = Boolean(this.value); - if (this.nodeVisible) { - output.add(this.value, this._fileInfo, this._index, this.mapLines); - } -}; -module.exports = Anonymous; - -},{"./node":76}],51:[function(require,module,exports){ -var Node = require('./node'); - -var Assignment = function (key, val) { - this.key = key; - this.value = val; -}; - -Assignment.prototype = new Node(); -Assignment.prototype.type = 'Assignment'; -Assignment.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); -}; -Assignment.prototype.eval = function (context) { - if (this.value.eval) { - return new Assignment(this.key, this.value.eval(context)); - } - return this; -}; -Assignment.prototype.genCSS = function (context, output) { - output.add(this.key + '='); - if (this.value.genCSS) { - this.value.genCSS(context, output); - } else { - output.add(this.value); - } -}; -module.exports = Assignment; - -},{"./node":76}],52:[function(require,module,exports){ -var Node = require('./node'), - Selector = require('./selector'), - Ruleset = require('./ruleset'), - Anonymous = require('./anonymous'); - -var AtRule = function (name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { - var i; - - this.name = name; - this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); - if (rules) { - if (Array.isArray(rules)) { - this.rules = rules; - } else { - this.rules = [rules]; - this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); - } - for (i = 0; i < this.rules.length; i++) { - this.rules[i].allowImports = true; - } - this.setParent(this.rules, this); - } - this._index = index; - this._fileInfo = currentFileInfo; - this.debugInfo = debugInfo; - this.isRooted = isRooted || false; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; -}; - -AtRule.prototype = new Node(); -AtRule.prototype.type = 'AtRule'; -AtRule.prototype.accept = function (visitor) { - var value = this.value, rules = this.rules; - if (rules) { - this.rules = visitor.visitArray(rules); - } - if (value) { - this.value = visitor.visit(value); - } -}; -AtRule.prototype.isRulesetLike = function() { - return this.rules || !this.isCharset(); -}; -AtRule.prototype.isCharset = function() { - return '@charset' === this.name; -}; -AtRule.prototype.genCSS = function (context, output) { - var value = this.value, rules = this.rules; - output.add(this.name, this.fileInfo(), this.getIndex()); - if (value) { - output.add(' '); - value.genCSS(context, output); - } - if (rules) { - this.outputRuleset(context, output, rules); - } else { - output.add(';'); - } -}; -AtRule.prototype.eval = function (context) { - var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; - - // media stored inside other atrule should not bubble over it - // backpup media bubbling information - mediaPathBackup = context.mediaPath; - mediaBlocksBackup = context.mediaBlocks; - // deleted media bubbling information - context.mediaPath = []; - context.mediaBlocks = []; - - if (value) { - value = value.eval(context); - } - if (rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - rules = [rules[0].eval(context)]; - rules[0].root = true; - } - // restore media bubbling information - context.mediaPath = mediaPathBackup; - context.mediaBlocks = mediaBlocksBackup; - - return new AtRule(this.name, value, rules, - this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); -}; -AtRule.prototype.variable = function (name) { - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.variable.call(this.rules[0], name); - } -}; -AtRule.prototype.find = function () { - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.find.apply(this.rules[0], arguments); - } -}; -AtRule.prototype.rulesets = function () { - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.rulesets.apply(this.rules[0]); - } -}; -AtRule.prototype.outputRuleset = function (context, output, rules) { - var ruleCnt = rules.length, i; - context.tabLevel = (context.tabLevel | 0) + 1; - - // Compressed - if (context.compress) { - output.add('{'); - for (i = 0; i < ruleCnt; i++) { - rules[i].genCSS(context, output); - } - output.add('}'); - context.tabLevel--; - return; - } - - // Non-compressed - var tabSetStr = '\n' + Array(context.tabLevel).join(' '), tabRuleStr = tabSetStr + ' '; - if (!ruleCnt) { - output.add(' {' + tabSetStr + '}'); - } else { - output.add(' {' + tabRuleStr); - rules[0].genCSS(context, output); - for (i = 1; i < ruleCnt; i++) { - output.add(tabRuleStr); - rules[i].genCSS(context, output); - } - output.add(tabSetStr + '}'); - } - - context.tabLevel--; -}; -module.exports = AtRule; - -},{"./anonymous":50,"./node":76,"./ruleset":81,"./selector":82}],53:[function(require,module,exports){ -var Node = require('./node'); - -var Attribute = function (key, op, value) { - this.key = key; - this.op = op; - this.value = value; -}; -Attribute.prototype = new Node(); -Attribute.prototype.type = 'Attribute'; -Attribute.prototype.eval = function (context) { - return new Attribute(this.key.eval ? this.key.eval(context) : this.key, - this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); -}; -Attribute.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context)); -}; -Attribute.prototype.toCSS = function (context) { - var value = this.key.toCSS ? this.key.toCSS(context) : this.key; - - if (this.op) { - value += this.op; - value += (this.value.toCSS ? this.value.toCSS(context) : this.value); - } - - return '[' + value + ']'; -}; -module.exports = Attribute; - -},{"./node":76}],54:[function(require,module,exports){ -var Node = require('./node'), - Anonymous = require('./anonymous'), - FunctionCaller = require('../functions/function-caller'); -// -// A function call node. -// -var Call = function (name, args, index, currentFileInfo) { - this.name = name; - this.args = args; - this.calc = name === 'calc'; - this._index = index; - this._fileInfo = currentFileInfo; -}; -Call.prototype = new Node(); -Call.prototype.type = 'Call'; -Call.prototype.accept = function (visitor) { - if (this.args) { - this.args = visitor.visitArray(this.args); - } -}; -// -// When evaluating a function call, -// we either find the function in the functionRegistry, -// in which case we call it, passing the evaluated arguments, -// if this returns null or we cannot find the function, we -// simply print it out as it appeared originally [2]. -// -// The reason why we evaluate the arguments, is in the case where -// we try to pass a variable to a function, like: `saturate(@color)`. -// The function should receive the value, not the variable. -// -Call.prototype.eval = function (context) { - /** - * Turn off math for calc(), and switch back on for evaluating nested functions - */ - var currentMathContext = context.mathOn; - context.mathOn = !this.calc; - if (this.calc || context.inCalc) { - context.enterCalc(); - } - var args = this.args.map(function (a) { return a.eval(context); }); - if (this.calc || context.inCalc) { - context.exitCalc(); - } - context.mathOn = currentMathContext; - - var result, funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo()); - - if (funcCaller.isValid()) { - try { - result = funcCaller.call(args); - } catch (e) { - throw { - type: e.type || 'Runtime', - message: 'error evaluating function `' + this.name + '`' + - (e.message ? ': ' + e.message : ''), - index: this.getIndex(), - filename: this.fileInfo().filename, - line: e.lineNumber, - column: e.columnNumber - }; - } - - if (result !== null && result !== undefined) { - // Results that that are not nodes are cast as Anonymous nodes - // Falsy values or booleans are returned as empty nodes - if (!(result instanceof Node)) { - if (!result || result === true) { - result = new Anonymous(null); - } - else { - result = new Anonymous(result.toString()); - } - - } - result._index = this._index; - result._fileInfo = this._fileInfo; - return result; - } - - } - - return new Call(this.name, args, this.getIndex(), this.fileInfo()); -}; -Call.prototype.genCSS = function (context, output) { - output.add(this.name + '(', this.fileInfo(), this.getIndex()); - - for (var i = 0; i < this.args.length; i++) { - this.args[i].genCSS(context, output); - if (i + 1 < this.args.length) { - output.add(', '); - } - } - - output.add(')'); -}; -module.exports = Call; - -},{"../functions/function-caller":25,"./anonymous":50,"./node":76}],55:[function(require,module,exports){ -var Node = require('./node'), - colors = require('../data/colors'); - -// -// RGB Colors - #ff0014, #eee -// -var Color = function (rgb, a, originalForm) { - // - // The end goal here, is to parse the arguments - // into an integer triplet, such as `128, 255, 0` - // - // This facilitates operations and conversions. - // - if (Array.isArray(rgb)) { - this.rgb = rgb; - } else if (rgb.length == 6) { - this.rgb = rgb.match(/.{2}/g).map(function (c) { - return parseInt(c, 16); - }); - } else { - this.rgb = rgb.split('').map(function (c) { - return parseInt(c + c, 16); - }); - } - this.alpha = typeof a === 'number' ? a : 1; - if (typeof originalForm !== 'undefined') { - this.value = originalForm; - } -}; - -Color.prototype = new Node(); -Color.prototype.type = 'Color'; - -function clamp(v, max) { - return Math.min(Math.max(v, 0), max); -} - -function toHex(v) { - return '#' + v.map(function (c) { - c = clamp(Math.round(c), 255); - return (c < 16 ? '0' : '') + c.toString(16); - }).join(''); -} - -Color.prototype.luma = function () { - var r = this.rgb[0] / 255, - g = this.rgb[1] / 255, - b = this.rgb[2] / 255; - - r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); - g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); - b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); - - return 0.2126 * r + 0.7152 * g + 0.0722 * b; -}; -Color.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context)); -}; -Color.prototype.toCSS = function (context, doNotCompress) { - var compress = context && context.compress && !doNotCompress, color, alpha; - - // `value` is set if this color was originally - // converted from a named color string so we need - // to respect this and try to output named color too. - if (this.value) { - return this.value; - } - - // If we have some transparency, the only way to represent it - // is via `rgba`. Otherwise, we use the hex representation, - // which has better compatibility with older browsers. - // Values are capped between `0` and `255`, rounded and zero-padded. - alpha = this.fround(context, this.alpha); - if (alpha < 1) { - return 'rgba(' + this.rgb.map(function (c) { - return clamp(Math.round(c), 255); - }).concat(clamp(alpha, 1)) - .join(',' + (compress ? '' : ' ')) + ')'; - } - - color = this.toRGB(); - - if (compress) { - var splitcolor = color.split(''); - - // Convert color to short format - if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) { - color = '#' + splitcolor[1] + splitcolor[3] + splitcolor[5]; - } - } - - return color; -}; - -// -// Operations have to be done per-channel, if not, -// channels will spill onto each other. Once we have -// our result, in the form of an integer triplet, -// we create a new Color node to hold the result. -// -Color.prototype.operate = function (context, op, other) { - var rgb = new Array(3); - var alpha = this.alpha * (1 - other.alpha) + other.alpha; - for (var c = 0; c < 3; c++) { - rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); - } - return new Color(rgb, alpha); -}; -Color.prototype.toRGB = function () { - return toHex(this.rgb); -}; -Color.prototype.toHSL = function () { - var r = this.rgb[0] / 255, - g = this.rgb[1] / 255, - b = this.rgb[2] / 255, - a = this.alpha; - - var max = Math.max(r, g, b), min = Math.min(r, g, b); - var h, s, l = (max + min) / 2, d = max - min; - - if (max === min) { - h = s = 0; - } else { - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - - switch (max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - h /= 6; - } - return { h: h * 360, s: s, l: l, a: a }; -}; -// Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript -Color.prototype.toHSV = function () { - var r = this.rgb[0] / 255, - g = this.rgb[1] / 255, - b = this.rgb[2] / 255, - a = this.alpha; - - var max = Math.max(r, g, b), min = Math.min(r, g, b); - var h, s, v = max; - - var d = max - min; - if (max === 0) { - s = 0; - } else { - s = d / max; - } - - if (max === min) { - h = 0; - } else { - switch (max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - h /= 6; - } - return { h: h * 360, s: s, v: v, a: a }; -}; -Color.prototype.toARGB = function () { - return toHex([this.alpha * 255].concat(this.rgb)); -}; -Color.prototype.compare = function (x) { - return (x.rgb && - x.rgb[0] === this.rgb[0] && - x.rgb[1] === this.rgb[1] && - x.rgb[2] === this.rgb[2] && - x.alpha === this.alpha) ? 0 : undefined; -}; - -Color.fromKeyword = function(keyword) { - var c, key = keyword.toLowerCase(); - if (colors.hasOwnProperty(key)) { - c = new Color(colors[key].slice(1)); - } - else if (key === 'transparent') { - c = new Color([0, 0, 0], 0); - } - - if (c) { - c.value = keyword; - return c; - } -}; -module.exports = Color; - -},{"../data/colors":13,"./node":76}],56:[function(require,module,exports){ -var Node = require('./node'); - -var Combinator = function (value) { - if (value === ' ') { - this.value = ' '; - this.emptyOrWhitespace = true; - } else { - this.value = value ? value.trim() : ''; - this.emptyOrWhitespace = this.value === ''; - } -}; -Combinator.prototype = new Node(); -Combinator.prototype.type = 'Combinator'; -var _noSpaceCombinators = { - '': true, - ' ': true, - '|': true -}; -Combinator.prototype.genCSS = function (context, output) { - var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; - output.add(spaceOrEmpty + this.value + spaceOrEmpty); -}; -module.exports = Combinator; - -},{"./node":76}],57:[function(require,module,exports){ -var Node = require('./node'), - getDebugInfo = require('./debug-info'); - -var Comment = function (value, isLineComment, index, currentFileInfo) { - this.value = value; - this.isLineComment = isLineComment; - this._index = index; - this._fileInfo = currentFileInfo; - this.allowRoot = true; -}; -Comment.prototype = new Node(); -Comment.prototype.type = 'Comment'; -Comment.prototype.genCSS = function (context, output) { - if (this.debugInfo) { - output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex()); - } - output.add(this.value); -}; -Comment.prototype.isSilent = function(context) { - var isCompressed = context.compress && this.value[2] !== '!'; - return this.isLineComment || isCompressed; -}; -module.exports = Comment; - -},{"./debug-info":59,"./node":76}],58:[function(require,module,exports){ -var Node = require('./node'); - -var Condition = function (op, l, r, i, negate) { - this.op = op.trim(); - this.lvalue = l; - this.rvalue = r; - this._index = i; - this.negate = negate; -}; -Condition.prototype = new Node(); -Condition.prototype.type = 'Condition'; -Condition.prototype.accept = function (visitor) { - this.lvalue = visitor.visit(this.lvalue); - this.rvalue = visitor.visit(this.rvalue); -}; -Condition.prototype.eval = function (context) { - var result = (function (op, a, b) { - switch (op) { - case 'and': return a && b; - case 'or': return a || b; - default: - switch (Node.compare(a, b)) { - case -1: - return op === '<' || op === '=<' || op === '<='; - case 0: - return op === '=' || op === '>=' || op === '=<' || op === '<='; - case 1: - return op === '>' || op === '>='; - default: - return false; - } - } - })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)); - - return this.negate ? !result : result; -}; -module.exports = Condition; - -},{"./node":76}],59:[function(require,module,exports){ -var debugInfo = function(context, ctx, lineSeparator) { - var result = ''; - if (context.dumpLineNumbers && !context.compress) { - switch (context.dumpLineNumbers) { - case 'comments': - result = debugInfo.asComment(ctx); - break; - case 'mediaquery': - result = debugInfo.asMediaQuery(ctx); - break; - case 'all': - result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx); - break; - } - } - return result; -}; - -debugInfo.asComment = function(ctx) { - return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n'; -}; - -debugInfo.asMediaQuery = function(ctx) { - var filenameWithProtocol = ctx.debugInfo.fileName; - if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) { - filenameWithProtocol = 'file://' + filenameWithProtocol; - } - return '@media -sass-debug-info{filename{font-family:' + - filenameWithProtocol.replace(/([.:\/\\])/g, function (a) { - if (a == '\\') { - a = '\/'; - } - return '\\' + a; - }) + - '}line{font-family:\\00003' + ctx.debugInfo.lineNumber + '}}\n'; -}; - -module.exports = debugInfo; - -},{}],60:[function(require,module,exports){ -var Node = require('./node'), - Value = require('./value'), - Keyword = require('./keyword'), - Anonymous = require('./anonymous'), - MATH = require('../math-constants'); - -var Declaration = function (name, value, important, merge, index, currentFileInfo, inline, variable) { - this.name = name; - this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); - this.important = important ? ' ' + important.trim() : ''; - this.merge = merge; - this._index = index; - this._fileInfo = currentFileInfo; - this.inline = inline || false; - this.variable = (variable !== undefined) ? variable - : (name.charAt && (name.charAt(0) === '@')); - this.allowRoot = true; - this.setParent(this.value, this); -}; - -function evalName(context, name) { - var value = '', i, n = name.length, - output = {add: function (s) {value += s;}}; - for (i = 0; i < n; i++) { - name[i].eval(context).genCSS(context, output); - } - return value; -} - -Declaration.prototype = new Node(); -Declaration.prototype.type = 'Declaration'; -Declaration.prototype.genCSS = function (context, output) { - output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); - try { - this.value.genCSS(context, output); - } - catch (e) { - e.index = this._index; - e.filename = this._fileInfo.filename; - throw e; - } - output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); -}; -Declaration.prototype.eval = function (context) { - var mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable; - if (typeof name !== 'string') { - // expand 'primitive' name directly to get - // things faster (~10% for benchmark.less): - name = (name.length === 1) && (name[0] instanceof Keyword) ? - name[0].value : evalName(context, name); - variable = false; // never treat expanded interpolation as new variable name - } - - // @todo remove when parens-division is default - if (name === 'font' && context.math === MATH.ALWAYS) { - mathBypass = true; - prevMath = context.math; - context.math = MATH.PARENS_DIVISION; - } - try { - context.importantScope.push({}); - evaldValue = this.value.eval(context); - - if (!this.variable && evaldValue.type === 'DetachedRuleset') { - throw { message: 'Rulesets cannot be evaluated on a property.', - index: this.getIndex(), filename: this.fileInfo().filename }; - } - var important = this.important, - importantResult = context.importantScope.pop(); - if (!important && importantResult.important) { - important = importantResult.important; - } - - return new Declaration(name, - evaldValue, - important, - this.merge, - this.getIndex(), this.fileInfo(), this.inline, - variable); - } - catch (e) { - if (typeof e.index !== 'number') { - e.index = this.getIndex(); - e.filename = this.fileInfo().filename; - } - throw e; - } - finally { - if (mathBypass) { - context.math = prevMath; - } - } -}; -Declaration.prototype.makeImportant = function () { - return new Declaration(this.name, - this.value, - '!important', - this.merge, - this.getIndex(), this.fileInfo(), this.inline); -}; - -module.exports = Declaration; -},{"../math-constants":39,"./anonymous":50,"./keyword":70,"./node":76,"./value":86}],61:[function(require,module,exports){ -var Node = require('./node'), - contexts = require('../contexts'), - utils = require('../utils'); - -var DetachedRuleset = function (ruleset, frames) { - this.ruleset = ruleset; - this.frames = frames; - this.setParent(this.ruleset, this); -}; -DetachedRuleset.prototype = new Node(); -DetachedRuleset.prototype.type = 'DetachedRuleset'; -DetachedRuleset.prototype.evalFirst = true; -DetachedRuleset.prototype.accept = function (visitor) { - this.ruleset = visitor.visit(this.ruleset); -}; -DetachedRuleset.prototype.eval = function (context) { - var frames = this.frames || utils.copyArray(context.frames); - return new DetachedRuleset(this.ruleset, frames); -}; -DetachedRuleset.prototype.callEval = function (context) { - return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); -}; -module.exports = DetachedRuleset; - -},{"../contexts":12,"../utils":89,"./node":76}],62:[function(require,module,exports){ -var Node = require('./node'), - unitConversions = require('../data/unit-conversions'), - Unit = require('./unit'), - Color = require('./color'); - -// -// A number with a unit -// -var Dimension = function (value, unit) { - this.value = parseFloat(value); - if (isNaN(this.value)) { - throw new Error('Dimension is not a number.'); - } - this.unit = (unit && unit instanceof Unit) ? unit : - new Unit(unit ? [unit] : undefined); - this.setParent(this.unit, this); -}; - -Dimension.prototype = new Node(); -Dimension.prototype.type = 'Dimension'; -Dimension.prototype.accept = function (visitor) { - this.unit = visitor.visit(this.unit); -}; -Dimension.prototype.eval = function (context) { - return this; -}; -Dimension.prototype.toColor = function () { - return new Color([this.value, this.value, this.value]); -}; -Dimension.prototype.genCSS = function (context, output) { - if ((context && context.strictUnits) && !this.unit.isSingular()) { - throw new Error('Multiple units in dimension. Correct the units or use the unit function. Bad unit: ' + this.unit.toString()); - } - - var value = this.fround(context, this.value), - strValue = String(value); - - if (value !== 0 && value < 0.000001 && value > -0.000001) { - // would be output 1e-6 etc. - strValue = value.toFixed(20).replace(/0+$/, ''); - } - - if (context && context.compress) { - // Zero values doesn't need a unit - if (value === 0 && this.unit.isLength()) { - output.add(strValue); - return; - } - - // Float values doesn't need a leading zero - if (value > 0 && value < 1) { - strValue = (strValue).substr(1); - } - } - - output.add(strValue); - this.unit.genCSS(context, output); -}; - -// In an operation between two Dimensions, -// we default to the first Dimension's unit, -// so `1px + 2` will yield `3px`. -Dimension.prototype.operate = function (context, op, other) { - /* jshint noempty:false */ - var value = this._operate(context, op, this.value, other.value), - unit = this.unit.clone(); - - if (op === '+' || op === '-') { - if (unit.numerator.length === 0 && unit.denominator.length === 0) { - unit = other.unit.clone(); - if (this.unit.backupUnit) { - unit.backupUnit = this.unit.backupUnit; - } - } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) { - // do nothing - } else { - other = other.convertTo(this.unit.usedUnits()); - - if (context.strictUnits && other.unit.toString() !== unit.toString()) { - throw new Error('Incompatible units. Change the units or use the unit function. Bad units: \'' + unit.toString() + - '\' and \'' + other.unit.toString() + '\'.'); - } - - value = this._operate(context, op, this.value, other.value); - } - } else if (op === '*') { - unit.numerator = unit.numerator.concat(other.unit.numerator).sort(); - unit.denominator = unit.denominator.concat(other.unit.denominator).sort(); - unit.cancel(); - } else if (op === '/') { - unit.numerator = unit.numerator.concat(other.unit.denominator).sort(); - unit.denominator = unit.denominator.concat(other.unit.numerator).sort(); - unit.cancel(); - } - return new Dimension(value, unit); -}; -Dimension.prototype.compare = function (other) { - var a, b; - - if (!(other instanceof Dimension)) { - return undefined; - } - - if (this.unit.isEmpty() || other.unit.isEmpty()) { - a = this; - b = other; - } else { - a = this.unify(); - b = other.unify(); - if (a.unit.compare(b.unit) !== 0) { - return undefined; - } - } - - return Node.numericCompare(a.value, b.value); -}; -Dimension.prototype.unify = function () { - return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); -}; -Dimension.prototype.convertTo = function (conversions) { - var value = this.value, unit = this.unit.clone(), - i, groupName, group, targetUnit, derivedConversions = {}, applyUnit; - - if (typeof conversions === 'string') { - for (i in unitConversions) { - if (unitConversions[i].hasOwnProperty(conversions)) { - derivedConversions = {}; - derivedConversions[i] = conversions; - } - } - conversions = derivedConversions; - } - applyUnit = function (atomicUnit, denominator) { - /* jshint loopfunc:true */ - if (group.hasOwnProperty(atomicUnit)) { - if (denominator) { - value = value / (group[atomicUnit] / group[targetUnit]); - } else { - value = value * (group[atomicUnit] / group[targetUnit]); - } - - return targetUnit; - } - - return atomicUnit; - }; - - for (groupName in conversions) { - if (conversions.hasOwnProperty(groupName)) { - targetUnit = conversions[groupName]; - group = unitConversions[groupName]; - - unit.map(applyUnit); - } - } - - unit.cancel(); - - return new Dimension(value, unit); -}; -module.exports = Dimension; - -},{"../data/unit-conversions":15,"./color":55,"./node":76,"./unit":84}],63:[function(require,module,exports){ -var Node = require('./node'), - Paren = require('./paren'), - Combinator = require('./combinator'); - -var Element = function (combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { - this.combinator = combinator instanceof Combinator ? - combinator : new Combinator(combinator); - - if (typeof value === 'string') { - this.value = value.trim(); - } else if (value) { - this.value = value; - } else { - this.value = ''; - } - this.isVariable = isVariable; - this._index = index; - this._fileInfo = currentFileInfo; - this.copyVisibilityInfo(visibilityInfo); - this.setParent(this.combinator, this); -}; -Element.prototype = new Node(); -Element.prototype.type = 'Element'; -Element.prototype.accept = function (visitor) { - var value = this.value; - this.combinator = visitor.visit(this.combinator); - if (typeof value === 'object') { - this.value = visitor.visit(value); - } -}; -Element.prototype.eval = function (context) { - return new Element(this.combinator, - this.value.eval ? this.value.eval(context) : this.value, - this.isVariable, - this.getIndex(), - this.fileInfo(), this.visibilityInfo()); -}; -Element.prototype.clone = function () { - return new Element(this.combinator, - this.value, - this.isVariable, - this.getIndex(), - this.fileInfo(), this.visibilityInfo()); -}; -Element.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); -}; -Element.prototype.toCSS = function (context) { - context = context || {}; - var value = this.value, firstSelector = context.firstSelector; - if (value instanceof Paren) { - // selector in parens should not be affected by outer selector - // flags (breaks only interpolated selectors - see #1973) - context.firstSelector = true; - } - value = value.toCSS ? value.toCSS(context) : value; - context.firstSelector = firstSelector; - if (value === '' && this.combinator.value.charAt(0) === '&') { - return ''; - } else { - return this.combinator.toCSS(context) + value; - } -}; -module.exports = Element; - -},{"./combinator":56,"./node":76,"./paren":78}],64:[function(require,module,exports){ -var Node = require('./node'), - Paren = require('./paren'), - Comment = require('./comment'), - Dimension = require('./dimension'), - MATH = require('../math-constants'); - -var Expression = function (value, noSpacing) { - this.value = value; - this.noSpacing = noSpacing; - if (!value) { - throw new Error('Expression requires an array parameter'); - } -}; -Expression.prototype = new Node(); -Expression.prototype.type = 'Expression'; -Expression.prototype.accept = function (visitor) { - this.value = visitor.visitArray(this.value); -}; -Expression.prototype.eval = function (context) { - var returnValue, - mathOn = context.isMathOn(), - inParenthesis = this.parens && - (context.math !== MATH.STRICT_LEGACY || !this.parensInOp), - doubleParen = false; - if (inParenthesis) { - context.inParenthesis(); - } - if (this.value.length > 1) { - returnValue = new Expression(this.value.map(function (e) { - if (!e.eval) { - return e; - } - return e.eval(context); - }), this.noSpacing); - } else if (this.value.length === 1) { - if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) { - doubleParen = true; - } - returnValue = this.value[0].eval(context); - } else { - returnValue = this; - } - if (inParenthesis) { - context.outOfParenthesis(); - } - if (this.parens && this.parensInOp && !mathOn && !doubleParen - && (!(returnValue instanceof Dimension))) { - returnValue = new Paren(returnValue); - } - return returnValue; -}; -Expression.prototype.genCSS = function (context, output) { - for (var i = 0; i < this.value.length; i++) { - this.value[i].genCSS(context, output); - if (!this.noSpacing && i + 1 < this.value.length) { - output.add(' '); - } - } -}; -Expression.prototype.throwAwayComments = function () { - this.value = this.value.filter(function(v) { - return !(v instanceof Comment); - }); -}; -module.exports = Expression; - -},{"../math-constants":39,"./comment":57,"./dimension":62,"./node":76,"./paren":78}],65:[function(require,module,exports){ -var Node = require('./node'), - Selector = require('./selector'); - -var Extend = function Extend(selector, option, index, currentFileInfo, visibilityInfo) { - this.selector = selector; - this.option = option; - this.object_id = Extend.next_id++; - this.parent_ids = [this.object_id]; - this._index = index; - this._fileInfo = currentFileInfo; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; - - switch (option) { - case 'all': - this.allowBefore = true; - this.allowAfter = true; - break; - default: - this.allowBefore = false; - this.allowAfter = false; - break; - } - this.setParent(this.selector, this); -}; -Extend.next_id = 0; - -Extend.prototype = new Node(); -Extend.prototype.type = 'Extend'; -Extend.prototype.accept = function (visitor) { - this.selector = visitor.visit(this.selector); -}; -Extend.prototype.eval = function (context) { - return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); -}; -Extend.prototype.clone = function (context) { - return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); -}; -// it concatenates (joins) all selectors in selector array -Extend.prototype.findSelfSelectors = function (selectors) { - var selfElements = [], - i, - selectorElements; - - for (i = 0; i < selectors.length; i++) { - selectorElements = selectors[i].elements; - // duplicate the logic in genCSS function inside the selector node. - // future TODO - move both logics into the selector joiner visitor - if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') { - selectorElements[0].combinator.value = ' '; - } - selfElements = selfElements.concat(selectors[i].elements); - } - - this.selfSelectors = [new Selector(selfElements)]; - this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); -}; -module.exports = Extend; - -},{"./node":76,"./selector":82}],66:[function(require,module,exports){ -var Node = require('./node'), - Media = require('./media'), - URL = require('./url'), - Quoted = require('./quoted'), - Ruleset = require('./ruleset'), - Anonymous = require('./anonymous'), - utils = require('../utils'), - LessError = require('../less-error'); - -// -// CSS @import node -// -// The general strategy here is that we don't want to wait -// for the parsing to be completed, before we start importing -// the file. That's because in the context of a browser, -// most of the time will be spent waiting for the server to respond. -// -// On creation, we push the import path to our import queue, though -// `import,push`, we also pass it a callback, which it'll call once -// the file has been fetched, and parsed. -// -var Import = function (path, features, options, index, currentFileInfo, visibilityInfo) { - this.options = options; - this._index = index; - this._fileInfo = currentFileInfo; - this.path = path; - this.features = features; - this.allowRoot = true; - - if (this.options.less !== undefined || this.options.inline) { - this.css = !this.options.less || this.options.inline; - } else { - var pathValue = this.getPath(); - if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { - this.css = true; - } - } - this.copyVisibilityInfo(visibilityInfo); - this.setParent(this.features, this); - this.setParent(this.path, this); -}; - -// -// The actual import node doesn't return anything, when converted to CSS. -// The reason is that it's used at the evaluation stage, so that the rules -// it imports can be treated like any other rules. -// -// In `eval`, we make sure all Import nodes get evaluated, recursively, so -// we end up with a flat structure, which can easily be imported in the parent -// ruleset. -// -Import.prototype = new Node(); -Import.prototype.type = 'Import'; -Import.prototype.accept = function (visitor) { - if (this.features) { - this.features = visitor.visit(this.features); - } - this.path = visitor.visit(this.path); - if (!this.options.isPlugin && !this.options.inline && this.root) { - this.root = visitor.visit(this.root); - } -}; -Import.prototype.genCSS = function (context, output) { - if (this.css && this.path._fileInfo.reference === undefined) { - output.add('@import ', this._fileInfo, this._index); - this.path.genCSS(context, output); - if (this.features) { - output.add(' '); - this.features.genCSS(context, output); - } - output.add(';'); - } -}; -Import.prototype.getPath = function () { - return (this.path instanceof URL) ? - this.path.value.value : this.path.value; -}; -Import.prototype.isVariableImport = function () { - var path = this.path; - if (path instanceof URL) { - path = path.value; - } - if (path instanceof Quoted) { - return path.containsVariables(); - } - - return true; -}; -Import.prototype.evalForImport = function (context) { - var path = this.path; - - if (path instanceof URL) { - path = path.value; - } - - return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); -}; -Import.prototype.evalPath = function (context) { - var path = this.path.eval(context); - var rootpath = this._fileInfo && this._fileInfo.rootpath; - - if (!(path instanceof URL)) { - if (rootpath) { - var pathValue = path.value; - // Add the base path if the import is relative - if (pathValue && context.isPathRelative(pathValue)) { - path.value = rootpath + pathValue; - } - } - path.value = context.normalizePath(path.value); - } - - return path; -}; -Import.prototype.eval = function (context) { - var result = this.doEval(context); - if (this.options.reference || this.blocksVisibility()) { - if (result.length || result.length === 0) { - result.forEach(function (node) { - node.addVisibilityBlock(); - } - ); - } else { - result.addVisibilityBlock(); - } - } - return result; -}; -Import.prototype.doEval = function (context) { - var ruleset, registry, - features = this.features && this.features.eval(context); - - if (this.options.isPlugin) { - if (this.root && this.root.eval) { - try { - this.root.eval(context); - } - catch (e) { - e.message = 'Plugin error during evaluation'; - throw new LessError(e, this.root.imports, this.root.filename); - } - } - registry = context.frames[0] && context.frames[0].functionRegistry; - if ( registry && this.root && this.root.functions ) { - registry.addMultiple( this.root.functions ); - } - - return []; - } - - if (this.skip) { - if (typeof this.skip === 'function') { - this.skip = this.skip(); - } - if (this.skip) { - return []; - } - } - if (this.options.inline) { - var contents = new Anonymous(this.root, 0, - { - filename: this.importedFilename, - reference: this.path._fileInfo && this.path._fileInfo.reference - }, true, true); - - return this.features ? new Media([contents], this.features.value) : [contents]; - } else if (this.css) { - var newImport = new Import(this.evalPath(context), features, this.options, this._index); - if (!newImport.css && this.error) { - throw this.error; - } - return newImport; - } else { - ruleset = new Ruleset(null, utils.copyArray(this.root.rules)); - ruleset.evalImports(context); - - return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules; - } -}; -module.exports = Import; - -},{"../less-error":37,"../utils":89,"./anonymous":50,"./media":71,"./node":76,"./quoted":80,"./ruleset":81,"./url":85}],67:[function(require,module,exports){ -var tree = Object.create(null); - -tree.Node = require('./node'); -tree.Color = require('./color'); -tree.AtRule = require('./atrule'); -tree.DetachedRuleset = require('./detached-ruleset'); -tree.Operation = require('./operation'); -tree.Dimension = require('./dimension'); -tree.Unit = require('./unit'); -tree.Keyword = require('./keyword'); -tree.Variable = require('./variable'); -tree.Property = require('./property'); -tree.Ruleset = require('./ruleset'); -tree.Element = require('./element'); -tree.Attribute = require('./attribute'); -tree.Combinator = require('./combinator'); -tree.Selector = require('./selector'); -tree.Quoted = require('./quoted'); -tree.Expression = require('./expression'); -tree.Declaration = require('./declaration'); -tree.Call = require('./call'); -tree.URL = require('./url'); -tree.Import = require('./import'); -tree.mixin = { - Call: require('./mixin-call'), - Definition: require('./mixin-definition') -}; -tree.Comment = require('./comment'); -tree.Anonymous = require('./anonymous'); -tree.Value = require('./value'); -tree.JavaScript = require('./javascript'); -tree.Assignment = require('./assignment'); -tree.Condition = require('./condition'); -tree.Paren = require('./paren'); -tree.Media = require('./media'); -tree.UnicodeDescriptor = require('./unicode-descriptor'); -tree.Negative = require('./negative'); -tree.Extend = require('./extend'); -tree.VariableCall = require('./variable-call'); -tree.NamespaceValue = require('./namespace-value'); - -module.exports = tree; - -},{"./anonymous":50,"./assignment":51,"./atrule":52,"./attribute":53,"./call":54,"./color":55,"./combinator":56,"./comment":57,"./condition":58,"./declaration":60,"./detached-ruleset":61,"./dimension":62,"./element":63,"./expression":64,"./extend":65,"./import":66,"./javascript":68,"./keyword":70,"./media":71,"./mixin-call":72,"./mixin-definition":73,"./namespace-value":74,"./negative":75,"./node":76,"./operation":77,"./paren":78,"./property":79,"./quoted":80,"./ruleset":81,"./selector":82,"./unicode-descriptor":83,"./unit":84,"./url":85,"./value":86,"./variable":88,"./variable-call":87}],68:[function(require,module,exports){ -var JsEvalNode = require('./js-eval-node'), - Dimension = require('./dimension'), - Quoted = require('./quoted'), - Anonymous = require('./anonymous'); - -var JavaScript = function (string, escaped, index, currentFileInfo) { - this.escaped = escaped; - this.expression = string; - this._index = index; - this._fileInfo = currentFileInfo; -}; -JavaScript.prototype = new JsEvalNode(); -JavaScript.prototype.type = 'JavaScript'; -JavaScript.prototype.eval = function(context) { - var result = this.evaluateJavaScript(this.expression, context); - var type = typeof result; - - if (type === 'number' && !isNaN(result)) { - return new Dimension(result); - } else if (type === 'string') { - return new Quoted('"' + result + '"', result, this.escaped, this._index); - } else if (Array.isArray(result)) { - return new Anonymous(result.join(', ')); - } else { - return new Anonymous(result); - } -}; - -module.exports = JavaScript; - -},{"./anonymous":50,"./dimension":62,"./js-eval-node":69,"./quoted":80}],69:[function(require,module,exports){ -var Node = require('./node'), - Variable = require('./variable'); - -var JsEvalNode = function() { -}; -JsEvalNode.prototype = new Node(); - -JsEvalNode.prototype.evaluateJavaScript = function (expression, context) { - var result, - that = this, - evalContext = {}; - - if (!context.javascriptEnabled) { - throw { message: 'Inline JavaScript is not enabled. Is it set in your options?', - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - - expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) { - return that.jsify(new Variable('@' + name, that.getIndex(), that.fileInfo()).eval(context)); - }); - - try { - expression = new Function('return (' + expression + ')'); - } catch (e) { - throw { message: 'JavaScript evaluation error: ' + e.message + ' from `' + expression + '`' , - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - - var variables = context.frames[0].variables(); - for (var k in variables) { - if (variables.hasOwnProperty(k)) { - /* jshint loopfunc:true */ - evalContext[k.slice(1)] = { - value: variables[k].value, - toJS: function () { - return this.value.eval(context).toCSS(); - } - }; - } - } - - try { - result = expression.call(evalContext); - } catch (e) { - throw { message: 'JavaScript evaluation error: \'' + e.name + ': ' + e.message.replace(/["]/g, '\'') + '\'' , - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - return result; -}; -JsEvalNode.prototype.jsify = function (obj) { - if (Array.isArray(obj.value) && (obj.value.length > 1)) { - return '[' + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + ']'; - } else { - return obj.toCSS(); - } -}; - -module.exports = JsEvalNode; - -},{"./node":76,"./variable":88}],70:[function(require,module,exports){ -var Node = require('./node'); - -var Keyword = function (value) { this.value = value; }; -Keyword.prototype = new Node(); -Keyword.prototype.type = 'Keyword'; -Keyword.prototype.genCSS = function (context, output) { - if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; } - output.add(this.value); -}; - -Keyword.True = new Keyword('true'); -Keyword.False = new Keyword('false'); - -module.exports = Keyword; - -},{"./node":76}],71:[function(require,module,exports){ -var Ruleset = require('./ruleset'), - Value = require('./value'), - Selector = require('./selector'), - Anonymous = require('./anonymous'), - Expression = require('./expression'), - AtRule = require('./atrule'), - utils = require('../utils'); - -var Media = function (value, features, index, currentFileInfo, visibilityInfo) { - this._index = index; - this._fileInfo = currentFileInfo; - - var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors(); - - this.features = new Value(features); - this.rules = [new Ruleset(selectors, value)]; - this.rules[0].allowImports = true; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; - this.setParent(selectors, this); - this.setParent(this.features, this); - this.setParent(this.rules, this); -}; -Media.prototype = new AtRule(); -Media.prototype.type = 'Media'; -Media.prototype.isRulesetLike = function() { return true; }; -Media.prototype.accept = function (visitor) { - if (this.features) { - this.features = visitor.visit(this.features); - } - if (this.rules) { - this.rules = visitor.visitArray(this.rules); - } -}; -Media.prototype.genCSS = function (context, output) { - output.add('@media ', this._fileInfo, this._index); - this.features.genCSS(context, output); - this.outputRuleset(context, output, this.rules); -}; -Media.prototype.eval = function (context) { - if (!context.mediaBlocks) { - context.mediaBlocks = []; - context.mediaPath = []; - } - - var media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo()); - if (this.debugInfo) { - this.rules[0].debugInfo = this.debugInfo; - media.debugInfo = this.debugInfo; - } - - media.features = this.features.eval(context); - - context.mediaPath.push(media); - context.mediaBlocks.push(media); - - this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit(); - context.frames.unshift(this.rules[0]); - media.rules = [this.rules[0].eval(context)]; - context.frames.shift(); - - context.mediaPath.pop(); - - return context.mediaPath.length === 0 ? media.evalTop(context) : - media.evalNested(context); -}; -Media.prototype.evalTop = function (context) { - var result = this; - - // Render all dependent Media blocks. - if (context.mediaBlocks.length > 1) { - var selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors(); - result = new Ruleset(selectors, context.mediaBlocks); - result.multiMedia = true; - result.copyVisibilityInfo(this.visibilityInfo()); - this.setParent(result, this); - } - - delete context.mediaBlocks; - delete context.mediaPath; - - return result; -}; -Media.prototype.evalNested = function (context) { - var i, value, - path = context.mediaPath.concat([this]); - - // Extract the media-query conditions separated with `,` (OR). - for (i = 0; i < path.length; i++) { - value = path[i].features instanceof Value ? - path[i].features.value : path[i].features; - path[i] = Array.isArray(value) ? value : [value]; - } - - // Trace all permutations to generate the resulting media-query. - // - // (a, b and c) with nested (d, e) -> - // a and d - // a and e - // b and c and d - // b and c and e - this.features = new Value(this.permute(path).map(function (path) { - path = path.map(function (fragment) { - return fragment.toCSS ? fragment : new Anonymous(fragment); - }); - - for (i = path.length - 1; i > 0; i--) { - path.splice(i, 0, new Anonymous('and')); - } - - return new Expression(path); - })); - this.setParent(this.features, this); - - // Fake a tree-node that doesn't output anything. - return new Ruleset([], []); -}; -Media.prototype.permute = function (arr) { - if (arr.length === 0) { - return []; - } else if (arr.length === 1) { - return arr[0]; - } else { - var result = []; - var rest = this.permute(arr.slice(1)); - for (var i = 0; i < rest.length; i++) { - for (var j = 0; j < arr[0].length; j++) { - result.push([arr[0][j]].concat(rest[i])); - } - } - return result; - } -}; -Media.prototype.bubbleSelectors = function (selectors) { - if (!selectors) { - return; - } - this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])]; - this.setParent(this.rules, this); -}; -module.exports = Media; - -},{"../utils":89,"./anonymous":50,"./atrule":52,"./expression":64,"./ruleset":81,"./selector":82,"./value":86}],72:[function(require,module,exports){ -var Node = require('./node'), - Selector = require('./selector'), - MixinDefinition = require('./mixin-definition'), - defaultFunc = require('../functions/default'); - -var MixinCall = function (elements, args, index, currentFileInfo, important) { - this.selector = new Selector(elements); - this.arguments = args || []; - this._index = index; - this._fileInfo = currentFileInfo; - this.important = important; - this.allowRoot = true; - this.setParent(this.selector, this); -}; -MixinCall.prototype = new Node(); -MixinCall.prototype.type = 'MixinCall'; -MixinCall.prototype.accept = function (visitor) { - if (this.selector) { - this.selector = visitor.visit(this.selector); - } - if (this.arguments.length) { - this.arguments = visitor.visitArray(this.arguments); - } -}; -MixinCall.prototype.eval = function (context) { - var mixins, mixin, mixinPath, args = [], arg, argValue, - rules = [], match = false, i, m, f, isRecursive, isOneFound, - candidates = [], candidate, conditionResult = [], defaultResult, defFalseEitherCase = -1, - defNone = 0, defTrue = 1, defFalse = 2, count, originalRuleset, noArgumentsFilter; - - this.selector = this.selector.eval(context); - - function calcDefGroup(mixin, mixinPath) { - var f, p, namespace; - - for (f = 0; f < 2; f++) { - conditionResult[f] = true; - defaultFunc.value(f); - for (p = 0; p < mixinPath.length && conditionResult[f]; p++) { - namespace = mixinPath[p]; - if (namespace.matchCondition) { - conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context); - } - } - if (mixin.matchCondition) { - conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context); - } - } - if (conditionResult[0] || conditionResult[1]) { - if (conditionResult[0] != conditionResult[1]) { - return conditionResult[1] ? - defTrue : defFalse; - } - - return defNone; - } - return defFalseEitherCase; - } - - for (i = 0; i < this.arguments.length; i++) { - arg = this.arguments[i]; - argValue = arg.value.eval(context); - if (arg.expand && Array.isArray(argValue.value)) { - argValue = argValue.value; - for (m = 0; m < argValue.length; m++) { - args.push({value: argValue[m]}); - } - } else { - args.push({name: arg.name, value: argValue}); - } - } - - noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);}; - - for (i = 0; i < context.frames.length; i++) { - if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) { - isOneFound = true; - - // To make `default()` function independent of definition order we have two "subpasses" here. - // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), - // and build candidate list with corresponding flags. Then, when we know all possible matches, - // we make a final decision. - - for (m = 0; m < mixins.length; m++) { - mixin = mixins[m].rule; - mixinPath = mixins[m].path; - isRecursive = false; - for (f = 0; f < context.frames.length; f++) { - if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) { - isRecursive = true; - break; - } - } - if (isRecursive) { - continue; - } - - if (mixin.matchArgs(args, context)) { - candidate = {mixin: mixin, group: calcDefGroup(mixin, mixinPath)}; - - if (candidate.group !== defFalseEitherCase) { - candidates.push(candidate); - } - - match = true; - } - } - - defaultFunc.reset(); - - count = [0, 0, 0]; - for (m = 0; m < candidates.length; m++) { - count[candidates[m].group]++; - } - - if (count[defNone] > 0) { - defaultResult = defFalse; - } else { - defaultResult = defTrue; - if ((count[defTrue] + count[defFalse]) > 1) { - throw { type: 'Runtime', - message: 'Ambiguous use of `default()` found when matching for `' + this.format(args) + '`', - index: this.getIndex(), filename: this.fileInfo().filename }; - } - } - - for (m = 0; m < candidates.length; m++) { - candidate = candidates[m].group; - if ((candidate === defNone) || (candidate === defaultResult)) { - try { - mixin = candidates[m].mixin; - if (!(mixin instanceof MixinDefinition)) { - originalRuleset = mixin.originalRuleset || mixin; - mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo()); - mixin.originalRuleset = originalRuleset; - } - var newRules = mixin.evalCall(context, args, this.important).rules; - this._setVisibilityToReplacement(newRules); - Array.prototype.push.apply(rules, newRules); - } catch (e) { - throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack }; - } - } - } - - if (match) { - return rules; - } - } - } - if (isOneFound) { - throw { type: 'Runtime', - message: 'No matching definition was found for `' + this.format(args) + '`', - index: this.getIndex(), filename: this.fileInfo().filename }; - } else { - throw { type: 'Name', - message: this.selector.toCSS().trim() + ' is undefined', - index: this.getIndex(), filename: this.fileInfo().filename }; - } -}; - -MixinCall.prototype._setVisibilityToReplacement = function (replacement) { - var i, rule; - if (this.blocksVisibility()) { - for (i = 0; i < replacement.length; i++) { - rule = replacement[i]; - rule.addVisibilityBlock(); - } - } -}; -MixinCall.prototype.format = function (args) { - return this.selector.toCSS().trim() + '(' + - (args ? args.map(function (a) { - var argValue = ''; - if (a.name) { - argValue += a.name + ':'; - } - if (a.value.toCSS) { - argValue += a.value.toCSS(); - } else { - argValue += '???'; - } - return argValue; - }).join(', ') : '') + ')'; -}; -module.exports = MixinCall; - -},{"../functions/default":24,"./mixin-definition":73,"./node":76,"./selector":82}],73:[function(require,module,exports){ -var Selector = require('./selector'), - Element = require('./element'), - Ruleset = require('./ruleset'), - Declaration = require('./declaration'), - DetachedRuleset = require('./detached-ruleset'), - Expression = require('./expression'), - contexts = require('../contexts'), - utils = require('../utils'); - -var Definition = function (name, params, rules, condition, variadic, frames, visibilityInfo) { - this.name = name || 'anonymous mixin'; - this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])]; - this.params = params; - this.condition = condition; - this.variadic = variadic; - this.arity = params.length; - this.rules = rules; - this._lookups = {}; - var optionalParameters = []; - this.required = params.reduce(function (count, p) { - if (!p.name || (p.name && !p.value)) { - return count + 1; - } - else { - optionalParameters.push(p.name); - return count; - } - }, 0); - this.optionalParameters = optionalParameters; - this.frames = frames; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; -}; -Definition.prototype = new Ruleset(); -Definition.prototype.type = 'MixinDefinition'; -Definition.prototype.evalFirst = true; -Definition.prototype.accept = function (visitor) { - if (this.params && this.params.length) { - this.params = visitor.visitArray(this.params); - } - this.rules = visitor.visitArray(this.rules); - if (this.condition) { - this.condition = visitor.visit(this.condition); - } -}; -Definition.prototype.evalParams = function (context, mixinEnv, args, evaldArguments) { - /* jshint boss:true */ - var frame = new Ruleset(null, null), - varargs, arg, - params = utils.copyArray(this.params), - i, j, val, name, isNamedFound, argIndex, argsLength = 0; - - if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) { - frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit(); - } - mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames)); - - if (args) { - args = utils.copyArray(args); - argsLength = args.length; - - for (i = 0; i < argsLength; i++) { - arg = args[i]; - if (name = (arg && arg.name)) { - isNamedFound = false; - for (j = 0; j < params.length; j++) { - if (!evaldArguments[j] && name === params[j].name) { - evaldArguments[j] = arg.value.eval(context); - frame.prependRule(new Declaration(name, arg.value.eval(context))); - isNamedFound = true; - break; - } - } - if (isNamedFound) { - args.splice(i, 1); - i--; - continue; - } else { - throw { type: 'Runtime', message: 'Named argument for ' + this.name + - ' ' + args[i].name + ' not found' }; - } - } - } - } - argIndex = 0; - for (i = 0; i < params.length; i++) { - if (evaldArguments[i]) { continue; } - - arg = args && args[argIndex]; - - if (name = params[i].name) { - if (params[i].variadic) { - varargs = []; - for (j = argIndex; j < argsLength; j++) { - varargs.push(args[j].value.eval(context)); - } - frame.prependRule(new Declaration(name, new Expression(varargs).eval(context))); - } else { - val = arg && arg.value; - if (val) { - // This was a mixin call, pass in a detached ruleset of it's eval'd rules - if (Array.isArray(val)) { - val = new DetachedRuleset(new Ruleset('', val)); - } - else { - val = val.eval(context); - } - } else if (params[i].value) { - val = params[i].value.eval(mixinEnv); - frame.resetCache(); - } else { - throw { type: 'Runtime', message: 'wrong number of arguments for ' + this.name + - ' (' + argsLength + ' for ' + this.arity + ')' }; - } - - frame.prependRule(new Declaration(name, val)); - evaldArguments[i] = val; - } - } - - if (params[i].variadic && args) { - for (j = argIndex; j < argsLength; j++) { - evaldArguments[j] = args[j].value.eval(context); - } - } - argIndex++; - } - - return frame; -}; -Definition.prototype.makeImportant = function() { - var rules = !this.rules ? this.rules : this.rules.map(function (r) { - if (r.makeImportant) { - return r.makeImportant(true); - } else { - return r; - } - }); - var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); - return result; -}; -Definition.prototype.eval = function (context) { - return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames)); -}; -Definition.prototype.evalCall = function (context, args, important) { - var _arguments = [], - mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames, - frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments), - rules, ruleset; - - frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context))); - - rules = utils.copyArray(this.rules); - - ruleset = new Ruleset(null, rules); - ruleset.originalRuleset = this; - ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames))); - if (important) { - ruleset = ruleset.makeImportant(); - } - return ruleset; -}; -Definition.prototype.matchCondition = function (args, context) { - if (this.condition && !this.condition.eval( - new contexts.Eval(context, - [this.evalParams(context, /* the parameter variables */ - new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] - .concat(this.frames || []) // the parent namespace/mixin frames - .concat(context.frames)))) { // the current environment frames - return false; - } - return true; -}; -Definition.prototype.matchArgs = function (args, context) { - var allArgsCnt = (args && args.length) || 0, len, optionalParameters = this.optionalParameters; - var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) { - if (optionalParameters.indexOf(p.name) < 0) { - return count + 1; - } else { - return count; - } - }, 0); - - if (!this.variadic) { - if (requiredArgsCnt < this.required) { - return false; - } - if (allArgsCnt > this.params.length) { - return false; - } - } else { - if (requiredArgsCnt < (this.required - 1)) { - return false; - } - } - - // check patterns - len = Math.min(requiredArgsCnt, this.arity); - - for (var i = 0; i < len; i++) { - if (!this.params[i].name && !this.params[i].variadic) { - if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) { - return false; - } - } - } - return true; -}; -module.exports = Definition; - -},{"../contexts":12,"../utils":89,"./declaration":60,"./detached-ruleset":61,"./element":63,"./expression":64,"./ruleset":81,"./selector":82}],74:[function(require,module,exports){ -var Node = require('./node'), - Variable = require('./variable'), - Ruleset = require('./ruleset'), - Selector = require('./selector'); - -var NamespaceValue = function (ruleCall, lookups, important, index, fileInfo) { - this.value = ruleCall; - this.lookups = lookups; - this.important = important; - this._index = index; - this._fileInfo = fileInfo; -}; -NamespaceValue.prototype = new Node(); -NamespaceValue.prototype.type = 'NamespaceValue'; -NamespaceValue.prototype.eval = function (context) { - var i, j, name, rules = this.value.eval(context); - - for (i = 0; i < this.lookups.length; i++) { - name = this.lookups[i]; - - /** - * Eval'd DRs return rulesets. - * Eval'd mixins return rules, so let's make a ruleset if we need it. - * We need to do this because of late parsing of values - */ - if (Array.isArray(rules)) { - rules = new Ruleset([new Selector()], rules); - } - - if (name === '') { - rules = rules.lastDeclaration(); - } - else if (name.charAt(0) === '@') { - if (name.charAt(1) === '@') { - name = '@' + new Variable(name.substr(1)).eval(context).value; - } - if (rules.variables) { - rules = rules.variable(name); - } - - if (!rules) { - throw { type: 'Name', - message: 'variable ' + name + ' not found', - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - } - else { - if (name.substring(0, 2) === '$@') { - name = '$' + new Variable(name.substr(1)).eval(context).value; - } - else { - name = name.charAt(0) === '$' ? name : '$' + name; - } - if (rules.properties) { - rules = rules.property(name); - } - - if (!rules) { - throw { type: 'Name', - message: 'property "' + name.substr(1) + '" not found', - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - // Properties are an array of values, since a ruleset can have multiple props. - // We pick the last one (the "cascaded" value) - rules = rules[rules.length - 1]; - } - - if (rules.value) { - rules = rules.eval(context).value; - } - if (rules.ruleset) { - rules = rules.ruleset.eval(context); - } - } - return rules; -}; -module.exports = NamespaceValue; - -},{"./node":76,"./ruleset":81,"./selector":82,"./variable":88}],75:[function(require,module,exports){ -var Node = require('./node'), - Operation = require('./operation'), - Dimension = require('./dimension'); - -var Negative = function (node) { - this.value = node; -}; -Negative.prototype = new Node(); -Negative.prototype.type = 'Negative'; -Negative.prototype.genCSS = function (context, output) { - output.add('-'); - this.value.genCSS(context, output); -}; -Negative.prototype.eval = function (context) { - if (context.isMathOn()) { - return (new Operation('*', [new Dimension(-1), this.value])).eval(context); - } - return new Negative(this.value.eval(context)); -}; -module.exports = Negative; - -},{"./dimension":62,"./node":76,"./operation":77}],76:[function(require,module,exports){ -var Node = function() { - this.parent = null; - this.visibilityBlocks = undefined; - this.nodeVisible = undefined; - this.rootNode = null; - this.parsed = null; - - var self = this; - Object.defineProperty(this, 'currentFileInfo', { - get: function() { return self.fileInfo(); } - }); - Object.defineProperty(this, 'index', { - get: function() { return self.getIndex(); } - }); - -}; -Node.prototype.setParent = function(nodes, parent) { - function set(node) { - if (node && node instanceof Node) { - node.parent = parent; - } - } - if (Array.isArray(nodes)) { - nodes.forEach(set); - } - else { - set(nodes); - } -}; -Node.prototype.getIndex = function() { - return this._index || (this.parent && this.parent.getIndex()) || 0; -}; -Node.prototype.fileInfo = function() { - return this._fileInfo || (this.parent && this.parent.fileInfo()) || {}; -}; -Node.prototype.isRulesetLike = function() { return false; }; -Node.prototype.toCSS = function (context) { - var strs = []; - this.genCSS(context, { - add: function(chunk, fileInfo, index) { - strs.push(chunk); - }, - isEmpty: function () { - return strs.length === 0; - } - }); - return strs.join(''); -}; -Node.prototype.genCSS = function (context, output) { - output.add(this.value); -}; -Node.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); -}; -Node.prototype.eval = function () { return this; }; -Node.prototype._operate = function (context, op, a, b) { - switch (op) { - case '+': return a + b; - case '-': return a - b; - case '*': return a * b; - case '/': return a / b; - } -}; -Node.prototype.fround = function(context, value) { - var precision = context && context.numPrecision; - // add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded: - return (precision) ? Number((value + 2e-16).toFixed(precision)) : value; -}; -Node.compare = function (a, b) { - /* returns: - -1: a < b - 0: a = b - 1: a > b - and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ - - if ((a.compare) && - // for "symmetric results" force toCSS-based comparison - // of Quoted or Anonymous if either value is one of those - !(b.type === 'Quoted' || b.type === 'Anonymous')) { - return a.compare(b); - } else if (b.compare) { - return -b.compare(a); - } else if (a.type !== b.type) { - return undefined; - } - - a = a.value; - b = b.value; - if (!Array.isArray(a)) { - return a === b ? 0 : undefined; - } - if (a.length !== b.length) { - return undefined; - } - for (var i = 0; i < a.length; i++) { - if (Node.compare(a[i], b[i]) !== 0) { - return undefined; - } - } - return 0; -}; - -Node.numericCompare = function (a, b) { - return a < b ? -1 - : a === b ? 0 - : a > b ? 1 : undefined; -}; -// Returns true if this node represents root of ast imported by reference -Node.prototype.blocksVisibility = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - return this.visibilityBlocks !== 0; -}; -Node.prototype.addVisibilityBlock = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - this.visibilityBlocks = this.visibilityBlocks + 1; -}; -Node.prototype.removeVisibilityBlock = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - this.visibilityBlocks = this.visibilityBlocks - 1; -}; -// Turns on node visibility - if called node will be shown in output regardless -// of whether it comes from import by reference or not -Node.prototype.ensureVisibility = function () { - this.nodeVisible = true; -}; -// Turns off node visibility - if called node will NOT be shown in output regardless -// of whether it comes from import by reference or not -Node.prototype.ensureInvisibility = function () { - this.nodeVisible = false; -}; -// return values: -// false - the node must not be visible -// true - the node must be visible -// undefined or null - the node has the same visibility as its parent -Node.prototype.isVisible = function () { - return this.nodeVisible; -}; -Node.prototype.visibilityInfo = function() { - return { - visibilityBlocks: this.visibilityBlocks, - nodeVisible: this.nodeVisible - }; -}; -Node.prototype.copyVisibilityInfo = function(info) { - if (!info) { - return; - } - this.visibilityBlocks = info.visibilityBlocks; - this.nodeVisible = info.nodeVisible; -}; -module.exports = Node; - -},{}],77:[function(require,module,exports){ -var Node = require('./node'), - Color = require('./color'), - Dimension = require('./dimension'), - MATH = require('../math-constants'); - -var Operation = function (op, operands, isSpaced) { - this.op = op.trim(); - this.operands = operands; - this.isSpaced = isSpaced; -}; -Operation.prototype = new Node(); -Operation.prototype.type = 'Operation'; -Operation.prototype.accept = function (visitor) { - this.operands = visitor.visit(this.operands); -}; -Operation.prototype.eval = function (context) { - var a = this.operands[0].eval(context), - b = this.operands[1].eval(context), - op; - - if (context.isMathOn(this.op)) { - op = this.op === './' ? '/' : this.op; - if (a instanceof Dimension && b instanceof Color) { - a = a.toColor(); - } - if (b instanceof Dimension && a instanceof Color) { - b = b.toColor(); - } - if (!a.operate) { - if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) { - return new Operation(this.op, [a, b], this.isSpaced); - } - throw { type: 'Operation', - message: 'Operation on an invalid type' }; - } - - return a.operate(context, op, b); - } else { - return new Operation(this.op, [a, b], this.isSpaced); - } -}; -Operation.prototype.genCSS = function (context, output) { - this.operands[0].genCSS(context, output); - if (this.isSpaced) { - output.add(' '); - } - output.add(this.op); - if (this.isSpaced) { - output.add(' '); - } - this.operands[1].genCSS(context, output); -}; - -module.exports = Operation; - -},{"../math-constants":39,"./color":55,"./dimension":62,"./node":76}],78:[function(require,module,exports){ -var Node = require('./node'); - -var Paren = function (node) { - this.value = node; -}; -Paren.prototype = new Node(); -Paren.prototype.type = 'Paren'; -Paren.prototype.genCSS = function (context, output) { - output.add('('); - this.value.genCSS(context, output); - output.add(')'); -}; -Paren.prototype.eval = function (context) { - return new Paren(this.value.eval(context)); -}; -module.exports = Paren; - -},{"./node":76}],79:[function(require,module,exports){ -var Node = require('./node'), - Declaration = require('./declaration'); - -var Property = function (name, index, currentFileInfo) { - this.name = name; - this._index = index; - this._fileInfo = currentFileInfo; -}; -Property.prototype = new Node(); -Property.prototype.type = 'Property'; -Property.prototype.eval = function (context) { - var property, name = this.name; - // TODO: shorten this reference - var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules; - - if (this.evaluating) { - throw { type: 'Name', - message: 'Recursive property reference for ' + name, - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - - this.evaluating = true; - - property = this.find(context.frames, function (frame) { - - var v, vArr = frame.property(name); - if (vArr) { - for (var i = 0; i < vArr.length; i++) { - v = vArr[i]; - - vArr[i] = new Declaration(v.name, - v.value, - v.important, - v.merge, - v.index, - v.currentFileInfo, - v.inline, - v.variable - ); - } - mergeRules(vArr); - - v = vArr[vArr.length - 1]; - if (v.important) { - var importantScope = context.importantScope[context.importantScope.length - 1]; - importantScope.important = v.important; - } - v = v.value.eval(context); - return v; - } - }); - if (property) { - this.evaluating = false; - return property; - } else { - throw { type: 'Name', - message: 'Property \'' + name + '\' is undefined', - filename: this.currentFileInfo.filename, - index: this.index }; - } -}; -Property.prototype.find = function (obj, fun) { - for (var i = 0, r; i < obj.length; i++) { - r = fun.call(obj, obj[i]); - if (r) { return r; } - } - return null; -}; -module.exports = Property; - -},{"./declaration":60,"./node":76}],80:[function(require,module,exports){ -var Node = require('./node'), - Variable = require('./variable'), - Property = require('./property'); - -var Quoted = function (str, content, escaped, index, currentFileInfo) { - this.escaped = (escaped == null) ? true : escaped; - this.value = content || ''; - this.quote = str.charAt(0); - this._index = index; - this._fileInfo = currentFileInfo; - this.variableRegex = /@\{([\w-]+)\}/g; - this.propRegex = /\$\{([\w-]+)\}/g; -}; -Quoted.prototype = new Node(); -Quoted.prototype.type = 'Quoted'; -Quoted.prototype.genCSS = function (context, output) { - if (!this.escaped) { - output.add(this.quote, this.fileInfo(), this.getIndex()); - } - output.add(this.value); - if (!this.escaped) { - output.add(this.quote); - } -}; -Quoted.prototype.containsVariables = function() { - return this.value.match(this.variableRegex); -}; -Quoted.prototype.eval = function (context) { - var that = this, value = this.value; - var variableReplacement = function (_, name) { - var v = new Variable('@' + name, that.getIndex(), that.fileInfo()).eval(context, true); - return (v instanceof Quoted) ? v.value : v.toCSS(); - }; - var propertyReplacement = function (_, name) { - var v = new Property('$' + name, that.getIndex(), that.fileInfo()).eval(context, true); - return (v instanceof Quoted) ? v.value : v.toCSS(); - }; - function iterativeReplace(value, regexp, replacementFnc) { - var evaluatedValue = value; - do { - value = evaluatedValue; - evaluatedValue = value.replace(regexp, replacementFnc); - } while (value !== evaluatedValue); - return evaluatedValue; - } - value = iterativeReplace(value, this.variableRegex, variableReplacement); - value = iterativeReplace(value, this.propRegex, propertyReplacement); - return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); -}; -Quoted.prototype.compare = function (other) { - // when comparing quoted strings allow the quote to differ - if (other.type === 'Quoted' && !this.escaped && !other.escaped) { - return Node.numericCompare(this.value, other.value); - } else { - return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - } -}; -module.exports = Quoted; - -},{"./node":76,"./property":79,"./variable":88}],81:[function(require,module,exports){ -var Node = require('./node'), - Declaration = require('./declaration'), - Keyword = require('./keyword'), - Comment = require('./comment'), - Paren = require('./paren'), - Selector = require('./selector'), - Element = require('./element'), - Anonymous = require('./anonymous'), - contexts = require('../contexts'), - globalFunctionRegistry = require('../functions/function-registry'), - defaultFunc = require('../functions/default'), - getDebugInfo = require('./debug-info'), - utils = require('../utils'); - -var Ruleset = function (selectors, rules, strictImports, visibilityInfo) { - this.selectors = selectors; - this.rules = rules; - this._lookups = {}; - this._variables = null; - this._properties = null; - this.strictImports = strictImports; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; - - this.setParent(this.selectors, this); - this.setParent(this.rules, this); - -}; -Ruleset.prototype = new Node(); -Ruleset.prototype.type = 'Ruleset'; -Ruleset.prototype.isRuleset = true; -Ruleset.prototype.isRulesetLike = function() { return true; }; -Ruleset.prototype.accept = function (visitor) { - if (this.paths) { - this.paths = visitor.visitArray(this.paths, true); - } else if (this.selectors) { - this.selectors = visitor.visitArray(this.selectors); - } - if (this.rules && this.rules.length) { - this.rules = visitor.visitArray(this.rules); - } -}; -Ruleset.prototype.eval = function (context) { - var that = this, selectors, selCnt, selector, i, hasVariable, hasOnePassingSelector = false; - - if (this.selectors && (selCnt = this.selectors.length)) { - selectors = new Array(selCnt); - defaultFunc.error({ - type: 'Syntax', - message: 'it is currently only allowed in parametric mixin guards,' - }); - - for (i = 0; i < selCnt; i++) { - selector = this.selectors[i].eval(context); - for (var j = 0; j < selector.elements.length; j++) { - if (selector.elements[j].isVariable) { - hasVariable = true; - break; - } - } - selectors[i] = selector; - if (selector.evaldCondition) { - hasOnePassingSelector = true; - } - } - - if (hasVariable) { - var toParseSelectors = new Array(selCnt); - for (i = 0; i < selCnt; i++) { - selector = selectors[i]; - toParseSelectors[i] = selector.toCSS(context); - } - this.parse.parseNode( - toParseSelectors.join(','), - ["selectors"], - selectors[0].getIndex(), - selectors[0].fileInfo(), - function(err, result) { - if (result) { - selectors = utils.flattenArray(result); - } - }); - } - - defaultFunc.reset(); - } else { - hasOnePassingSelector = true; - } - - var rules = this.rules ? utils.copyArray(this.rules) : null, - ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo()), - rule, subRule; - - ruleset.originalRuleset = this; - ruleset.root = this.root; - ruleset.firstRoot = this.firstRoot; - ruleset.allowImports = this.allowImports; - - if (this.debugInfo) { - ruleset.debugInfo = this.debugInfo; - } - - if (!hasOnePassingSelector) { - rules.length = 0; - } - - // inherit a function registry from the frames stack when possible; - // otherwise from the global registry - ruleset.functionRegistry = (function (frames) { - var i = 0, - n = frames.length, - found; - for ( ; i !== n ; ++i ) { - found = frames[ i ].functionRegistry; - if ( found ) { return found; } - } - return globalFunctionRegistry; - }(context.frames)).inherit(); - - // push the current ruleset to the frames stack - var ctxFrames = context.frames; - ctxFrames.unshift(ruleset); - - // currrent selectors - var ctxSelectors = context.selectors; - if (!ctxSelectors) { - context.selectors = ctxSelectors = []; - } - ctxSelectors.unshift(this.selectors); - - // Evaluate imports - if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { - ruleset.evalImports(context); - } - - // Store the frames around mixin definitions, - // so they can be evaluated like closures when the time comes. - var rsRules = ruleset.rules; - for (i = 0; (rule = rsRules[i]); i++) { - if (rule.evalFirst) { - rsRules[i] = rule.eval(context); - } - } - - var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0; - - // Evaluate mixin calls. - for (i = 0; (rule = rsRules[i]); i++) { - if (rule.type === 'MixinCall') { - /* jshint loopfunc:true */ - rules = rule.eval(context).filter(function(r) { - if ((r instanceof Declaration) && r.variable) { - // do not pollute the scope if the variable is - // already there. consider returning false here - // but we need a way to "return" variable from mixins - return !(ruleset.variable(r.name)); - } - return true; - }); - rsRules.splice.apply(rsRules, [i, 1].concat(rules)); - i += rules.length - 1; - ruleset.resetCache(); - } else if (rule.type === 'VariableCall') { - /* jshint loopfunc:true */ - rules = rule.eval(context).rules.filter(function(r) { - if ((r instanceof Declaration) && r.variable) { - // do not pollute the scope at all - return false; - } - return true; - }); - rsRules.splice.apply(rsRules, [i, 1].concat(rules)); - i += rules.length - 1; - ruleset.resetCache(); - } - } - - // Evaluate everything else - for (i = 0; (rule = rsRules[i]); i++) { - if (!rule.evalFirst) { - rsRules[i] = rule = rule.eval ? rule.eval(context) : rule; - } - } - - // Evaluate everything else - for (i = 0; (rule = rsRules[i]); i++) { - // for rulesets, check if it is a css guard and can be removed - if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) { - // check if it can be folded in (e.g. & where) - if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) { - rsRules.splice(i--, 1); - - for (var j = 0; (subRule = rule.rules[j]); j++) { - if (subRule instanceof Node) { - subRule.copyVisibilityInfo(rule.visibilityInfo()); - if (!(subRule instanceof Declaration) || !subRule.variable) { - rsRules.splice(++i, 0, subRule); - } - } - } - } - } - } - - // Pop the stack - ctxFrames.shift(); - ctxSelectors.shift(); - - if (context.mediaBlocks) { - for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) { - context.mediaBlocks[i].bubbleSelectors(selectors); - } - } - - return ruleset; -}; -Ruleset.prototype.evalImports = function(context) { - var rules = this.rules, i, importRules; - if (!rules) { return; } - - for (i = 0; i < rules.length; i++) { - if (rules[i].type === 'Import') { - importRules = rules[i].eval(context); - if (importRules && (importRules.length || importRules.length === 0)) { - rules.splice.apply(rules, [i, 1].concat(importRules)); - i += importRules.length - 1; - } else { - rules.splice(i, 1, importRules); - } - this.resetCache(); - } - } -}; -Ruleset.prototype.makeImportant = function() { - var result = new Ruleset(this.selectors, this.rules.map(function (r) { - if (r.makeImportant) { - return r.makeImportant(); - } else { - return r; - } - }), this.strictImports, this.visibilityInfo()); - - return result; -}; -Ruleset.prototype.matchArgs = function (args) { - return !args || args.length === 0; -}; -// lets you call a css selector with a guard -Ruleset.prototype.matchCondition = function (args, context) { - var lastSelector = this.selectors[this.selectors.length - 1]; - if (!lastSelector.evaldCondition) { - return false; - } - if (lastSelector.condition && - !lastSelector.condition.eval( - new contexts.Eval(context, - context.frames))) { - return false; - } - return true; -}; -Ruleset.prototype.resetCache = function () { - this._rulesets = null; - this._variables = null; - this._properties = null; - this._lookups = {}; -}; -Ruleset.prototype.variables = function () { - if (!this._variables) { - this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { - if (r instanceof Declaration && r.variable === true) { - hash[r.name] = r; - } - // when evaluating variables in an import statement, imports have not been eval'd - // so we need to go inside import statements. - // guard against root being a string (in the case of inlined less) - if (r.type === 'Import' && r.root && r.root.variables) { - var vars = r.root.variables(); - for (var name in vars) { - if (vars.hasOwnProperty(name)) { - hash[name] = r.root.variable(name); - } - } - } - return hash; - }, {}); - } - return this._variables; -}; -Ruleset.prototype.properties = function () { - if (!this._properties) { - this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { - if (r instanceof Declaration && r.variable !== true) { - var name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ? - r.name[0].value : r.name; - // Properties don't overwrite as they can merge - if (!hash['$' + name]) { - hash['$' + name] = [ r ]; - } - else { - hash['$' + name].push(r); - } - } - return hash; - }, {}); - } - return this._properties; -}; -Ruleset.prototype.variable = function (name) { - var decl = this.variables()[name]; - if (decl) { - return this.parseValue(decl); - } -}; -Ruleset.prototype.property = function (name) { - var decl = this.properties()[name]; - if (decl) { - return this.parseValue(decl); - } -}; -Ruleset.prototype.lastDeclaration = function () { - for (var i = this.rules.length; i > 0; i--) { - var decl = this.rules[i - 1]; - if (decl instanceof Declaration) { - return this.parseValue(decl); - } - } -}; -Ruleset.prototype.parseValue = function(toParse) { - var self = this; - function transformDeclaration(decl) { - if (decl.value instanceof Anonymous && !decl.parsed) { - if (typeof decl.value.value === 'string') { - this.parse.parseNode( - decl.value.value, - ['value', 'important'], - decl.value.getIndex(), - decl.fileInfo(), - function(err, result) { - if (err) { - decl.parsed = true; - } - if (result) { - decl.value = result[0]; - decl.important = result[1] || ''; - decl.parsed = true; - } - }); - } else { - decl.parsed = true; - } - - return decl; - } - else { - return decl; - } - } - if (!Array.isArray(toParse)) { - return transformDeclaration.call(self, toParse); - } - else { - var nodes = []; - toParse.forEach(function(n) { - nodes.push(transformDeclaration.call(self, n)); - }); - return nodes; - } -}; -Ruleset.prototype.rulesets = function () { - if (!this.rules) { return []; } - - var filtRules = [], rules = this.rules, - i, rule; - - for (i = 0; (rule = rules[i]); i++) { - if (rule.isRuleset) { - filtRules.push(rule); - } - } - - return filtRules; -}; -Ruleset.prototype.prependRule = function (rule) { - var rules = this.rules; - if (rules) { - rules.unshift(rule); - } else { - this.rules = [ rule ]; - } - this.setParent(rule, this); -}; -Ruleset.prototype.find = function (selector, self, filter) { - self = self || this; - var rules = [], match, foundMixins, - key = selector.toCSS(); - - if (key in this._lookups) { return this._lookups[key]; } - - this.rulesets().forEach(function (rule) { - if (rule !== self) { - for (var j = 0; j < rule.selectors.length; j++) { - match = selector.match(rule.selectors[j]); - if (match) { - if (selector.elements.length > match) { - if (!filter || filter(rule)) { - foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter); - for (var i = 0; i < foundMixins.length; ++i) { - foundMixins[i].path.push(rule); - } - Array.prototype.push.apply(rules, foundMixins); - } - } else { - rules.push({ rule: rule, path: []}); - } - break; - } - } - } - }); - this._lookups[key] = rules; - return rules; -}; -Ruleset.prototype.genCSS = function (context, output) { - var i, j, - charsetRuleNodes = [], - ruleNodes = [], - debugInfo, // Line number debugging - rule, - path; - - context.tabLevel = (context.tabLevel || 0); - - if (!this.root) { - context.tabLevel++; - } - - var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' '), - tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' '), - sep; - - var charsetNodeIndex = 0; - var importNodeIndex = 0; - for (i = 0; (rule = this.rules[i]); i++) { - if (rule instanceof Comment) { - if (importNodeIndex === i) { - importNodeIndex++; - } - ruleNodes.push(rule); - } else if (rule.isCharset && rule.isCharset()) { - ruleNodes.splice(charsetNodeIndex, 0, rule); - charsetNodeIndex++; - importNodeIndex++; - } else if (rule.type === 'Import') { - ruleNodes.splice(importNodeIndex, 0, rule); - importNodeIndex++; - } else { - ruleNodes.push(rule); - } - } - ruleNodes = charsetRuleNodes.concat(ruleNodes); - - // If this is the root node, we don't render - // a selector, or {}. - if (!this.root) { - debugInfo = getDebugInfo(context, this, tabSetStr); - - if (debugInfo) { - output.add(debugInfo); - output.add(tabSetStr); - } - - var paths = this.paths, pathCnt = paths.length, - pathSubCnt; - - sep = context.compress ? ',' : (',\n' + tabSetStr); - - for (i = 0; i < pathCnt; i++) { - path = paths[i]; - if (!(pathSubCnt = path.length)) { continue; } - if (i > 0) { output.add(sep); } - - context.firstSelector = true; - path[0].genCSS(context, output); - - context.firstSelector = false; - for (j = 1; j < pathSubCnt; j++) { - path[j].genCSS(context, output); - } - } - - output.add((context.compress ? '{' : ' {\n') + tabRuleStr); - } - - // Compile rules and rulesets - for (i = 0; (rule = ruleNodes[i]); i++) { - - if (i + 1 === ruleNodes.length) { - context.lastRule = true; - } - - var currentLastRule = context.lastRule; - if (rule.isRulesetLike(rule)) { - context.lastRule = false; - } - - if (rule.genCSS) { - rule.genCSS(context, output); - } else if (rule.value) { - output.add(rule.value.toString()); - } - - context.lastRule = currentLastRule; - - if (!context.lastRule && rule.isVisible()) { - output.add(context.compress ? '' : ('\n' + tabRuleStr)); - } else { - context.lastRule = false; - } - } - - if (!this.root) { - output.add((context.compress ? '}' : '\n' + tabSetStr + '}')); - context.tabLevel--; - } - - if (!output.isEmpty() && !context.compress && this.firstRoot) { - output.add('\n'); - } -}; - -Ruleset.prototype.joinSelectors = function (paths, context, selectors) { - for (var s = 0; s < selectors.length; s++) { - this.joinSelector(paths, context, selectors[s]); - } -}; - -Ruleset.prototype.joinSelector = function (paths, context, selector) { - - function createParenthesis(elementsToPak, originalElement) { - var replacementParen, j; - if (elementsToPak.length === 0) { - replacementParen = new Paren(elementsToPak[0]); - } else { - var insideParent = new Array(elementsToPak.length); - for (j = 0; j < elementsToPak.length; j++) { - insideParent[j] = new Element( - null, - elementsToPak[j], - originalElement.isVariable, - originalElement._index, - originalElement._fileInfo - ); - } - replacementParen = new Paren(new Selector(insideParent)); - } - return replacementParen; - } - - function createSelector(containedElement, originalElement) { - var element, selector; - element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo); - selector = new Selector([element]); - return selector; - } - - // joins selector path from `beginningPath` with selector path in `addPath` - // `replacedElement` contains element that is being replaced by `addPath` - // returns concatenated path - function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) { - var newSelectorPath, lastSelector, newJoinedSelector; - // our new selector path - newSelectorPath = []; - - // construct the joined selector - if & is the first thing this will be empty, - // if not newJoinedSelector will be the last set of elements in the selector - if (beginningPath.length > 0) { - newSelectorPath = utils.copyArray(beginningPath); - lastSelector = newSelectorPath.pop(); - newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements)); - } - else { - newJoinedSelector = originalSelector.createDerived([]); - } - - if (addPath.length > 0) { - // /deep/ is a CSS4 selector - (removed, so should deprecate) - // that is valid without anything in front of it - // so if the & does not have a combinator that is "" or " " then - // and there is a combinator on the parent, then grab that. - // this also allows + a { & .b { .a & { ... though not sure why you would want to do that - var combinator = replacedElement.combinator, parentEl = addPath[0].elements[0]; - if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) { - combinator = parentEl.combinator; - } - // join the elements so far with the first part of the parent - newJoinedSelector.elements.push(new Element( - combinator, - parentEl.value, - replacedElement.isVariable, - replacedElement._index, - replacedElement._fileInfo - )); - newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1)); - } - - // now add the joined selector - but only if it is not empty - if (newJoinedSelector.elements.length !== 0) { - newSelectorPath.push(newJoinedSelector); - } - - // put together the parent selectors after the join (e.g. the rest of the parent) - if (addPath.length > 1) { - var restOfPath = addPath.slice(1); - restOfPath = restOfPath.map(function (selector) { - return selector.createDerived(selector.elements, []); - }); - newSelectorPath = newSelectorPath.concat(restOfPath); - } - return newSelectorPath; - } - - // joins selector path from `beginningPath` with every selector path in `addPaths` array - // `replacedElement` contains element that is being replaced by `addPath` - // returns array with all concatenated paths - function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) { - var j; - for (j = 0; j < beginningPath.length; j++) { - var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector); - result.push(newSelectorPath); - } - return result; - } - - function mergeElementsOnToSelectors(elements, selectors) { - var i, sel; - - if (elements.length === 0) { - return ; - } - if (selectors.length === 0) { - selectors.push([ new Selector(elements) ]); - return; - } - - for (i = 0; (sel = selectors[i]); i++) { - // if the previous thing in sel is a parent this needs to join on to it - if (sel.length > 0) { - sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements)); - } - else { - sel.push(new Selector(elements)); - } - } - } - - // replace all parent selectors inside `inSelector` by content of `context` array - // resulting selectors are returned inside `paths` array - // returns true if `inSelector` contained at least one parent selector - function replaceParentSelector(paths, context, inSelector) { - // The paths are [[Selector]] - // The first list is a list of comma separated selectors - // The inner list is a list of inheritance separated selectors - // e.g. - // .a, .b { - // .c { - // } - // } - // == [[.a] [.c]] [[.b] [.c]] - // - var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector; - function findNestedSelector(element) { - var maybeSelector; - if (!(element.value instanceof Paren)) { - return null; - } - - maybeSelector = element.value.value; - if (!(maybeSelector instanceof Selector)) { - return null; - } - - return maybeSelector; - } - - // the elements from the current selector so far - currentElements = []; - // the current list of new selectors to add to the path. - // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors - // by the parents - newSelectors = [ - [] - ]; - - for (i = 0; (el = inSelector.elements[i]); i++) { - // non parent reference elements just get added - if (el.value !== '&') { - var nestedSelector = findNestedSelector(el); - if (nestedSelector != null) { - // merge the current list of non parent selector elements - // on to the current list of selectors to add - mergeElementsOnToSelectors(currentElements, newSelectors); - - var nestedPaths = [], replaced, replacedNewSelectors = []; - replaced = replaceParentSelector(nestedPaths, context, nestedSelector); - hadParentSelector = hadParentSelector || replaced; - // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors - for (k = 0; k < nestedPaths.length; k++) { - var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el); - addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors); - } - newSelectors = replacedNewSelectors; - currentElements = []; - - } else { - currentElements.push(el); - } - - } else { - hadParentSelector = true; - // the new list of selectors to add - selectorsMultiplied = []; - - // merge the current list of non parent selector elements - // on to the current list of selectors to add - mergeElementsOnToSelectors(currentElements, newSelectors); - - // loop through our current selectors - for (j = 0; j < newSelectors.length; j++) { - sel = newSelectors[j]; - // if we don't have any parent paths, the & might be in a mixin so that it can be used - // whether there are parents or not - if (context.length === 0) { - // the combinator used on el should now be applied to the next element instead so that - // it is not lost - if (sel.length > 0) { - sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo)); - } - selectorsMultiplied.push(sel); - } - else { - // and the parent selectors - for (k = 0; k < context.length; k++) { - // We need to put the current selectors - // then join the last selector's elements on to the parents selectors - var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector); - // add that to our new set of selectors - selectorsMultiplied.push(newSelectorPath); - } - } - } - - // our new selectors has been multiplied, so reset the state - newSelectors = selectorsMultiplied; - currentElements = []; - } - } - - // if we have any elements left over (e.g. .a& .b == .b) - // add them on to all the current selectors - mergeElementsOnToSelectors(currentElements, newSelectors); - - for (i = 0; i < newSelectors.length; i++) { - length = newSelectors[i].length; - if (length > 0) { - paths.push(newSelectors[i]); - lastSelector = newSelectors[i][length - 1]; - newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList); - } - } - - return hadParentSelector; - } - - function deriveSelector(visibilityInfo, deriveFrom) { - var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition); - newSelector.copyVisibilityInfo(visibilityInfo); - return newSelector; - } - - // joinSelector code follows - var i, newPaths, hadParentSelector; - - newPaths = []; - hadParentSelector = replaceParentSelector(newPaths, context, selector); - - if (!hadParentSelector) { - if (context.length > 0) { - newPaths = []; - for (i = 0; i < context.length; i++) { - - var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo())); - - concatenated.push(selector); - newPaths.push(concatenated); - } - } - else { - newPaths = [[selector]]; - } - } - - for (i = 0; i < newPaths.length; i++) { - paths.push(newPaths[i]); - } - -}; -module.exports = Ruleset; - -},{"../contexts":12,"../functions/default":24,"../functions/function-registry":26,"../utils":89,"./anonymous":50,"./comment":57,"./debug-info":59,"./declaration":60,"./element":63,"./keyword":70,"./node":76,"./paren":78,"./selector":82}],82:[function(require,module,exports){ -var Node = require('./node'), - Element = require('./element'), - LessError = require('../less-error'); - -var Selector = function (elements, extendList, condition, index, currentFileInfo, visibilityInfo) { - this.extendList = extendList; - this.condition = condition; - this.evaldCondition = !condition; - this._index = index; - this._fileInfo = currentFileInfo; - this.elements = this.getElements(elements); - this.mixinElements_ = undefined; - this.copyVisibilityInfo(visibilityInfo); - this.setParent(this.elements, this); -}; -Selector.prototype = new Node(); -Selector.prototype.type = 'Selector'; -Selector.prototype.accept = function (visitor) { - if (this.elements) { - this.elements = visitor.visitArray(this.elements); - } - if (this.extendList) { - this.extendList = visitor.visitArray(this.extendList); - } - if (this.condition) { - this.condition = visitor.visit(this.condition); - } -}; -Selector.prototype.createDerived = function(elements, extendList, evaldCondition) { - elements = this.getElements(elements); - var newSelector = new Selector(elements, extendList || this.extendList, - null, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; - newSelector.mediaEmpty = this.mediaEmpty; - return newSelector; -}; -Selector.prototype.getElements = function(els) { - if (!els) { - return [new Element('', '&', false, this._index, this._fileInfo)]; - } - if (typeof els === 'string') { - this.parse.parseNode( - els, - ['selector'], - this._index, - this._fileInfo, - function(err, result) { - if (err) { - throw new LessError({ - index: err.index, - message: err.message - }, this.parse.imports, this._fileInfo.filename); - } - els = result[0].elements; - }); - } - return els; -}; -Selector.prototype.createEmptySelectors = function() { - var el = new Element('', '&', false, this._index, this._fileInfo), - sels = [new Selector([el], null, null, this._index, this._fileInfo)]; - sels[0].mediaEmpty = true; - return sels; -}; -Selector.prototype.match = function (other) { - var elements = this.elements, - len = elements.length, - olen, i; - - other = other.mixinElements(); - olen = other.length; - if (olen === 0 || len < olen) { - return 0; - } else { - for (i = 0; i < olen; i++) { - if (elements[i].value !== other[i]) { - return 0; - } - } - } - - return olen; // return number of matched elements -}; -Selector.prototype.mixinElements = function() { - if (this.mixinElements_) { - return this.mixinElements_; - } - - var elements = this.elements.map( function(v) { - return v.combinator.value + (v.value.value || v.value); - }).join('').match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); - - if (elements) { - if (elements[0] === '&') { - elements.shift(); - } - } else { - elements = []; - } - - return (this.mixinElements_ = elements); -}; -Selector.prototype.isJustParentSelector = function() { - return !this.mediaEmpty && - this.elements.length === 1 && - this.elements[0].value === '&' && - (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); -}; -Selector.prototype.eval = function (context) { - var evaldCondition = this.condition && this.condition.eval(context), - elements = this.elements, extendList = this.extendList; - - elements = elements && elements.map(function (e) { return e.eval(context); }); - extendList = extendList && extendList.map(function(extend) { return extend.eval(context); }); - - return this.createDerived(elements, extendList, evaldCondition); -}; -Selector.prototype.genCSS = function (context, output) { - var i, element; - if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { - output.add(' ', this.fileInfo(), this.getIndex()); - } - for (i = 0; i < this.elements.length; i++) { - element = this.elements[i]; - element.genCSS(context, output); - } -}; -Selector.prototype.getIsOutput = function() { - return this.evaldCondition; -}; -module.exports = Selector; - -},{"../less-error":37,"./element":63,"./node":76}],83:[function(require,module,exports){ -var Node = require('./node'); - -var UnicodeDescriptor = function (value) { - this.value = value; -}; -UnicodeDescriptor.prototype = new Node(); -UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; - -module.exports = UnicodeDescriptor; - -},{"./node":76}],84:[function(require,module,exports){ -var Node = require('./node'), - unitConversions = require('../data/unit-conversions'), - utils = require('../utils'); - -var Unit = function (numerator, denominator, backupUnit) { - this.numerator = numerator ? utils.copyArray(numerator).sort() : []; - this.denominator = denominator ? utils.copyArray(denominator).sort() : []; - if (backupUnit) { - this.backupUnit = backupUnit; - } else if (numerator && numerator.length) { - this.backupUnit = numerator[0]; - } -}; - -Unit.prototype = new Node(); -Unit.prototype.type = 'Unit'; -Unit.prototype.clone = function () { - return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit); -}; -Unit.prototype.genCSS = function (context, output) { - // Dimension checks the unit is singular and throws an error if in strict math mode. - var strictUnits = context && context.strictUnits; - if (this.numerator.length === 1) { - output.add(this.numerator[0]); // the ideal situation - } else if (!strictUnits && this.backupUnit) { - output.add(this.backupUnit); - } else if (!strictUnits && this.denominator.length) { - output.add(this.denominator[0]); - } -}; -Unit.prototype.toString = function () { - var i, returnStr = this.numerator.join('*'); - for (i = 0; i < this.denominator.length; i++) { - returnStr += '/' + this.denominator[i]; - } - return returnStr; -}; -Unit.prototype.compare = function (other) { - return this.is(other.toString()) ? 0 : undefined; -}; -Unit.prototype.is = function (unitString) { - return this.toString().toUpperCase() === unitString.toUpperCase(); -}; -Unit.prototype.isLength = function () { - return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); -}; -Unit.prototype.isEmpty = function () { - return this.numerator.length === 0 && this.denominator.length === 0; -}; -Unit.prototype.isSingular = function() { - return this.numerator.length <= 1 && this.denominator.length === 0; -}; -Unit.prototype.map = function(callback) { - var i; - - for (i = 0; i < this.numerator.length; i++) { - this.numerator[i] = callback(this.numerator[i], false); - } - - for (i = 0; i < this.denominator.length; i++) { - this.denominator[i] = callback(this.denominator[i], true); - } -}; -Unit.prototype.usedUnits = function() { - var group, result = {}, mapUnit, groupName; - - mapUnit = function (atomicUnit) { - /* jshint loopfunc:true */ - if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { - result[groupName] = atomicUnit; - } - - return atomicUnit; - }; - - for (groupName in unitConversions) { - if (unitConversions.hasOwnProperty(groupName)) { - group = unitConversions[groupName]; - - this.map(mapUnit); - } - } - - return result; -}; -Unit.prototype.cancel = function () { - var counter = {}, atomicUnit, i; - - for (i = 0; i < this.numerator.length; i++) { - atomicUnit = this.numerator[i]; - counter[atomicUnit] = (counter[atomicUnit] || 0) + 1; - } - - for (i = 0; i < this.denominator.length; i++) { - atomicUnit = this.denominator[i]; - counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; - } - - this.numerator = []; - this.denominator = []; - - for (atomicUnit in counter) { - if (counter.hasOwnProperty(atomicUnit)) { - var count = counter[atomicUnit]; - - if (count > 0) { - for (i = 0; i < count; i++) { - this.numerator.push(atomicUnit); - } - } else if (count < 0) { - for (i = 0; i < -count; i++) { - this.denominator.push(atomicUnit); - } - } - } - } - - this.numerator.sort(); - this.denominator.sort(); -}; -module.exports = Unit; - -},{"../data/unit-conversions":15,"../utils":89,"./node":76}],85:[function(require,module,exports){ -var Node = require('./node'); - -var URL = function (val, index, currentFileInfo, isEvald) { - this.value = val; - this._index = index; - this._fileInfo = currentFileInfo; - this.isEvald = isEvald; -}; -URL.prototype = new Node(); -URL.prototype.type = 'Url'; -URL.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); -}; -URL.prototype.genCSS = function (context, output) { - output.add('url('); - this.value.genCSS(context, output); - output.add(')'); -}; -URL.prototype.eval = function (context) { - var val = this.value.eval(context), - rootpath; - - if (!this.isEvald) { - // Add the base path if the URL is relative - rootpath = this.fileInfo() && this.fileInfo().rootpath; - if (rootpath && - typeof val.value === 'string' && - context.isPathRelative(val.value)) { - - if (!val.quote) { - rootpath = rootpath.replace(/[\(\)'"\s]/g, function(match) { return '\\' + match; }); - } - val.value = rootpath + val.value; - } - - val.value = context.normalizePath(val.value); - - // Add url args if enabled - if (context.urlArgs) { - if (!val.value.match(/^\s*data:/)) { - var delimiter = val.value.indexOf('?') === -1 ? '?' : '&'; - var urlArgs = delimiter + context.urlArgs; - if (val.value.indexOf('#') !== -1) { - val.value = val.value.replace('#', urlArgs + '#'); - } else { - val.value += urlArgs; - } - } - } - } - - return new URL(val, this.getIndex(), this.fileInfo(), true); -}; -module.exports = URL; - -},{"./node":76}],86:[function(require,module,exports){ -var Node = require('./node'); - -var Value = function (value) { - if (!value) { - throw new Error('Value requires an array argument'); - } - if (!Array.isArray(value)) { - this.value = [ value ]; - } - else { - this.value = value; - } -}; -Value.prototype = new Node(); -Value.prototype.type = 'Value'; -Value.prototype.accept = function (visitor) { - if (this.value) { - this.value = visitor.visitArray(this.value); - } -}; -Value.prototype.eval = function (context) { - if (this.value.length === 1) { - return this.value[0].eval(context); - } else { - return new Value(this.value.map(function (v) { - return v.eval(context); - })); - } -}; -Value.prototype.genCSS = function (context, output) { - var i; - for (i = 0; i < this.value.length; i++) { - this.value[i].genCSS(context, output); - if (i + 1 < this.value.length) { - output.add((context && context.compress) ? ',' : ', '); - } - } -}; -module.exports = Value; - -},{"./node":76}],87:[function(require,module,exports){ -var Node = require('./node'), - Variable = require('./variable'), - Ruleset = require('./ruleset'), - DetachedRuleset = require('./detached-ruleset'), - LessError = require('../less-error'); - -var VariableCall = function (variable, index, currentFileInfo) { - this.variable = variable; - this._index = index; - this._fileInfo = currentFileInfo; - this.allowRoot = true; -}; -VariableCall.prototype = new Node(); -VariableCall.prototype.type = 'VariableCall'; -VariableCall.prototype.eval = function (context) { - var rules, detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context), - error = new LessError({message: 'Could not evaluate variable call ' + this.variable}); - - if (!detachedRuleset.ruleset) { - if (Array.isArray(detachedRuleset)) { - rules = detachedRuleset; - } - else if (Array.isArray(detachedRuleset.value)) { - rules = detachedRuleset.value; - } - else { - throw error; - } - detachedRuleset = new DetachedRuleset(new Ruleset('', rules)); - } - if (detachedRuleset.ruleset) { - return detachedRuleset.callEval(context); - } - throw error; -}; -module.exports = VariableCall; - -},{"../less-error":37,"./detached-ruleset":61,"./node":76,"./ruleset":81,"./variable":88}],88:[function(require,module,exports){ -var Node = require('./node'), - Call = require('./call'); - -var Variable = function (name, index, currentFileInfo) { - this.name = name; - this._index = index; - this._fileInfo = currentFileInfo; -}; -Variable.prototype = new Node(); -Variable.prototype.type = 'Variable'; -Variable.prototype.eval = function (context) { - var variable, name = this.name; - - if (name.indexOf('@@') === 0) { - name = '@' + new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value; - } - - if (this.evaluating) { - throw { type: 'Name', - message: 'Recursive variable definition for ' + name, - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - - this.evaluating = true; - - variable = this.find(context.frames, function (frame) { - var v = frame.variable(name); - if (v) { - if (v.important) { - var importantScope = context.importantScope[context.importantScope.length - 1]; - importantScope.important = v.important; - } - // If in calc, wrap vars in a function call to cascade evaluate args first - if (context.inCalc) { - return (new Call('_SELF', [v.value])).eval(context); - } - else { - return v.value.eval(context); - } - } - }); - if (variable) { - this.evaluating = false; - return variable; - } else { - throw { type: 'Name', - message: 'variable ' + name + ' is undefined', - filename: this.fileInfo().filename, - index: this.getIndex() }; - } -}; -Variable.prototype.find = function (obj, fun) { - for (var i = 0, r; i < obj.length; i++) { - r = fun.call(obj, obj[i]); - if (r) { return r; } - } - return null; -}; -module.exports = Variable; - -},{"./call":54,"./node":76}],89:[function(require,module,exports){ -/* jshint proto: true */ -var MATH = require('./math-constants'); - -var utils = { - getLocation: function(index, inputStream) { - var n = index + 1, - line = null, - column = -1; - - while (--n >= 0 && inputStream.charAt(n) !== '\n') { - column++; - } - - if (typeof index === 'number') { - line = (inputStream.slice(0, index).match(/\n/g) || '').length; - } - - return { - line: line, - column: column - }; - }, - copyArray: function(arr) { - var i, length = arr.length, - copy = new Array(length); - - for (i = 0; i < length; i++) { - copy[i] = arr[i]; - } - return copy; - }, - clone: function (obj) { - var cloned = {}; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - cloned[prop] = obj[prop]; - } - } - return cloned; - }, - copyOptions: function(obj1, obj2) { - var opts = utils.defaults(obj1, obj2); - if (opts.strictMath) { - opts.math = MATH.STRICT_LEGACY; - } - if (opts.hasOwnProperty('math') && typeof opts.math === 'string') { - switch (opts.math.toLowerCase()) { - case 'always': - opts.math = MATH.ALWAYS; - break; - case 'parens-division': - opts.math = MATH.PARENS_DIVISION; - break; - case 'strict': - case 'parens': - opts.math = MATH.PARENS; - break; - case 'strict-legacy': - opts.math = MATH.STRICT_LEGACY; - } - } - return opts; - }, - defaults: function(obj1, obj2) { - if (!obj2._defaults || obj2._defaults !== obj1) { - for (var prop in obj1) { - if (obj1.hasOwnProperty(prop)) { - if (!obj2.hasOwnProperty(prop)) { - obj2[prop] = obj1[prop]; - } - else if (Array.isArray(obj1[prop]) - && Array.isArray(obj2[prop])) { - - obj1[prop].forEach(function(p) { - if (obj2[prop].indexOf(p) === -1) { - obj2[prop].push(p); - } - }); - } - } - } - } - obj2._defaults = obj1; - return obj2; - }, - merge: function(obj1, obj2) { - for (var prop in obj2) { - if (obj2.hasOwnProperty(prop)) { - obj1[prop] = obj2[prop]; - } - } - return obj1; - }, - flattenArray: function(arr, result) { - result = result || []; - for (var i = 0, length = arr.length; i < length; i++) { - var value = arr[i]; - if (Array.isArray(value)) { - utils.flattenArray(value, result); - } else { - if (value !== undefined) { - result.push(value); - } - } - } - return result; - } -}; - -module.exports = utils; -},{"./math-constants":39}],90:[function(require,module,exports){ -var tree = require('../tree'), - Visitor = require('./visitor'), - logger = require('../logger'), - utils = require('../utils'); - -/* jshint loopfunc:true */ - -var ExtendFinderVisitor = function() { - this._visitor = new Visitor(this); - this.contexts = []; - this.allExtendsStack = [[]]; -}; - -ExtendFinderVisitor.prototype = { - run: function (root) { - root = this._visitor.visit(root); - root.allExtends = this.allExtendsStack[0]; - return root; - }, - visitDeclaration: function (declNode, visitArgs) { - visitArgs.visitDeeper = false; - }, - visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }, - visitRuleset: function (rulesetNode, visitArgs) { - if (rulesetNode.root) { - return; - } - - var i, j, extend, allSelectorsExtendList = [], extendList; - - // get &:extend(.a); rules which apply to all selectors in this ruleset - var rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0; - for (i = 0; i < ruleCnt; i++) { - if (rulesetNode.rules[i] instanceof tree.Extend) { - allSelectorsExtendList.push(rules[i]); - rulesetNode.extendOnEveryPath = true; - } - } - - // now find every selector and apply the extends that apply to all extends - // and the ones which apply to an individual extend - var paths = rulesetNode.paths; - for (i = 0; i < paths.length; i++) { - var selectorPath = paths[i], - selector = selectorPath[selectorPath.length - 1], - selExtendList = selector.extendList; - - extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList) - : allSelectorsExtendList; - - if (extendList) { - extendList = extendList.map(function(allSelectorsExtend) { - return allSelectorsExtend.clone(); - }); - } - - for (j = 0; j < extendList.length; j++) { - this.foundExtends = true; - extend = extendList[j]; - extend.findSelfSelectors(selectorPath); - extend.ruleset = rulesetNode; - if (j === 0) { extend.firstExtendOnThisSelectorPath = true; } - this.allExtendsStack[this.allExtendsStack.length - 1].push(extend); - } - } - - this.contexts.push(rulesetNode.selectors); - }, - visitRulesetOut: function (rulesetNode) { - if (!rulesetNode.root) { - this.contexts.length = this.contexts.length - 1; - } - }, - visitMedia: function (mediaNode, visitArgs) { - mediaNode.allExtends = []; - this.allExtendsStack.push(mediaNode.allExtends); - }, - visitMediaOut: function (mediaNode) { - this.allExtendsStack.length = this.allExtendsStack.length - 1; - }, - visitAtRule: function (atRuleNode, visitArgs) { - atRuleNode.allExtends = []; - this.allExtendsStack.push(atRuleNode.allExtends); - }, - visitAtRuleOut: function (atRuleNode) { - this.allExtendsStack.length = this.allExtendsStack.length - 1; - } -}; - -var ProcessExtendsVisitor = function() { - this._visitor = new Visitor(this); -}; - -ProcessExtendsVisitor.prototype = { - run: function(root) { - var extendFinder = new ExtendFinderVisitor(); - this.extendIndices = {}; - extendFinder.run(root); - if (!extendFinder.foundExtends) { return root; } - root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends)); - this.allExtendsStack = [root.allExtends]; - var newRoot = this._visitor.visit(root); - this.checkExtendsForNonMatched(root.allExtends); - return newRoot; - }, - checkExtendsForNonMatched: function(extendList) { - var indices = this.extendIndices; - extendList.filter(function(extend) { - return !extend.hasFoundMatches && extend.parent_ids.length == 1; - }).forEach(function(extend) { - var selector = '_unknown_'; - try { - selector = extend.selector.toCSS({}); - } - catch (_) {} - - if (!indices[extend.index + ' ' + selector]) { - indices[extend.index + ' ' + selector] = true; - logger.warn('extend \'' + selector + '\' has no matches'); - } - }); - }, - doExtendChaining: function (extendsList, extendsListTarget, iterationCount) { - // - // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering - // and pasting the selector we would do normally, but we are also adding an extend with the same target selector - // this means this new extend can then go and alter other extends - // - // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors - // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already - // processed if we look at each selector at a time, as is done in visitRuleset - - var extendIndex, targetExtendIndex, matches, extendsToAdd = [], newSelector, extendVisitor = this, selectorPath, - extend, targetExtend, newExtend; - - iterationCount = iterationCount || 0; - - // loop through comparing every extend with every target extend. - // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place - // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one - // and the second is the target. - // the separation into two lists allows us to process a subset of chains with a bigger set, as is the - // case when processing media queries - for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) { - for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) { - - extend = extendsList[extendIndex]; - targetExtend = extendsListTarget[targetExtendIndex]; - - // look for circular references - if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; } - - // find a match in the target extends self selector (the bit before :extend) - selectorPath = [targetExtend.selfSelectors[0]]; - matches = extendVisitor.findMatch(extend, selectorPath); - - if (matches.length) { - extend.hasFoundMatches = true; - - // we found a match, so for each self selector.. - extend.selfSelectors.forEach(function(selfSelector) { - var info = targetExtend.visibilityInfo(); - - // process the extend as usual - newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible()); - - // but now we create a new extend from it - newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info); - newExtend.selfSelectors = newSelector; - - // add the extend onto the list of extends for that selector - newSelector[newSelector.length - 1].extendList = [newExtend]; - - // record that we need to add it. - extendsToAdd.push(newExtend); - newExtend.ruleset = targetExtend.ruleset; - - // remember its parents for circular references - newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids); - - // only process the selector once.. if we have :extend(.a,.b) then multiple - // extends will look at the same selector path, so when extending - // we know that any others will be duplicates in terms of what is added to the css - if (targetExtend.firstExtendOnThisSelectorPath) { - newExtend.firstExtendOnThisSelectorPath = true; - targetExtend.ruleset.paths.push(newSelector); - } - }); - } - } - } - - if (extendsToAdd.length) { - // try to detect circular references to stop a stack overflow. - // may no longer be needed. - this.extendChainCount++; - if (iterationCount > 100) { - var selectorOne = '{unable to calculate}'; - var selectorTwo = '{unable to calculate}'; - try { - selectorOne = extendsToAdd[0].selfSelectors[0].toCSS(); - selectorTwo = extendsToAdd[0].selector.toCSS(); - } - catch (e) {} - throw { message: 'extend circular reference detected. One of the circular extends is currently:' + - selectorOne + ':extend(' + selectorTwo + ')'}; - } - - // now process the new extends on the existing rules so that we can handle a extending b extending c extending - // d extending e... - return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1)); - } else { - return extendsToAdd; - } - }, - visitDeclaration: function (ruleNode, visitArgs) { - visitArgs.visitDeeper = false; - }, - visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }, - visitSelector: function (selectorNode, visitArgs) { - visitArgs.visitDeeper = false; - }, - visitRuleset: function (rulesetNode, visitArgs) { - if (rulesetNode.root) { - return; - } - var matches, pathIndex, extendIndex, allExtends = this.allExtendsStack[this.allExtendsStack.length - 1], - selectorsToAdd = [], extendVisitor = this, selectorPath; - - // look at each selector path in the ruleset, find any extend matches and then copy, find and replace - - for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) { - for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) { - selectorPath = rulesetNode.paths[pathIndex]; - - // extending extends happens initially, before the main pass - if (rulesetNode.extendOnEveryPath) { continue; } - var extendList = selectorPath[selectorPath.length - 1].extendList; - if (extendList && extendList.length) { continue; } - - matches = this.findMatch(allExtends[extendIndex], selectorPath); - - if (matches.length) { - allExtends[extendIndex].hasFoundMatches = true; - - allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) { - var extendedSelectors; - extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible()); - selectorsToAdd.push(extendedSelectors); - }); - } - } - } - rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); - }, - findMatch: function (extend, haystackSelectorPath) { - // - // look through the haystack selector path to try and find the needle - extend.selector - // returns an array of selector matches that can then be replaced - // - var haystackSelectorIndex, hackstackSelector, hackstackElementIndex, haystackElement, - targetCombinator, i, - extendVisitor = this, - needleElements = extend.selector.elements, - potentialMatches = [], potentialMatch, matches = []; - - // loop through the haystack elements - for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) { - hackstackSelector = haystackSelectorPath[haystackSelectorIndex]; - - for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) { - - haystackElement = hackstackSelector.elements[hackstackElementIndex]; - - // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. - if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) { - potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0, - initialCombinator: haystackElement.combinator}); - } - - for (i = 0; i < potentialMatches.length; i++) { - potentialMatch = potentialMatches[i]; - - // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't - // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to - // work out what the resulting combinator will be - targetCombinator = haystackElement.combinator.value; - if (targetCombinator === '' && hackstackElementIndex === 0) { - targetCombinator = ' '; - } - - // if we don't match, null our match to indicate failure - if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) || - (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) { - potentialMatch = null; - } else { - potentialMatch.matched++; - } - - // if we are still valid and have finished, test whether we have elements after and whether these are allowed - if (potentialMatch) { - potentialMatch.finished = potentialMatch.matched === needleElements.length; - if (potentialMatch.finished && - (!extend.allowAfter && - (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) { - potentialMatch = null; - } - } - // if null we remove, if not, we are still valid, so either push as a valid match or continue - if (potentialMatch) { - if (potentialMatch.finished) { - potentialMatch.length = needleElements.length; - potentialMatch.endPathIndex = haystackSelectorIndex; - potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match - potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again - matches.push(potentialMatch); - } - } else { - potentialMatches.splice(i, 1); - i--; - } - } - } - } - return matches; - }, - isElementValuesEqual: function(elementValue1, elementValue2) { - if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') { - return elementValue1 === elementValue2; - } - if (elementValue1 instanceof tree.Attribute) { - if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) { - return false; - } - if (!elementValue1.value || !elementValue2.value) { - if (elementValue1.value || elementValue2.value) { - return false; - } - return true; - } - elementValue1 = elementValue1.value.value || elementValue1.value; - elementValue2 = elementValue2.value.value || elementValue2.value; - return elementValue1 === elementValue2; - } - elementValue1 = elementValue1.value; - elementValue2 = elementValue2.value; - if (elementValue1 instanceof tree.Selector) { - if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) { - return false; - } - for (var i = 0; i < elementValue1.elements.length; i++) { - if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) { - if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) { - return false; - } - } - if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) { - return false; - } - } - return true; - } - return false; - }, - extendSelector:function (matches, selectorPath, replacementSelector, isVisible) { - - // for a set of matches, replace each match with the replacement selector - - var currentSelectorPathIndex = 0, - currentSelectorPathElementIndex = 0, - path = [], - matchIndex, - selector, - firstElement, - match, - newElements; - - for (matchIndex = 0; matchIndex < matches.length; matchIndex++) { - match = matches[matchIndex]; - selector = selectorPath[match.pathIndex]; - firstElement = new tree.Element( - match.initialCombinator, - replacementSelector.elements[0].value, - replacementSelector.elements[0].isVariable, - replacementSelector.elements[0].getIndex(), - replacementSelector.elements[0].fileInfo() - ); - - if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) { - path[path.length - 1].elements = path[path.length - 1] - .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); - currentSelectorPathElementIndex = 0; - currentSelectorPathIndex++; - } - - newElements = selector.elements - .slice(currentSelectorPathElementIndex, match.index) - .concat([firstElement]) - .concat(replacementSelector.elements.slice(1)); - - if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) { - path[path.length - 1].elements = - path[path.length - 1].elements.concat(newElements); - } else { - path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)); - - path.push(new tree.Selector( - newElements - )); - } - currentSelectorPathIndex = match.endPathIndex; - currentSelectorPathElementIndex = match.endPathElementIndex; - if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) { - currentSelectorPathElementIndex = 0; - currentSelectorPathIndex++; - } - } - - if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) { - path[path.length - 1].elements = path[path.length - 1] - .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); - currentSelectorPathIndex++; - } - - path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); - path = path.map(function (currentValue) { - // we can re-use elements here, because the visibility property matters only for selectors - var derived = currentValue.createDerived(currentValue.elements); - if (isVisible) { - derived.ensureVisibility(); - } else { - derived.ensureInvisibility(); - } - return derived; - }); - return path; - }, - visitMedia: function (mediaNode, visitArgs) { - var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); - newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends)); - this.allExtendsStack.push(newAllExtends); - }, - visitMediaOut: function (mediaNode) { - var lastIndex = this.allExtendsStack.length - 1; - this.allExtendsStack.length = lastIndex; - }, - visitAtRule: function (atRuleNode, visitArgs) { - var newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); - newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends)); - this.allExtendsStack.push(newAllExtends); - }, - visitAtRuleOut: function (atRuleNode) { - var lastIndex = this.allExtendsStack.length - 1; - this.allExtendsStack.length = lastIndex; - } -}; - -module.exports = ProcessExtendsVisitor; - -},{"../logger":38,"../tree":67,"../utils":89,"./visitor":97}],91:[function(require,module,exports){ -function ImportSequencer(onSequencerEmpty) { - this.imports = []; - this.variableImports = []; - this._onSequencerEmpty = onSequencerEmpty; - this._currentDepth = 0; -} - -ImportSequencer.prototype.addImport = function(callback) { - var importSequencer = this, - importItem = { - callback: callback, - args: null, - isReady: false - }; - this.imports.push(importItem); - return function() { - importItem.args = Array.prototype.slice.call(arguments, 0); - importItem.isReady = true; - importSequencer.tryRun(); - }; -}; - -ImportSequencer.prototype.addVariableImport = function(callback) { - this.variableImports.push(callback); -}; - -ImportSequencer.prototype.tryRun = function() { - this._currentDepth++; - try { - while (true) { - while (this.imports.length > 0) { - var importItem = this.imports[0]; - if (!importItem.isReady) { - return; - } - this.imports = this.imports.slice(1); - importItem.callback.apply(null, importItem.args); - } - if (this.variableImports.length === 0) { - break; - } - var variableImport = this.variableImports[0]; - this.variableImports = this.variableImports.slice(1); - variableImport(); - } - } finally { - this._currentDepth--; - } - if (this._currentDepth === 0 && this._onSequencerEmpty) { - this._onSequencerEmpty(); - } -}; - -module.exports = ImportSequencer; - -},{}],92:[function(require,module,exports){ -var contexts = require('../contexts'), - Visitor = require('./visitor'), - ImportSequencer = require('./import-sequencer'), - utils = require('../utils'); - -var ImportVisitor = function(importer, finish) { - - this._visitor = new Visitor(this); - this._importer = importer; - this._finish = finish; - this.context = new contexts.Eval(); - this.importCount = 0; - this.onceFileDetectionMap = {}; - this.recursionDetector = {}; - this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this)); -}; - -ImportVisitor.prototype = { - isReplacing: false, - run: function (root) { - try { - // process the contents - this._visitor.visit(root); - } - catch (e) { - this.error = e; - } - - this.isFinished = true; - this._sequencer.tryRun(); - }, - _onSequencerEmpty: function() { - if (!this.isFinished) { - return; - } - this._finish(this.error); - }, - visitImport: function (importNode, visitArgs) { - var inlineCSS = importNode.options.inline; - - if (!importNode.css || inlineCSS) { - - var context = new contexts.Eval(this.context, utils.copyArray(this.context.frames)); - var importParent = context.frames[0]; - - this.importCount++; - if (importNode.isVariableImport()) { - this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent)); - } else { - this.processImportNode(importNode, context, importParent); - } - } - visitArgs.visitDeeper = false; - }, - processImportNode: function(importNode, context, importParent) { - var evaldImportNode, - inlineCSS = importNode.options.inline; - - try { - evaldImportNode = importNode.evalForImport(context); - } catch (e) { - if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; } - // attempt to eval properly and treat as css - importNode.css = true; - // if that fails, this error will be thrown - importNode.error = e; - } - - if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { - - if (evaldImportNode.options.multiple) { - context.importMultiple = true; - } - - // try appending if we haven't determined if it is css or not - var tryAppendLessExtension = evaldImportNode.css === undefined; - - for (var i = 0; i < importParent.rules.length; i++) { - if (importParent.rules[i] === importNode) { - importParent.rules[i] = evaldImportNode; - break; - } - } - - var onImported = this.onImported.bind(this, evaldImportNode, context), - sequencedOnImported = this._sequencer.addImport(onImported); - - this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), - evaldImportNode.options, sequencedOnImported); - } else { - this.importCount--; - if (this.isFinished) { - this._sequencer.tryRun(); - } - } - }, - onImported: function (importNode, context, e, root, importedAtRoot, fullPath) { - if (e) { - if (!e.filename) { - e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; - } - this.error = e; - } - - var importVisitor = this, - inlineCSS = importNode.options.inline, - isPlugin = importNode.options.isPlugin, - isOptional = importNode.options.optional, - duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; - - if (!context.importMultiple) { - if (duplicateImport) { - importNode.skip = true; - } else { - importNode.skip = function() { - if (fullPath in importVisitor.onceFileDetectionMap) { - return true; - } - importVisitor.onceFileDetectionMap[fullPath] = true; - return false; - }; - } - } - - if (!fullPath && isOptional) { - importNode.skip = true; - } - - if (root) { - importNode.root = root; - importNode.importedFilename = fullPath; - - if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) { - importVisitor.recursionDetector[fullPath] = true; - - var oldContext = this.context; - this.context = context; - try { - this._visitor.visit(root); - } catch (e) { - this.error = e; - } - this.context = oldContext; - } - } - - importVisitor.importCount--; - - if (importVisitor.isFinished) { - importVisitor._sequencer.tryRun(); - } - }, - visitDeclaration: function (declNode, visitArgs) { - if (declNode.value.type === 'DetachedRuleset') { - this.context.frames.unshift(declNode); - } else { - visitArgs.visitDeeper = false; - } - }, - visitDeclarationOut: function(declNode) { - if (declNode.value.type === 'DetachedRuleset') { - this.context.frames.shift(); - } - }, - visitAtRule: function (atRuleNode, visitArgs) { - this.context.frames.unshift(atRuleNode); - }, - visitAtRuleOut: function (atRuleNode) { - this.context.frames.shift(); - }, - visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { - this.context.frames.unshift(mixinDefinitionNode); - }, - visitMixinDefinitionOut: function (mixinDefinitionNode) { - this.context.frames.shift(); - }, - visitRuleset: function (rulesetNode, visitArgs) { - this.context.frames.unshift(rulesetNode); - }, - visitRulesetOut: function (rulesetNode) { - this.context.frames.shift(); - }, - visitMedia: function (mediaNode, visitArgs) { - this.context.frames.unshift(mediaNode.rules[0]); - }, - visitMediaOut: function (mediaNode) { - this.context.frames.shift(); - } -}; -module.exports = ImportVisitor; - -},{"../contexts":12,"../utils":89,"./import-sequencer":91,"./visitor":97}],93:[function(require,module,exports){ -var visitors = { - Visitor: require('./visitor'), - ImportVisitor: require('./import-visitor'), - MarkVisibleSelectorsVisitor: require('./set-tree-visibility-visitor'), - ExtendVisitor: require('./extend-visitor'), - JoinSelectorVisitor: require('./join-selector-visitor'), - ToCSSVisitor: require('./to-css-visitor') -}; - -module.exports = visitors; - -},{"./extend-visitor":90,"./import-visitor":92,"./join-selector-visitor":94,"./set-tree-visibility-visitor":95,"./to-css-visitor":96,"./visitor":97}],94:[function(require,module,exports){ -var Visitor = require('./visitor'); - -var JoinSelectorVisitor = function() { - this.contexts = [[]]; - this._visitor = new Visitor(this); -}; - -JoinSelectorVisitor.prototype = { - run: function (root) { - return this._visitor.visit(root); - }, - visitDeclaration: function (declNode, visitArgs) { - visitArgs.visitDeeper = false; - }, - visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }, - - visitRuleset: function (rulesetNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1], - paths = [], selectors; - - this.contexts.push(paths); - - if (!rulesetNode.root) { - selectors = rulesetNode.selectors; - if (selectors) { - selectors = selectors.filter(function(selector) { return selector.getIsOutput(); }); - rulesetNode.selectors = selectors.length ? selectors : (selectors = null); - if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); } - } - if (!selectors) { rulesetNode.rules = null; } - rulesetNode.paths = paths; - } - }, - visitRulesetOut: function (rulesetNode) { - this.contexts.length = this.contexts.length - 1; - }, - visitMedia: function (mediaNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia); - }, - visitAtRule: function (atRuleNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - if (atRuleNode.rules && atRuleNode.rules.length) { - atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null); - } - } -}; - -module.exports = JoinSelectorVisitor; - -},{"./visitor":97}],95:[function(require,module,exports){ -var SetTreeVisibilityVisitor = function(visible) { - this.visible = visible; -}; -SetTreeVisibilityVisitor.prototype.run = function(root) { - this.visit(root); -}; -SetTreeVisibilityVisitor.prototype.visitArray = function(nodes) { - if (!nodes) { - return nodes; - } - - var cnt = nodes.length, i; - for (i = 0; i < cnt; i++) { - this.visit(nodes[i]); - } - return nodes; -}; -SetTreeVisibilityVisitor.prototype.visit = function(node) { - if (!node) { - return node; - } - if (node.constructor === Array) { - return this.visitArray(node); - } - - if (!node.blocksVisibility || node.blocksVisibility()) { - return node; - } - if (this.visible) { - node.ensureVisibility(); - } else { - node.ensureInvisibility(); - } - - node.accept(this); - return node; -}; -module.exports = SetTreeVisibilityVisitor; -},{}],96:[function(require,module,exports){ -var tree = require('../tree'), - Visitor = require('./visitor'); - -var CSSVisitorUtils = function(context) { - this._visitor = new Visitor(this); - this._context = context; -}; - -CSSVisitorUtils.prototype = { - containsSilentNonBlockedChild: function(bodyRules) { - var rule; - if (!bodyRules) { - return false; - } - for (var r = 0; r < bodyRules.length; r++) { - rule = bodyRules[r]; - if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) { - // the atrule contains something that was referenced (likely by extend) - // therefore it needs to be shown in output too - return true; - } - } - return false; - }, - - keepOnlyVisibleChilds: function(owner) { - if (owner && owner.rules) { - owner.rules = owner.rules.filter(function(thing) { - return thing.isVisible(); - }); - } - }, - - isEmpty: function(owner) { - return (owner && owner.rules) - ? (owner.rules.length === 0) : true; - }, - - hasVisibleSelector: function(rulesetNode) { - return (rulesetNode && rulesetNode.paths) - ? (rulesetNode.paths.length > 0) : false; - }, - - resolveVisibility: function (node, originalRules) { - if (!node.blocksVisibility()) { - if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) { - return ; - } - - return node; - } - - var compiledRulesBody = node.rules[0]; - this.keepOnlyVisibleChilds(compiledRulesBody); - - if (this.isEmpty(compiledRulesBody)) { - return ; - } - - node.ensureVisibility(); - node.removeVisibilityBlock(); - - return node; - }, - - isVisibleRuleset: function(rulesetNode) { - if (rulesetNode.firstRoot) { - return true; - } - - if (this.isEmpty(rulesetNode)) { - return false; - } - - if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) { - return false; - } - - return true; - } - -}; - -var ToCSSVisitor = function(context) { - this._visitor = new Visitor(this); - this._context = context; - this.utils = new CSSVisitorUtils(context); -}; - -ToCSSVisitor.prototype = { - isReplacing: true, - run: function (root) { - return this._visitor.visit(root); - }, - - visitDeclaration: function (declNode, visitArgs) { - if (declNode.blocksVisibility() || declNode.variable) { - return; - } - return declNode; - }, - - visitMixinDefinition: function (mixinNode, visitArgs) { - // mixin definitions do not get eval'd - this means they keep state - // so we have to clear that state here so it isn't used if toCSS is called twice - mixinNode.frames = []; - }, - - visitExtend: function (extendNode, visitArgs) { - }, - - visitComment: function (commentNode, visitArgs) { - if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) { - return; - } - return commentNode; - }, - - visitMedia: function(mediaNode, visitArgs) { - var originalRules = mediaNode.rules[0].rules; - mediaNode.accept(this._visitor); - visitArgs.visitDeeper = false; - - return this.utils.resolveVisibility(mediaNode, originalRules); - }, - - visitImport: function (importNode, visitArgs) { - if (importNode.blocksVisibility()) { - return ; - } - return importNode; - }, - - visitAtRule: function(atRuleNode, visitArgs) { - if (atRuleNode.rules && atRuleNode.rules.length) { - return this.visitAtRuleWithBody(atRuleNode, visitArgs); - } else { - return this.visitAtRuleWithoutBody(atRuleNode, visitArgs); - } - }, - - visitAnonymous: function(anonymousNode, visitArgs) { - if (!anonymousNode.blocksVisibility()) { - anonymousNode.accept(this._visitor); - return anonymousNode; - } - }, - - visitAtRuleWithBody: function(atRuleNode, visitArgs) { - // if there is only one nested ruleset and that one has no path, then it is - // just fake ruleset - function hasFakeRuleset(atRuleNode) { - var bodyRules = atRuleNode.rules; - return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0); - } - function getBodyRules(atRuleNode) { - var nodeRules = atRuleNode.rules; - if (hasFakeRuleset(atRuleNode)) { - return nodeRules[0].rules; - } - - return nodeRules; - } - // it is still true that it is only one ruleset in array - // this is last such moment - // process childs - var originalRules = getBodyRules(atRuleNode); - atRuleNode.accept(this._visitor); - visitArgs.visitDeeper = false; - - if (!this.utils.isEmpty(atRuleNode)) { - this._mergeRules(atRuleNode.rules[0].rules); - } - - return this.utils.resolveVisibility(atRuleNode, originalRules); - }, - - visitAtRuleWithoutBody: function(atRuleNode, visitArgs) { - if (atRuleNode.blocksVisibility()) { - return; - } - - if (atRuleNode.name === '@charset') { - // Only output the debug info together with subsequent @charset definitions - // a comment (or @media statement) before the actual @charset atrule would - // be considered illegal css as it has to be on the first line - if (this.charset) { - if (atRuleNode.debugInfo) { - var comment = new tree.Comment('/* ' + atRuleNode.toCSS(this._context).replace(/\n/g, '') + ' */\n'); - comment.debugInfo = atRuleNode.debugInfo; - return this._visitor.visit(comment); - } - return; - } - this.charset = true; - } - - return atRuleNode; - }, - - checkValidNodes: function(rules, isRoot) { - if (!rules) { - return; - } - - for (var i = 0; i < rules.length; i++) { - var ruleNode = rules[i]; - if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) { - throw { message: 'Properties must be inside selector blocks. They cannot be in the root', - index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename}; - } - if (ruleNode instanceof tree.Call) { - throw { message: 'Function \'' + ruleNode.name + '\' is undefined', - index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename}; - } - if (ruleNode.type && !ruleNode.allowRoot) { - throw { message: ruleNode.type + ' node returned by a function is not valid here', - index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename}; - } - } - }, - - visitRuleset: function (rulesetNode, visitArgs) { - // at this point rulesets are nested into each other - var rule, rulesets = []; - - this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot); - - if (!rulesetNode.root) { - // remove invisible paths - this._compileRulesetPaths(rulesetNode); - - // remove rulesets from this ruleset body and compile them separately - var nodeRules = rulesetNode.rules, nodeRuleCnt = nodeRules ? nodeRules.length : 0; - for (var i = 0; i < nodeRuleCnt; ) { - rule = nodeRules[i]; - if (rule && rule.rules) { - // visit because we are moving them out from being a child - rulesets.push(this._visitor.visit(rule)); - nodeRules.splice(i, 1); - nodeRuleCnt--; - continue; - } - i++; - } - // accept the visitor to remove rules and refactor itself - // then we can decide nogw whether we want it or not - // compile body - if (nodeRuleCnt > 0) { - rulesetNode.accept(this._visitor); - } else { - rulesetNode.rules = null; - } - visitArgs.visitDeeper = false; - - } else { // if (! rulesetNode.root) { - rulesetNode.accept(this._visitor); - visitArgs.visitDeeper = false; - } - - if (rulesetNode.rules) { - this._mergeRules(rulesetNode.rules); - this._removeDuplicateRules(rulesetNode.rules); - } - - // now decide whether we keep the ruleset - if (this.utils.isVisibleRuleset(rulesetNode)) { - rulesetNode.ensureVisibility(); - rulesets.splice(0, 0, rulesetNode); - } - - if (rulesets.length === 1) { - return rulesets[0]; - } - return rulesets; - }, - - _compileRulesetPaths: function(rulesetNode) { - if (rulesetNode.paths) { - rulesetNode.paths = rulesetNode.paths - .filter(function(p) { - var i; - if (p[0].elements[0].combinator.value === ' ') { - p[0].elements[0].combinator = new(tree.Combinator)(''); - } - for (i = 0; i < p.length; i++) { - if (p[i].isVisible() && p[i].getIsOutput()) { - return true; - } - } - return false; - }); - } - }, - - _removeDuplicateRules: function(rules) { - if (!rules) { return; } - - // remove duplicates - var ruleCache = {}, - ruleList, rule, i; - - for (i = rules.length - 1; i >= 0 ; i--) { - rule = rules[i]; - if (rule instanceof tree.Declaration) { - if (!ruleCache[rule.name]) { - ruleCache[rule.name] = rule; - } else { - ruleList = ruleCache[rule.name]; - if (ruleList instanceof tree.Declaration) { - ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)]; - } - var ruleCSS = rule.toCSS(this._context); - if (ruleList.indexOf(ruleCSS) !== -1) { - rules.splice(i, 1); - } else { - ruleList.push(ruleCSS); - } - } - } - } - }, - - _mergeRules: function(rules) { - if (!rules) { - return; - } - - var groups = {}, - groupsArr = []; - - for (var i = 0; i < rules.length; i++) { - var rule = rules[i]; - if (rule.merge) { - var key = rule.name; - groups[key] ? rules.splice(i--, 1) : - groupsArr.push(groups[key] = []); - groups[key].push(rule); - } - } - - groupsArr.forEach(function(group) { - if (group.length > 0) { - var result = group[0], - space = [], - comma = [new tree.Expression(space)]; - group.forEach(function(rule) { - if ((rule.merge === '+') && (space.length > 0)) { - comma.push(new tree.Expression(space = [])); - } - space.push(rule.value); - result.important = result.important || rule.important; - }); - result.value = new tree.Value(comma); - } - }); - } -}; - -module.exports = ToCSSVisitor; - -},{"../tree":67,"./visitor":97}],97:[function(require,module,exports){ -var tree = require('../tree'); - -var _visitArgs = { visitDeeper: true }, - _hasIndexed = false; - -function _noop(node) { - return node; -} - -function indexNodeTypes(parent, ticker) { - // add .typeIndex to tree node types for lookup table - var key, child; - for (key in parent) { - /* eslint guard-for-in: 0 */ - child = parent[key]; - switch (typeof child) { - case 'function': - // ignore bound functions directly on tree which do not have a prototype - // or aren't nodes - if (child.prototype && child.prototype.type) { - child.prototype.typeIndex = ticker++; - } - break; - case 'object': - ticker = indexNodeTypes(child, ticker); - break; - - } - } - return ticker; -} - -var Visitor = function(implementation) { - this._implementation = implementation; - this._visitInCache = {}; - this._visitOutCache = {}; - - if (!_hasIndexed) { - indexNodeTypes(tree, 1); - _hasIndexed = true; - } -}; - -Visitor.prototype = { - visit: function(node) { - if (!node) { - return node; - } - - var nodeTypeIndex = node.typeIndex; - if (!nodeTypeIndex) { - // MixinCall args aren't a node type? - if (node.value && node.value.typeIndex) { - this.visit(node.value); - } - return node; - } - - var impl = this._implementation, - func = this._visitInCache[nodeTypeIndex], - funcOut = this._visitOutCache[nodeTypeIndex], - visitArgs = _visitArgs, - fnName; - - visitArgs.visitDeeper = true; - - if (!func) { - fnName = 'visit' + node.type; - func = impl[fnName] || _noop; - funcOut = impl[fnName + 'Out'] || _noop; - this._visitInCache[nodeTypeIndex] = func; - this._visitOutCache[nodeTypeIndex] = funcOut; - } - - if (func !== _noop) { - var newNode = func.call(impl, node, visitArgs); - if (node && impl.isReplacing) { - node = newNode; - } - } - - if (visitArgs.visitDeeper && node && node.accept) { - node.accept(this); - } - - if (funcOut != _noop) { - funcOut.call(impl, node); - } - - return node; - }, - visitArray: function(nodes, nonReplacing) { - if (!nodes) { - return nodes; - } - - var cnt = nodes.length, i; - - // Non-replacing - if (nonReplacing || !this._implementation.isReplacing) { - for (i = 0; i < cnt; i++) { - this.visit(nodes[i]); - } - return nodes; - } - - // Replacing - var out = []; - for (i = 0; i < cnt; i++) { - var evald = this.visit(nodes[i]); - if (evald === undefined) { continue; } - if (!evald.splice) { - out.push(evald); - } else if (evald.length) { - this.flatten(evald, out); - } - } - return out; - }, - flatten: function(arr, out) { - if (!out) { - out = []; - } - - var cnt, i, item, - nestedCnt, j, nestedItem; - - for (i = 0, cnt = arr.length; i < cnt; i++) { - item = arr[i]; - if (item === undefined) { - continue; - } - if (!item.splice) { - out.push(item); - continue; - } - - for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) { - nestedItem = item[j]; - if (nestedItem === undefined) { - continue; - } - if (!nestedItem.splice) { - out.push(nestedItem); - } else if (nestedItem.length) { - this.flatten(nestedItem, out); - } - } - } - - return out; - } -}; -module.exports = Visitor; - -},{"../tree":67}],98:[function(require,module,exports){ -"use strict"; - -// rawAsap provides everything we need except exception management. -var rawAsap = require("./raw"); -// RawTasks are recycled to reduce GC churn. -var freeTasks = []; -// We queue errors to ensure they are thrown in right order (FIFO). -// Array-as-queue is good enough here, since we are just dealing with exceptions. -var pendingErrors = []; -var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError); - -function throwFirstError() { - if (pendingErrors.length) { - throw pendingErrors.shift(); - } -} - -/** - * Calls a task as soon as possible after returning, in its own event, with priority - * over other events like animation, reflow, and repaint. An error thrown from an - * event will not interrupt, nor even substantially slow down the processing of - * other events, but will be rather postponed to a lower priority event. - * @param {{call}} task A callable object, typically a function that takes no - * arguments. - */ -module.exports = asap; -function asap(task) { - var rawTask; - if (freeTasks.length) { - rawTask = freeTasks.pop(); - } else { - rawTask = new RawTask(); - } - rawTask.task = task; - rawAsap(rawTask); -} - -// We wrap tasks with recyclable task objects. A task object implements -// `call`, just like a function. -function RawTask() { - this.task = null; -} - -// The sole purpose of wrapping the task is to catch the exception and recycle -// the task object after its single use. -RawTask.prototype.call = function () { - try { - this.task.call(); - } catch (error) { - if (asap.onerror) { - // This hook exists purely for testing purposes. - // Its name will be periodically randomized to break any code that - // depends on its existence. - asap.onerror(error); - } else { - // In a web browser, exceptions are not fatal. However, to avoid - // slowing down the queue of pending tasks, we rethrow the error in a - // lower priority turn. - pendingErrors.push(error); - requestErrorThrow(); - } - } finally { - this.task = null; - freeTasks[freeTasks.length] = this; - } -}; - -},{"./raw":99}],99:[function(require,module,exports){ -(function (global){ -"use strict"; - -// Use the fastest means possible to execute a task in its own turn, with -// priority over other events including IO, animation, reflow, and redraw -// events in browsers. -// -// An exception thrown by a task will permanently interrupt the processing of -// subsequent tasks. The higher level `asap` function ensures that if an -// exception is thrown by a task, that the task queue will continue flushing as -// soon as possible, but if you use `rawAsap` directly, you are responsible to -// either ensure that no exceptions are thrown from your task, or to manually -// call `rawAsap.requestFlush` if an exception is thrown. -module.exports = rawAsap; -function rawAsap(task) { - if (!queue.length) { - requestFlush(); - flushing = true; - } - // Equivalent to push, but avoids a function call. - queue[queue.length] = task; -} - -var queue = []; -// Once a flush has been requested, no further calls to `requestFlush` are -// necessary until the next `flush` completes. -var flushing = false; -// `requestFlush` is an implementation-specific method that attempts to kick -// off a `flush` event as quickly as possible. `flush` will attempt to exhaust -// the event queue before yielding to the browser's own event loop. -var requestFlush; -// The position of the next task to execute in the task queue. This is -// preserved between calls to `flush` so that it can be resumed if -// a task throws an exception. -var index = 0; -// If a task schedules additional tasks recursively, the task queue can grow -// unbounded. To prevent memory exhaustion, the task queue will periodically -// truncate already-completed tasks. -var capacity = 1024; - -// The flush function processes all tasks that have been scheduled with -// `rawAsap` unless and until one of those tasks throws an exception. -// If a task throws an exception, `flush` ensures that its state will remain -// consistent and will resume where it left off when called again. -// However, `flush` does not make any arrangements to be called again if an -// exception is thrown. -function flush() { - while (index < queue.length) { - var currentIndex = index; - // Advance the index before calling the task. This ensures that we will - // begin flushing on the next task the task throws an error. - index = index + 1; - queue[currentIndex].call(); - // Prevent leaking memory for long chains of recursive calls to `asap`. - // If we call `asap` within tasks scheduled by `asap`, the queue will - // grow, but to avoid an O(n) walk for every task we execute, we don't - // shift tasks off the queue after they have been executed. - // Instead, we periodically shift 1024 tasks off the queue. - if (index > capacity) { - // Manually shift all values starting at the index back to the - // beginning of the queue. - for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { - queue[scan] = queue[scan + index]; - } - queue.length -= index; - index = 0; - } - } - queue.length = 0; - index = 0; - flushing = false; -} - -// `requestFlush` is implemented using a strategy based on data collected from -// every available SauceLabs Selenium web driver worker at time of writing. -// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593 - -// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that -// have WebKitMutationObserver but not un-prefixed MutationObserver. -// Must use `global` or `self` instead of `window` to work in both frames and web -// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop. - -/* globals self */ -var scope = typeof global !== "undefined" ? global : self; -var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; - -// MutationObservers are desirable because they have high priority and work -// reliably everywhere they are implemented. -// They are implemented in all modern browsers. -// -// - Android 4-4.3 -// - Chrome 26-34 -// - Firefox 14-29 -// - Internet Explorer 11 -// - iPad Safari 6-7.1 -// - iPhone Safari 7-7.1 -// - Safari 6-7 -if (typeof BrowserMutationObserver === "function") { - requestFlush = makeRequestCallFromMutationObserver(flush); - -// MessageChannels are desirable because they give direct access to the HTML -// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera -// 11-12, and in web workers in many engines. -// Although message channels yield to any queued rendering and IO tasks, they -// would be better than imposing the 4ms delay of timers. -// However, they do not work reliably in Internet Explorer or Safari. - -// Internet Explorer 10 is the only browser that has setImmediate but does -// not have MutationObservers. -// Although setImmediate yields to the browser's renderer, it would be -// preferrable to falling back to setTimeout since it does not have -// the minimum 4ms penalty. -// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and -// Desktop to a lesser extent) that renders both setImmediate and -// MessageChannel useless for the purposes of ASAP. -// https://github.com/kriskowal/q/issues/396 - -// Timers are implemented universally. -// We fall back to timers in workers in most engines, and in foreground -// contexts in the following browsers. -// However, note that even this simple case requires nuances to operate in a -// broad spectrum of browsers. -// -// - Firefox 3-13 -// - Internet Explorer 6-9 -// - iPad Safari 4.3 -// - Lynx 2.8.7 -} else { - requestFlush = makeRequestCallFromTimer(flush); -} - -// `requestFlush` requests that the high priority event queue be flushed as -// soon as possible. -// This is useful to prevent an error thrown in a task from stalling the event -// queue if the exception handled by Node.js’s -// `process.on("uncaughtException")` or by a domain. -rawAsap.requestFlush = requestFlush; - -// To request a high priority event, we induce a mutation observer by toggling -// the text of a text node between "1" and "-1". -function makeRequestCallFromMutationObserver(callback) { - var toggle = 1; - var observer = new BrowserMutationObserver(callback); - var node = document.createTextNode(""); - observer.observe(node, {characterData: true}); - return function requestCall() { - toggle = -toggle; - node.data = toggle; - }; -} - -// The message channel technique was discovered by Malte Ubl and was the -// original foundation for this library. -// http://www.nonblocking.io/2011/06/windownexttick.html - -// Safari 6.0.5 (at least) intermittently fails to create message ports on a -// page's first load. Thankfully, this version of Safari supports -// MutationObservers, so we don't need to fall back in that case. - -// function makeRequestCallFromMessageChannel(callback) { -// var channel = new MessageChannel(); -// channel.port1.onmessage = callback; -// return function requestCall() { -// channel.port2.postMessage(0); -// }; -// } - -// For reasons explained above, we are also unable to use `setImmediate` -// under any circumstances. -// Even if we were, there is another bug in Internet Explorer 10. -// It is not sufficient to assign `setImmediate` to `requestFlush` because -// `setImmediate` must be called *by name* and therefore must be wrapped in a -// closure. -// Never forget. - -// function makeRequestCallFromSetImmediate(callback) { -// return function requestCall() { -// setImmediate(callback); -// }; -// } - -// Safari 6.0 has a problem where timers will get lost while the user is -// scrolling. This problem does not impact ASAP because Safari 6.0 supports -// mutation observers, so that implementation is used instead. -// However, if we ever elect to use timers in Safari, the prevalent work-around -// is to add a scroll event listener that calls for a flush. - -// `setTimeout` does not call the passed callback if the delay is less than -// approximately 7 in web workers in Firefox 8 through 18, and sometimes not -// even then. - -function makeRequestCallFromTimer(callback) { - return function requestCall() { - // We dispatch a timeout with a specified delay of 0 for engines that - // can reliably accommodate that request. This will usually be snapped - // to a 4 milisecond delay, but once we're flushing, there's no delay - // between events. - var timeoutHandle = setTimeout(handleTimer, 0); - // However, since this timer gets frequently dropped in Firefox - // workers, we enlist an interval handle that will try to fire - // an event 20 times per second until it succeeds. - var intervalHandle = setInterval(handleTimer, 50); - - function handleTimer() { - // Whichever timer succeeds will cancel both timers and - // execute the callback. - clearTimeout(timeoutHandle); - clearInterval(intervalHandle); - callback(); - } - }; -} - -// This is for `asap.js` only. -// Its name will be periodically randomized to break any code that depends on -// its existence. -rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; - -// ASAP was originally a nextTick shim included in Q. This was factored out -// into this ASAP package. It was later adapted to RSVP which made further -// amendments. These decisions, particularly to marginalize MessageChannel and -// to capture the MutationObserver implementation in a closure, were integrated -// back into ASAP proper. -// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],100:[function(require,module,exports){ -'use strict'; - -var asap = require('asap/raw'); - -function noop() {} - -// States: -// -// 0 - pending -// 1 - fulfilled with _value -// 2 - rejected with _value -// 3 - adopted the state of another promise, _value -// -// once the state is no longer pending (0) it is immutable - -// All `_` prefixed properties will be reduced to `_{random number}` -// at build time to obfuscate them and discourage their use. -// We don't use symbols or Object.defineProperty to fully hide them -// because the performance isn't good enough. - - -// to avoid using try/catch inside critical functions, we -// extract them to here. -var LAST_ERROR = null; -var IS_ERROR = {}; -function getThen(obj) { - try { - return obj.then; - } catch (ex) { - LAST_ERROR = ex; - return IS_ERROR; - } -} - -function tryCallOne(fn, a) { - try { - return fn(a); - } catch (ex) { - LAST_ERROR = ex; - return IS_ERROR; - } -} -function tryCallTwo(fn, a, b) { - try { - fn(a, b); - } catch (ex) { - LAST_ERROR = ex; - return IS_ERROR; - } -} - -module.exports = Promise; - -function Promise(fn) { - if (typeof this !== 'object') { - throw new TypeError('Promises must be constructed via new'); - } - if (typeof fn !== 'function') { - throw new TypeError('Promise constructor\'s argument is not a function'); - } - this._40 = 0; - this._65 = 0; - this._55 = null; - this._72 = null; - if (fn === noop) return; - doResolve(fn, this); -} -Promise._37 = null; -Promise._87 = null; -Promise._61 = noop; - -Promise.prototype.then = function(onFulfilled, onRejected) { - if (this.constructor !== Promise) { - return safeThen(this, onFulfilled, onRejected); - } - var res = new Promise(noop); - handle(this, new Handler(onFulfilled, onRejected, res)); - return res; -}; - -function safeThen(self, onFulfilled, onRejected) { - return new self.constructor(function (resolve, reject) { - var res = new Promise(noop); - res.then(resolve, reject); - handle(self, new Handler(onFulfilled, onRejected, res)); - }); -} -function handle(self, deferred) { - while (self._65 === 3) { - self = self._55; - } - if (Promise._37) { - Promise._37(self); - } - if (self._65 === 0) { - if (self._40 === 0) { - self._40 = 1; - self._72 = deferred; - return; - } - if (self._40 === 1) { - self._40 = 2; - self._72 = [self._72, deferred]; - return; - } - self._72.push(deferred); - return; - } - handleResolved(self, deferred); -} - -function handleResolved(self, deferred) { - asap(function() { - var cb = self._65 === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - if (self._65 === 1) { - resolve(deferred.promise, self._55); - } else { - reject(deferred.promise, self._55); - } - return; - } - var ret = tryCallOne(cb, self._55); - if (ret === IS_ERROR) { - reject(deferred.promise, LAST_ERROR); - } else { - resolve(deferred.promise, ret); - } - }); -} -function resolve(self, newValue) { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) { - return reject( - self, - new TypeError('A promise cannot be resolved with itself.') - ); - } - if ( - newValue && - (typeof newValue === 'object' || typeof newValue === 'function') - ) { - var then = getThen(newValue); - if (then === IS_ERROR) { - return reject(self, LAST_ERROR); - } - if ( - then === self.then && - newValue instanceof Promise - ) { - self._65 = 3; - self._55 = newValue; - finale(self); - return; - } else if (typeof then === 'function') { - doResolve(then.bind(newValue), self); - return; - } - } - self._65 = 1; - self._55 = newValue; - finale(self); -} - -function reject(self, newValue) { - self._65 = 2; - self._55 = newValue; - if (Promise._87) { - Promise._87(self, newValue); - } - finale(self); -} -function finale(self) { - if (self._40 === 1) { - handle(self, self._72); - self._72 = null; - } - if (self._40 === 2) { - for (var i = 0; i < self._72.length; i++) { - handle(self, self._72[i]); - } - self._72 = null; - } -} - -function Handler(onFulfilled, onRejected, promise){ - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.promise = promise; -} - -/** - * Take a potentially misbehaving resolver function and make sure - * onFulfilled and onRejected are only called once. - * - * Makes no guarantees about asynchrony. - */ -function doResolve(fn, promise) { - var done = false; - var res = tryCallTwo(fn, function (value) { - if (done) return; - done = true; - resolve(promise, value); - }, function (reason) { - if (done) return; - done = true; - reject(promise, reason); - }); - if (!done && res === IS_ERROR) { - done = true; - reject(promise, LAST_ERROR); - } -} - -},{"asap/raw":99}],101:[function(require,module,exports){ -'use strict'; - -//This file contains the ES6 extensions to the core Promises/A+ API - -var Promise = require('./core.js'); - -module.exports = Promise; - -/* Static Functions */ - -var TRUE = valuePromise(true); -var FALSE = valuePromise(false); -var NULL = valuePromise(null); -var UNDEFINED = valuePromise(undefined); -var ZERO = valuePromise(0); -var EMPTYSTRING = valuePromise(''); - -function valuePromise(value) { - var p = new Promise(Promise._61); - p._65 = 1; - p._55 = value; - return p; -} -Promise.resolve = function (value) { - if (value instanceof Promise) return value; - - if (value === null) return NULL; - if (value === undefined) return UNDEFINED; - if (value === true) return TRUE; - if (value === false) return FALSE; - if (value === 0) return ZERO; - if (value === '') return EMPTYSTRING; - - if (typeof value === 'object' || typeof value === 'function') { - try { - var then = value.then; - if (typeof then === 'function') { - return new Promise(then.bind(value)); - } - } catch (ex) { - return new Promise(function (resolve, reject) { - reject(ex); - }); - } - } - return valuePromise(value); -}; - -Promise.all = function (arr) { - var args = Array.prototype.slice.call(arr); - - return new Promise(function (resolve, reject) { - if (args.length === 0) return resolve([]); - var remaining = args.length; - function res(i, val) { - if (val && (typeof val === 'object' || typeof val === 'function')) { - if (val instanceof Promise && val.then === Promise.prototype.then) { - while (val._65 === 3) { - val = val._55; - } - if (val._65 === 1) return res(i, val._55); - if (val._65 === 2) reject(val._55); - val.then(function (val) { - res(i, val); - }, reject); - return; - } else { - var then = val.then; - if (typeof then === 'function') { - var p = new Promise(then.bind(val)); - p.then(function (val) { - res(i, val); - }, reject); - return; - } - } - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } - for (var i = 0; i < args.length; i++) { - res(i, args[i]); - } - }); -}; - -Promise.reject = function (value) { - return new Promise(function (resolve, reject) { - reject(value); - }); -}; - -Promise.race = function (values) { - return new Promise(function (resolve, reject) { - values.forEach(function(value){ - Promise.resolve(value).then(resolve, reject); - }); - }); -}; - -/* Prototype Methods */ - -Promise.prototype['catch'] = function (onRejected) { - return this.then(null, onRejected); -}; - -},{"./core.js":100}],102:[function(require,module,exports){ -// should work in any browser without browserify - -if (typeof Promise.prototype.done !== 'function') { - Promise.prototype.done = function (onFulfilled, onRejected) { - var self = arguments.length ? this.then.apply(this, arguments) : this - self.then(null, function (err) { - setTimeout(function () { - throw err - }, 0) - }) - } -} -},{}],103:[function(require,module,exports){ -// not "use strict" so we can declare global "Promise" - -var asap = require('asap'); - -if (typeof Promise === 'undefined') { - Promise = require('./lib/core.js') - require('./lib/es6-extensions.js') -} - -require('./polyfill-done.js'); - -},{"./lib/core.js":100,"./lib/es6-extensions.js":101,"./polyfill-done.js":102,"asap":98}]},{},[2])(2) -}); \ No newline at end of file diff --git a/bibli/less.min.js b/bibli/less.min.js deleted file mode 100755 index 03df8e6..0000000 --- a/bibli/less.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Less - Leaner CSS v3.7.1 - * http://lesscss.org - * - * Copyright (c) 2009-2018, Alexis Sellier - * Licensed under the Apache-2.0 License. - * - */ - - /** * @license Apache-2.0 - */ - -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.less=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g0||b.isFileProtocol?"development":"production");var c=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(a.location.hash);c&&(b.dumpLineNumbers=c[1]),void 0===b.useFileCache&&(b.useFileCache=!0),void 0===b.onReady&&(b.onReady=!0)}},{"./browser":3,"./utils":11}],2:[function(a,b,c){function d(a){a.filename&&console.warn(a),e.async||h.removeChild(i)}a("promise/polyfill");var e=a("../less/default-options")();if(window.less)for(key in window.less)window.less.hasOwnProperty(key)&&(e[key]=window.less[key]);a("./add-default-options")(window,e),e.plugins=e.plugins||[],window.LESS_PLUGINS&&(e.plugins=e.plugins.concat(window.LESS_PLUGINS));var f=b.exports=a("./index")(window,e);window.less=f;var g,h,i;e.onReady&&(/!watch/.test(window.location.hash)&&f.watch(),e.async||(g="body { display: none !important }",h=document.head||document.getElementsByTagName("head")[0],i=document.createElement("style"),i.type="text/css",i.styleSheet?i.styleSheet.cssText=g:i.appendChild(document.createTextNode(g)),h.appendChild(i)),f.registerStylesheetsImmediately(),f.pageLoadFinished=f.refresh("development"===f.env).then(d,d))},{"../less/default-options":16,"./add-default-options":1,"./index":8,"promise/polyfill":103}],3:[function(a,b,c){var d=a("./utils");b.exports={createCSS:function(a,b,c){var e=c.href||"",f="less:"+(c.title||d.extractId(e)),g=a.getElementById(f),h=!1,i=a.createElement("style");i.setAttribute("type","text/css"),c.media&&i.setAttribute("media",c.media),i.id=f,i.styleSheet||(i.appendChild(a.createTextNode(b)),h=null!==g&&g.childNodes.length>0&&i.childNodes.length>0&&g.firstChild.nodeValue===i.firstChild.nodeValue);var j=a.getElementsByTagName("head")[0];if(null===g||h===!1){var k=c&&c.nextSibling||null;k?k.parentNode.insertBefore(i,k):j.appendChild(i)}if(g&&h===!1&&g.parentNode.removeChild(g),i.styleSheet)try{i.styleSheet.cssText=b}catch(l){throw new Error("Couldn't reassign styleSheet.cssText.")}},currentScript:function(a){var b=a.document;return b.currentScript||function(){var a=b.getElementsByTagName("script");return a[a.length-1]}()}}},{"./utils":11}],4:[function(a,b,c){b.exports=function(a,b,c){var d=null;if("development"!==b.env)try{d="undefined"==typeof a.localStorage?null:a.localStorage}catch(e){}return{setCSS:function(a,b,e,f){if(d){c.info("saving "+a+" to cache.");try{d.setItem(a,f),d.setItem(a+":timestamp",b),e&&d.setItem(a+":vars",JSON.stringify(e))}catch(g){c.error('failed to save "'+a+'" to local storage for caching.')}}},getCSS:function(a,b,c){var e=d&&d.getItem(a),f=d&&d.getItem(a+":timestamp"),g=d&&d.getItem(a+":vars");if(c=c||{},g=g||"{}",f&&b.lastModified&&new Date(b.lastModified).valueOf()===new Date(f).valueOf()&&JSON.stringify(c)===g)return e}}}},{}],5:[function(a,b,c){var d=a("./utils"),e=a("./browser");b.exports=function(a,b,c){function f(b,f){var g,h,i="less-error-message:"+d.extractId(f||""),j='
  • {content}
  • ',k=a.document.createElement("div"),l=[],m=b.filename||f,n=m.match(/([^\/]+(\?.*)?)$/)[1];k.id=i,k.className="less-error-message",h="

    "+(b.type||"Syntax")+"Error: "+(b.message||"There is an error in your .less file")+'

    in '+n+" ";var o=function(a,b,c){void 0!==a.extract[b]&&l.push(j.replace(/\{line\}/,(parseInt(a.line,10)||0)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};b.line&&(o(b,0,""),o(b,1,"line"),o(b,2,""),h+="on line "+b.line+", column "+(b.column+1)+":

      "+l.join("")+"
    "),b.stack&&(b.extract||c.logLevel>=4)&&(h+="
    Stack Trace
    "+b.stack.split("\n").slice(1).join("
    ")),k.innerHTML=h,e.createCSS(a.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10

    in ' + filenameNoPath + ' '; - - var errorline = function (e, i, classname) { - if (e.extract[i] !== undefined) { - errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) - .replace(/\{class\}/, classname) - .replace(/\{content\}/, e.extract[i])); - } - }; - - if (e.line) { - errorline(e, 0, ''); - errorline(e, 1, 'line'); - errorline(e, 2, ''); - content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':