graphdb-workbench 10.0.0-M2-1 → 10.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/dist/0.f8448f998a59db17e94e.bundle.js +25 -0
- package/dist/1.46d9ecd4119bac145f3b.bundle.js +81 -0
- package/dist/10.a26ae97905866618b14e.bundle.js +7 -0
- package/dist/100.aef098a33fbb925e0d2d.bundle.js +1 -0
- package/dist/101.42eacc63e0fb5834b78a.bundle.js +1 -0
- package/dist/102.4f78eeab62aac245879e.bundle.js +1 -0
- package/dist/103.f38f3cd69ff610955aaf.bundle.js +1 -0
- package/dist/104.2e21f1462021dca17db1.bundle.js +1 -0
- package/dist/105.76381cb7984bcbc9ba9a.bundle.js +1 -0
- package/dist/106.23e14c6b280756d04533.bundle.js +1 -0
- package/dist/107.75e40619cb45972dc39f.bundle.js +1 -0
- package/dist/108.f09444e990531d27e0be.bundle.js +1 -0
- package/dist/109.ef97393181ee534042d8.bundle.js +1 -0
- package/dist/11.0fc995ac096734b915c6.bundle.js +1 -0
- package/dist/110.d59b8565d2255a282669.bundle.js +1 -0
- package/dist/111.fff9f089f65f01013923.bundle.js +1 -0
- package/dist/112.5bd3fcd7c37f1024fe26.bundle.js +1 -0
- package/dist/113.2fa29eca15d32deb3320.bundle.js +1 -0
- package/dist/114.d78615087abe68db7b2f.bundle.js +1 -0
- package/dist/115.558ce3da00d3be87d18a.bundle.js +1 -0
- package/dist/116.577aab1d9bafd0053623.bundle.js +1 -0
- package/dist/117.c20f037799328c931eba.bundle.js +1 -0
- package/dist/118.39c8b47405ab93c40847.bundle.js +1 -0
- package/dist/119.19ee7b3ae143f817c5b1.bundle.js +1 -0
- package/dist/12.7877dd6008df9acf44e1.bundle.js +1 -0
- package/dist/120.b944d5e63424d4307fc8.bundle.js +1 -0
- package/dist/121.3a8954e4c885c56a9817.bundle.js +1 -0
- package/dist/122.71a8cf0330504672fffc.bundle.js +1 -0
- package/dist/123.c6957ecb441d8a09932a.bundle.js +1 -0
- package/dist/124.27e85a0284e2ebeb7d6e.bundle.js +1 -0
- package/dist/125.9e925ae0dd1217d81d89.bundle.js +1 -0
- package/dist/126.a32b57d6108545746ed3.bundle.js +1 -0
- package/dist/127.90d1975083eef3d4a715.bundle.js +1 -0
- package/dist/128.544f1a82e19dd245c7de.bundle.js +1 -0
- package/dist/129.64ec11449e0c734500c2.bundle.js +1 -0
- package/dist/13.fe78f15334507bcc08ae.bundle.js +1 -0
- package/dist/130.f8e68ac86e17b3622d40.bundle.js +1 -0
- package/dist/131.4868fc3a837277c30273.bundle.js +1 -0
- package/dist/132.7815ab1168a254cb0d47.bundle.js +1 -0
- package/dist/133.f87e1685dd5ed920f9b5.bundle.js +1 -0
- package/dist/134.8998ff724a077ecff2ce.bundle.js +1 -0
- package/dist/135.c07268699f76ef7a02ff.bundle.js +1 -0
- package/dist/136.908f1f6fe3054f99b560.bundle.js +1 -0
- package/dist/137.8262ca9736e9818284cd.bundle.js +1 -0
- package/dist/138.8c149cad49010a65b3ca.bundle.js +1 -0
- package/dist/139.97ee12e7a3c05be03456.bundle.js +1 -0
- package/dist/14.0bb211bcdc29c6d8b3b5.bundle.js +29 -0
- package/dist/140.6b3c57ffec700081328b.bundle.js +1 -0
- package/dist/141.4981056237955a34b2e2.bundle.js +1 -0
- package/dist/142.4d60c1795eed3a9570f9.bundle.js +1 -0
- package/dist/143.b7057852f7859cf39e75.bundle.js +1 -0
- package/dist/144.3f85f8eacae521d52355.bundle.js +1 -0
- package/dist/145.9281069e9e77978b640a.bundle.js +1 -0
- package/dist/146.51d2987de4defe7df7c7.bundle.js +1 -0
- package/dist/147.54016549674d35bc2869.bundle.js +1 -0
- package/dist/148.ad95b30f508a0bd02970.bundle.js +1 -0
- package/dist/149.8dd1281617389f8c189b.bundle.js +1 -0
- package/dist/15.6a74adbd30b4d2930e10.bundle.js +1 -0
- package/dist/150.5e0ee4350f8edd0e7b9a.bundle.js +1 -0
- package/dist/151.6b81c99a1ec1b184b82d.bundle.js +1 -0
- package/dist/152.2e1aa910a68f0086825b.bundle.js +1 -0
- package/dist/153.7a64973115bdaec26406.bundle.js +1 -0
- package/dist/154.5938248b52830d0a80a2.bundle.js +1 -0
- package/dist/155.a4511849c1001c5f2ba6.bundle.js +1 -0
- package/dist/156.bbcaf52acb0cecbc6257.bundle.js +1 -0
- package/dist/157.51181d03518519f84b5e.bundle.js +1 -0
- package/dist/158.640e412f6002ee1d7341.bundle.js +1 -0
- package/dist/159.10457cbb053c1315d93a.bundle.js +1 -0
- package/dist/16.2f60fbeaccd97aefaae2.bundle.js +1 -0
- package/dist/160.c46bfdf09357a4c62a53.bundle.js +1 -0
- package/dist/{103.05b86c1b360c05133b49.bundle.js → 161.0f35ee11981f0ea0455f.bundle.js} +1 -2
- package/dist/{104.089568ff7c49a29de892.bundle.js → 162.fef28120701e7d200b01.bundle.js} +1 -2
- package/dist/{105.81b74220f7fa646e719b.bundle.js → 163.38565d40ac5f71d1c875.bundle.js} +1 -2
- package/dist/164.b2116f472aa847618aee.bundle.js +1 -0
- package/dist/168.2d4b5a75da5430c73efc.bundle.js +1 -0
- package/dist/169.6897f56896e3664e8b53.bundle.js +1 -0
- package/dist/17.2bff7856b13fd72e2db4.bundle.js +1 -0
- package/dist/170.d5c0d475c5b6ad84ef77.bundle.js +1 -0
- package/dist/171.60cdc91b2bf682a20911.bundle.js +1 -0
- package/dist/172.1fb9ead3e508a7cfa5f3.bundle.js +1 -0
- package/dist/173.95602c81a2692624a015.bundle.js +1 -0
- package/dist/174.aac1982e67b5ca1731c1.bundle.js +1 -0
- package/dist/175.5e49a28397900168f816.bundle.js +1 -0
- package/dist/176.2e6d1a9f4eac4fdd8422.bundle.js +1 -0
- package/dist/177.3b6aabf3c4db8519ea74.bundle.js +1 -0
- package/dist/178.e10370553beb5c6bb839.bundle.js +1 -0
- package/dist/179.784cbd536b8e636c1272.bundle.js +1 -0
- package/dist/18.d6be3e6583bf3dacd54f.bundle.js +2 -0
- package/dist/180.d37db50f3ce1b3a04a65.bundle.js +1 -0
- package/dist/181.f307cabdc4ed7a10ff64.bundle.js +1 -0
- package/dist/182.e8fe148e90fcd334b9b9.bundle.js +1 -0
- package/dist/183.a086e00d4dc3c7855611.bundle.js +1 -0
- package/dist/184.ff8a39692d0ff666c9e6.bundle.js +1 -0
- package/dist/185.8b9f0b866e848f8a1aac.bundle.js +1 -0
- package/dist/186.798880846274da7033da.bundle.js +1 -0
- package/dist/{120.3b0b67fbfa81ec95e044.bundle.js → 187.eb92a35d38294bc21703.bundle.js} +1 -2
- package/dist/{121.ff452d05188836228deb.bundle.js → 188.641582484af80415d29a.bundle.js} +1 -2
- package/dist/189.7ccbb0ef67513ae7001a.bundle.js +1 -0
- package/dist/19.c2a5c3e7a49a4acba486.bundle.js +2 -0
- package/dist/{123.289bb9a87ce416004c0a.bundle.js → 190.a3609218c5d8e873a46f.bundle.js} +1 -2
- package/dist/191.4c817606bf66c16d9ad1.bundle.js +1 -0
- package/dist/{125.51ff26fe7687752811e4.bundle.js → 192.21f366a1ea7e6905f120.bundle.js} +1 -2
- package/dist/193.4d40b788bd7ddcf16788.bundle.js +1 -0
- package/dist/{127.4d0a2164fb95df43ea22.bundle.js → 194.0170093f1daf20e82b5f.bundle.js} +1 -2
- package/dist/{128.c7a3530622ede2f34e72.bundle.js → 195.d7d8af61458f9416878f.bundle.js} +1 -2
- package/dist/{129.2d32313059ae96dba010.bundle.js → 196.6e6b7589cd1342a0b2b5.bundle.js} +1 -2
- package/dist/{130.7302112cf14a10bd1306.bundle.js → 197.c071fa1fe9e081a3b053.bundle.js} +1 -2
- package/dist/{131.eb262b5100305bdc23ee.bundle.js → 198.3c5ca9ac5a745b4b23a1.bundle.js} +1 -2
- package/dist/199.00ac5221a334189ea09a.bundle.js +1 -0
- package/dist/2.78b4e53269171c9c08a5.bundle.js +1 -0
- package/dist/20.8fd969e3860ddffedcc3.bundle.js +1 -0
- package/dist/{133.f855496341ba657eb673.bundle.js → 200.aa3f4dcf9cf98409dbf5.bundle.js} +1 -2
- package/dist/201.a1b147e78f43a3bc99c3.bundle.js +1 -0
- package/dist/202.20e71b18f57e7d234ff0.bundle.js +1 -0
- package/dist/{136.74f131c98a163b48e3df.bundle.js → 203.0219c2ba2d4fe4881af2.bundle.js} +1 -2
- package/dist/204.cc169603e18b84e7e65b.bundle.js +1 -0
- package/dist/{138.9111fe731587313e4574.bundle.js → 205.99fb3c89cd9b9183ddbf.bundle.js} +1 -2
- package/dist/206.43b04d2170165e13353c.bundle.js +1 -0
- package/dist/207.798c195e1d7d3f301131.bundle.js +1 -0
- package/dist/208.34f042066a757f4fd8c0.bundle.js +1 -0
- package/dist/{142.5ced0a8e7a08aea7988f.bundle.js → 209.288844c6a42ff4d5685a.bundle.js} +1 -2
- package/dist/21.c981976c6528073c0a2f.bundle.js +1 -0
- package/dist/210.1ac38e393ca959703d4b.bundle.js +1 -0
- package/dist/211.d2721b9785e609e2f817.bundle.js +1 -0
- package/dist/212.b6b19c939f21132b451c.bundle.js +1 -0
- package/dist/213.5a5116f764e6357e53ab.bundle.js +1 -0
- package/dist/{147.f6bd445276a200981cff.bundle.js → 214.a2640be51c42d820bb83.bundle.js} +1 -2
- package/dist/215.209396a71f130477e2b3.bundle.js +1 -0
- package/dist/216.16e2e982acc750b4045a.bundle.js +1 -0
- package/dist/217.8540eb1d1a0946e72dbf.bundle.js +1 -0
- package/dist/218.ef33580c82d20f39f75f.bundle.js +1 -0
- package/dist/219.1652bc940cdd0088dc18.bundle.js +1 -0
- package/dist/22.9d339503774f4f6c0a8b.bundle.js +1 -0
- package/dist/{153.ebc378a7a60222b69484.bundle.js → 220.f8f9c348b1fc0cc72bd6.bundle.js} +1 -2
- package/dist/221.b18a92f0ba880edaebbf.bundle.js +1 -0
- package/dist/222.a52ebecd1d5201437ebe.bundle.js +1 -0
- package/dist/23.87ca8226d464e3699b8e.bundle.js +3 -0
- package/dist/24.9076b75f45ce0579f7be.bundle.js +1 -0
- package/dist/25.073791b8dd02c5b31183.bundle.js +1 -0
- package/dist/26.6e06be7172a866ad45f9.bundle.js +2 -0
- package/dist/27.5152c2a1f3b1369e21b0.bundle.js +1 -0
- package/dist/28.90b784e728e3d5e4c6aa.bundle.js +1 -0
- package/dist/29.e2309b858706718f1732.bundle.js +1 -0
- package/dist/3.cf89087c137e759ecd19.bundle.js +27 -0
- package/dist/30.32fb84930c42bae43a74.bundle.js +1 -0
- package/dist/31.31b7b4bd073b82c09fda.bundle.js +1 -0
- package/dist/32.6725d94946764db833b8.bundle.js +1 -0
- package/dist/33.fa9f0e662060f2e97267.bundle.js +1 -0
- package/dist/34.af22bc6d5ed2bcb72a09.bundle.js +1 -0
- package/dist/35.e601e19e63c6ddaf2484.bundle.js +1 -0
- package/dist/36.df47a70d8efbf1cd033b.bundle.js +1 -0
- package/dist/37.085cdb373f74d55eee07.bundle.js +2 -0
- package/dist/38.fc172c7b0d24ab0f8a35.bundle.js +1 -0
- package/dist/39.5ca9fa51ec3c63459317.bundle.js +1 -0
- package/dist/4.851f9ade6202116ecfb9.bundle.js +1 -0
- package/dist/40.309ec5212fd53fe696bb.bundle.js +1 -0
- package/dist/41.3870740f1d24570cb415.bundle.js +1 -0
- package/dist/42.b926c2c8620df5c7ed6d.bundle.js +1 -0
- package/dist/43.d4551e1f6cac0a1a77e5.bundle.js +1 -0
- package/dist/44.46c9e2d54a9f07d78368.bundle.js +1 -0
- package/dist/45.a916daee1f0c6873c890.bundle.js +1 -0
- package/dist/46.4f57238bd032edc81d6d.bundle.js +1 -0
- package/dist/47.4fbfdaa63628c501a30c.bundle.js +1 -0
- package/dist/48.3fbd50adcb0c7dd7ec60.bundle.js +1 -0
- package/dist/49.0707795b3b6e40387da8.bundle.js +1 -0
- package/dist/5.7cfbc07050f137932ffe.bundle.js +1 -0
- package/dist/50.8f6cc698b42c96f2b41f.bundle.js +1 -0
- package/dist/51.514a339efd6cd11db0f8.bundle.js +1 -0
- package/dist/52.410a7d8b4cb433fb24ca.bundle.js +1 -0
- package/dist/53.174d18435f7bf3bf05a0.bundle.js +1 -0
- package/dist/54.7cb3bd3ae8055e350629.bundle.js +1 -0
- package/dist/55.f0762e755ba58cbaac26.bundle.js +1 -0
- package/dist/56.3b0312e77f8607a4d957.bundle.js +1 -0
- package/dist/57.dfb7a710da8ca09c725b.bundle.js +1 -0
- package/dist/58.ac0fa95bbbe4b2dfb0fc.bundle.js +1 -0
- package/dist/59.273ffcd48e856d2752ff.bundle.js +1 -0
- package/dist/6.c5eea752e1f541f494e8.bundle.js +1 -0
- package/dist/60.00a29320ea162becd718.bundle.js +1 -0
- package/dist/61.3794de8b6d022738bafa.bundle.js +1 -0
- package/dist/62.cf39ad55adb1616560ec.bundle.js +1 -0
- package/dist/63.8880f667c958d12b338b.bundle.js +1 -0
- package/dist/64.fdd90fedc8a5dc3cacaf.bundle.js +1 -0
- package/dist/65.cdc961a8042c385c49c6.bundle.js +1 -0
- package/dist/66.c3b906de2fcf69089b7b.bundle.js +1 -0
- package/dist/67.9c851e5930459a5f5903.bundle.js +1 -0
- package/dist/68.05bba948c414a1e21c8f.bundle.js +1 -0
- package/dist/69.c5561c83fe410ea9a908.bundle.js +1 -0
- package/dist/7.14f008aaac190939acd3.bundle.js +7 -0
- package/dist/70.f2557c225be5923bab24.bundle.js +1 -0
- package/dist/71.e9c3c5ccc70f443c97cf.bundle.js +1 -0
- package/dist/72.0780a8424293909f94a4.bundle.js +1 -0
- package/dist/73.57e88cee0af3f67aee77.bundle.js +1 -0
- package/dist/74.48e90caf0b5ecd351f1d.bundle.js +1 -0
- package/dist/75.c75a824264d0e67421ed.bundle.js +1 -0
- package/dist/76.2ad0f5373462bc70bebf.bundle.js +1 -0
- package/dist/77.303a075d21928354102c.bundle.js +1 -0
- package/dist/78.66f3e9630550f20287ff.bundle.js +1 -0
- package/dist/79.29d39a29721f936ae688.bundle.js +1 -0
- package/dist/8.b5e29f80f8a5766d70d5.bundle.js +2 -0
- package/dist/80.8af0388db859fcc9fbf3.bundle.js +1 -0
- package/dist/{47.686e599732ae6f41120c.bundle.js → 81.2ff1f5047ab4e0591585.bundle.js} +1 -2
- package/dist/82.27bb51dfeb4898504e96.bundle.js +1 -0
- package/dist/83.a59d34bc50cf323af43d.bundle.js +1 -0
- package/dist/84.a4ee7bb5d3ed2e6ead5e.bundle.js +1 -0
- package/dist/{51.895a3dacdc3a8eaee275.bundle.js → 85.1f1b07562fbf97ab3e11.bundle.js} +1 -2
- package/dist/86.637667a4555ae621aff0.bundle.js +1 -0
- package/dist/87.b76338a62297ad83960b.bundle.js +1 -0
- package/dist/88.532e7295b49b1071d45c.bundle.js +1 -0
- package/dist/89.90bb1cf65f183ecce47c.bundle.js +1 -0
- package/dist/9.610b595b60a0fc51466a.bundle.js +1 -0
- package/dist/90.683c4d5b142356f274ef.bundle.js +1 -0
- package/dist/{56.91947e80d8e04223ac58.bundle.js → 91.2437dfc2ea1bc89f53f3.bundle.js} +1 -2
- package/dist/92.a12cfd3b602e98b344de.bundle.js +1 -0
- package/dist/93.a5cb6192d32cb016bb60.bundle.js +1 -0
- package/dist/94.f6a3e7628449796419b6.bundle.js +1 -0
- package/dist/95.15f0e472c49c81a68c3a.bundle.js +1 -0
- package/dist/96.2bf3b75fb0efb6b9e7e8.bundle.js +1 -0
- package/dist/97.bd1988af419f7373b569.bundle.js +1 -0
- package/dist/98.060c6842b3a8ed94dd20.bundle.js +1 -0
- package/dist/{64.ac922cb38c3ff6c431fb.bundle.js → 99.6360b70da56083cd76fe.bundle.js} +1 -2
- package/dist/bundle.39b836d40f0926aeec16.bundle.js +91 -0
- package/dist/css/aclmanagement.css +114 -0
- package/dist/css/angular-tooltips.css +144 -0
- package/dist/css/autocomplete-select.css +62 -0
- package/dist/css/backup-and-restore.css +7 -0
- package/dist/css/bootstrap-graphdb-theme-dark-auto.css +36 -0
- package/dist/css/bootstrap-graphdb-theme.css +514 -252
- package/dist/css/clustermanagement.css +145 -266
- package/dist/css/common.css +105 -0
- package/dist/css/dependencies.css +4 -4
- package/dist/css/domain-range-graph.css +3 -3
- package/dist/css/explore.css +7 -1
- package/dist/css/export.css +13 -9
- package/dist/css/find.css +2 -3
- package/dist/css/fonts/icons.eot +0 -0
- package/dist/css/fonts/icons.svg +14 -5
- package/dist/css/fonts/icons.ttf +0 -0
- package/dist/css/fonts/icons.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff2 +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff2 +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/css/graphs-config.css +4 -4
- package/dist/css/graphs-vizualizations.css +11 -10
- package/dist/css/guides.css +9 -0
- package/dist/css/jmx.css +22 -0
- package/dist/css/lib/angular-xeditable/xeditable.min.css +2 -2
- package/dist/css/new-sparql.css +68 -2
- package/dist/css/operations-statuses-monitor.css +111 -0
- package/dist/css/plugins.css +7 -18
- package/dist/css/rdf-class-hierarchy-labels.css +2 -2
- package/dist/css/rdf-class-hierarchy.css +3 -3
- package/dist/css/rdf-details-side-panel.css +8 -1
- package/dist/css/rdf-resource-search.css +5 -2
- package/dist/css/repositories.css +73 -31
- package/dist/css/repository.create.css +14 -4
- package/dist/css/shepherd-custom.css +80 -0
- package/dist/css/workbench-custom.css +54 -14
- package/dist/css/yasr.custom.css +28 -6
- package/dist/font/{icons.f404525bf0491c43fc1c35fc43fe14d8.eot → icons.23e96f215ba03e98233de883d2c30b60.eot} +0 -0
- package/dist/i18n/locale-en.json +488 -129
- package/dist/i18n/locale-fr.json +602 -261
- package/dist/icon.png +0 -0
- package/dist/img/{graphdb-logo-sq.75ddb875d9a986a6ac944450ae134725.svg → graphdb-logo-sq.3a5fb4b3f1e0e248dc308da1bf4de9f8.svg} +4 -4
- package/dist/img/{graphdb-logo.cb18d544b9cf2eb6062daa81bdb1f850.svg → graphdb-logo.741abf3e3881e1566e4504c9f00b91c0.svg} +3 -4
- package/dist/img/{graphdb-small.635110bdf15de2ad589b6e3fdaa75887.svg → graphdb-small.5f94ee13e65870be1db31bb89e6deded.svg} +6 -6
- package/dist/img/graphdb-splash.1ef2940889acddc03c7defb3f9f41f8d.svg +1 -0
- package/dist/img/{icons.2271b2cdd5a3d1037d80bf831f4918cc.svg → icons.ab6168834b8775f511d09c8fad540b27.svg} +14 -5
- package/dist/index.html +87 -85
- package/dist/js/angular/autocomplete/templates/modal/add-label.html +9 -8
- package/dist/js/angular/chatgpt/templates/chat.html +113 -0
- package/dist/js/angular/chatgpt/templates/chatInfo.html +11 -0
- package/dist/js/angular/chatgpt/templates/modal/settings.html +61 -0
- package/dist/js/angular/clustermanagement/templates/modal/add-nodes-dialog.html +67 -0
- package/dist/js/angular/clustermanagement/templates/modal/cluster-create-dialog.html +173 -0
- package/dist/js/angular/clustermanagement/templates/modal/cluster-delete-dialog.html +9 -14
- package/dist/js/angular/clustermanagement/templates/modal/cluster-edit-dialog.html +118 -0
- package/dist/js/angular/clustermanagement/templates/modal/remove-nodes-dialog.html +39 -0
- package/dist/js/angular/clustermanagement/templates/modal/replace-nodes-dialog.html +86 -0
- package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +18 -0
- package/dist/js/angular/core/directives/languageselector/templates/languageSelector.html +9 -7
- package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +57 -0
- package/dist/js/angular/core/directives/queryeditor/templates/query-editor.html +44 -56
- package/dist/js/angular/core/directives/queryeditor/templates/query-sample.html +11 -11
- package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +4 -6
- package/dist/js/angular/core/templates/core-errors.html +27 -18
- package/dist/js/angular/core/templates/inactive-plugin-warning-page.html +1 -2
- package/dist/js/angular/core/templates/modal/copy-to-clipboard-modal.html +9 -10
- package/dist/js/angular/core/templates/modal/modal-warning.html +1 -1
- package/dist/js/angular/core/templates/search-resource-input.html +9 -9
- package/dist/js/angular/externalsync/templates/deleteConnector.html +5 -5
- package/dist/js/angular/graphexplore/templates/modal/save-graph.html +10 -11
- package/dist/js/angular/graphexplore/templates/rdfsCommentLabelTemplate.html +4 -6
- package/dist/js/angular/graphexplore/templates/searchIconInputTemplate.html +5 -7
- package/dist/js/angular/import/templates/filesTable.html +15 -15
- package/dist/js/angular/import/templates/settingsModal.html +231 -231
- package/dist/js/angular/import/templates/textSnippet.html +4 -4
- package/dist/js/angular/import/templates/urlImport.html +7 -5
- package/dist/js/angular/repositories/templates/fedx-repo.html +53 -49
- package/dist/js/angular/repositories/templates/ontop-repo.html +191 -60
- package/dist/js/angular/security/templates/modal/default-authorities.html +12 -12
- package/dist/js/angular/security/templates/user.html +102 -41
- package/dist/js/angular/security/templates/users.html +24 -17
- package/dist/js/angular/settings/modal/location-settings.html +17 -18
- package/dist/js/angular/settings/modal/validate-license.html +19 -6
- package/dist/js/angular/templates/graphdb-small.svg +6 -6
- package/dist/js/angular/templates/modal/add-fedx-remote-repo.html +17 -15
- package/dist/js/angular/templates/modal/add-location.html +18 -22
- package/dist/js/angular/templates/modal/edit-location.html +11 -11
- package/dist/js/angular/templates/modal/editRepoFile.html +2 -2
- package/dist/js/angular/templates/modal/upload-repository-config.html +2 -2
- package/dist/js/angular/templates/repositorySize.html +7 -1
- package/dist/js/lib/angucomplete-alt/angucomplete-alt.css +2 -2
- package/dist/js/lib/rzslider/rzslider.min.css +1 -1
- package/dist/license-checker-static.json +128 -0
- package/dist/license-checker.json +872 -0
- package/dist/main.3ac2b4b19f56209c6467.css +1 -0
- package/dist/main.948c3b96766ce09e145b.bundle.js +1 -0
- package/dist/pages/aclmanagement.html +177 -0
- package/dist/pages/autocomplete.html +16 -12
- package/dist/pages/choose-repository-type.html +8 -8
- package/dist/pages/cluster-management/clusterInfo.html +160 -138
- package/dist/pages/connectorsInfo.html +23 -18
- package/dist/pages/create-index.html +18 -18
- package/dist/pages/createConnector.html +137 -137
- package/dist/pages/dependencies.html +23 -31
- package/dist/pages/domainRangeInfo.html +16 -19
- package/dist/pages/edit.html +15 -15
- package/dist/pages/explore.html +22 -25
- package/dist/pages/export.html +38 -39
- package/dist/pages/find.html +3 -3
- package/dist/pages/graph-config/saveGraphConfig.html +43 -43
- package/dist/pages/graphs-visualizations.html +71 -78
- package/dist/pages/guides.html +60 -0
- package/dist/pages/home.html +46 -28
- package/dist/pages/import.html +11 -10
- package/dist/pages/info.html +18 -18
- package/dist/pages/jdbc-create.html +48 -46
- package/dist/pages/jdbc.html +4 -4
- package/dist/pages/licenseInfo.html +66 -48
- package/dist/pages/login.html +5 -6
- package/dist/pages/monitor/backup-and-restore.html +80 -0
- package/dist/pages/monitor/queries.html +7 -8
- package/dist/pages/monitor/resources.html +213 -79
- package/dist/pages/namespaces.html +22 -21
- package/dist/pages/plugins.html +9 -10
- package/dist/pages/rdfClassHierarchyInfo.html +31 -35
- package/dist/pages/rdfrank.html +25 -27
- package/dist/pages/registerLicenseInfo.html +10 -12
- package/dist/pages/repositories.html +170 -193
- package/dist/pages/repository.html +124 -58
- package/dist/pages/similarity-indexes.html +18 -18
- package/dist/pages/sparql-template-create.html +30 -29
- package/dist/pages/sparql-templates.html +4 -4
- package/dist/pages/sparql.html +11 -11
- package/dist/pages/ux-test1.html +102 -0
- package/dist/pages/ux-test2.html +17 -0
- package/dist/pages/webapi.html +4 -4
- package/dist/plugin-registry.js +14 -0
- package/dist/plugins.js +1967 -84
- package/dist/res/sparql/keyboard-shortcuts.html +7 -1
- package/dist/res/swagger/css/onto-theme.css +8 -0
- package/dist/res/swagger/css/reset.css +1 -2
- package/dist/res/swagger/css/screen.css +6 -15
- package/dist/res/swagger/fonts/icons.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff2 +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff2 +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-italic.woff +0 -0
- package/dist/res/swagger/fonts/rubik-italic.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-light.woff +0 -0
- package/dist/res/swagger/fonts/rubik-light.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-lightitalic.woff +0 -0
- package/dist/res/swagger/fonts/rubik-lightitalic.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-medium.woff +0 -0
- package/dist/res/swagger/fonts/rubik-medium.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-mediumitalic.woff +0 -0
- package/dist/res/swagger/fonts/rubik-mediumitalic.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-regular.woff +0 -0
- package/dist/res/swagger/fonts/rubik-regular.woff2 +0 -0
- package/dist/res/swagger/index.html +27 -25
- package/dist/vendor.7b6ede99ef82acd3dcf5.bundle.js +27 -0
- package/dist/{vendor.4ba46e62f4d43dab5e82.css → vendor.d1c629ceaacea40a5f4a.css} +1 -1
- package/package.json +13 -9
- package/dist/0.32d0f91ca9c8d09fb6f1.bundle.js +0 -82
- package/dist/0.32d0f91ca9c8d09fb6f1.bundle.js.map +0 -1
- package/dist/1.6300131e72a9f28f9df3.bundle.js +0 -27
- package/dist/1.6300131e72a9f28f9df3.bundle.js.map +0 -1
- package/dist/10.bb0713b18c3e55445fa7.bundle.js +0 -2
- package/dist/10.bb0713b18c3e55445fa7.bundle.js.map +0 -1
- package/dist/100.acbece8e389effbcfa2e.bundle.js +0 -2
- package/dist/100.acbece8e389effbcfa2e.bundle.js.map +0 -1
- package/dist/101.abc28aeafc8c037b80dc.bundle.js +0 -2
- package/dist/101.abc28aeafc8c037b80dc.bundle.js.map +0 -1
- package/dist/102.236df15ec49946c8799a.bundle.js +0 -2
- package/dist/102.236df15ec49946c8799a.bundle.js.map +0 -1
- package/dist/103.05b86c1b360c05133b49.bundle.js.map +0 -1
- package/dist/104.089568ff7c49a29de892.bundle.js.map +0 -1
- package/dist/105.81b74220f7fa646e719b.bundle.js.map +0 -1
- package/dist/106.5de7943f8a3adda97372.bundle.js +0 -2
- package/dist/106.5de7943f8a3adda97372.bundle.js.map +0 -1
- package/dist/11.288d37db1902f00f7c8e.bundle.js +0 -2
- package/dist/11.288d37db1902f00f7c8e.bundle.js.map +0 -1
- package/dist/110.5a553b21d45a64e7e321.bundle.js +0 -2
- package/dist/110.5a553b21d45a64e7e321.bundle.js.map +0 -1
- package/dist/111.04e34833a2c4fc227899.bundle.js +0 -2
- package/dist/111.04e34833a2c4fc227899.bundle.js.map +0 -1
- package/dist/112.b2bdfd64c50509d05503.bundle.js +0 -2
- package/dist/112.b2bdfd64c50509d05503.bundle.js.map +0 -1
- package/dist/113.b386b036c2a3d9077f64.bundle.js +0 -2
- package/dist/113.b386b036c2a3d9077f64.bundle.js.map +0 -1
- package/dist/114.0768e042a8e6ec856942.bundle.js +0 -2
- package/dist/114.0768e042a8e6ec856942.bundle.js.map +0 -1
- package/dist/115.374b221f284e8755ef31.bundle.js +0 -2
- package/dist/115.374b221f284e8755ef31.bundle.js.map +0 -1
- package/dist/116.ca9d40889c222f47c45f.bundle.js +0 -2
- package/dist/116.ca9d40889c222f47c45f.bundle.js.map +0 -1
- package/dist/117.92f7630bfb95444a87e8.bundle.js +0 -2
- package/dist/117.92f7630bfb95444a87e8.bundle.js.map +0 -1
- package/dist/118.7e28dcfd80b93a705d71.bundle.js +0 -2
- package/dist/118.7e28dcfd80b93a705d71.bundle.js.map +0 -1
- package/dist/119.e3a038ffb960ed3661fe.bundle.js +0 -2
- package/dist/119.e3a038ffb960ed3661fe.bundle.js.map +0 -1
- package/dist/12.9004ab127289745129a4.bundle.js +0 -4
- package/dist/12.9004ab127289745129a4.bundle.js.map +0 -1
- package/dist/120.3b0b67fbfa81ec95e044.bundle.js.map +0 -1
- package/dist/121.ff452d05188836228deb.bundle.js.map +0 -1
- package/dist/122.1b8056c745358fa2f6cb.bundle.js +0 -2
- package/dist/122.1b8056c745358fa2f6cb.bundle.js.map +0 -1
- package/dist/123.289bb9a87ce416004c0a.bundle.js.map +0 -1
- package/dist/124.75965fcb93d0fe988609.bundle.js +0 -2
- package/dist/124.75965fcb93d0fe988609.bundle.js.map +0 -1
- package/dist/125.51ff26fe7687752811e4.bundle.js.map +0 -1
- package/dist/126.b89a0728154793be4eb9.bundle.js +0 -2
- package/dist/126.b89a0728154793be4eb9.bundle.js.map +0 -1
- package/dist/127.4d0a2164fb95df43ea22.bundle.js.map +0 -1
- package/dist/128.c7a3530622ede2f34e72.bundle.js.map +0 -1
- package/dist/129.2d32313059ae96dba010.bundle.js.map +0 -1
- package/dist/13.897f9af290de9fbd43bb.bundle.js +0 -16
- package/dist/13.897f9af290de9fbd43bb.bundle.js.map +0 -1
- package/dist/130.7302112cf14a10bd1306.bundle.js.map +0 -1
- package/dist/131.eb262b5100305bdc23ee.bundle.js.map +0 -1
- package/dist/132.264b9ebf860e308417ad.bundle.js +0 -2
- package/dist/132.264b9ebf860e308417ad.bundle.js.map +0 -1
- package/dist/133.f855496341ba657eb673.bundle.js.map +0 -1
- package/dist/134.91de2ab11c49967200ad.bundle.js +0 -2
- package/dist/134.91de2ab11c49967200ad.bundle.js.map +0 -1
- package/dist/135.82e48e81e60b2ab89e04.bundle.js +0 -2
- package/dist/135.82e48e81e60b2ab89e04.bundle.js.map +0 -1
- package/dist/136.74f131c98a163b48e3df.bundle.js.map +0 -1
- package/dist/137.89253235e0e48f86534b.bundle.js +0 -2
- package/dist/137.89253235e0e48f86534b.bundle.js.map +0 -1
- package/dist/138.9111fe731587313e4574.bundle.js.map +0 -1
- package/dist/139.642cab70149cdfc8c034.bundle.js +0 -2
- package/dist/139.642cab70149cdfc8c034.bundle.js.map +0 -1
- package/dist/14.3c22be70e13b5347940a.bundle.js +0 -3
- package/dist/14.3c22be70e13b5347940a.bundle.js.map +0 -1
- package/dist/140.8fcbd3b16a54b9ca5d80.bundle.js +0 -2
- package/dist/140.8fcbd3b16a54b9ca5d80.bundle.js.map +0 -1
- package/dist/141.09939d5f25d69d9e1bdd.bundle.js +0 -2
- package/dist/141.09939d5f25d69d9e1bdd.bundle.js.map +0 -1
- package/dist/142.5ced0a8e7a08aea7988f.bundle.js.map +0 -1
- package/dist/143.1bd6e2941d5c9fdc9e77.bundle.js +0 -2
- package/dist/143.1bd6e2941d5c9fdc9e77.bundle.js.map +0 -1
- package/dist/144.34dd1b710f93da283e39.bundle.js +0 -2
- package/dist/144.34dd1b710f93da283e39.bundle.js.map +0 -1
- package/dist/145.832e90a54396296da91b.bundle.js +0 -2
- package/dist/145.832e90a54396296da91b.bundle.js.map +0 -1
- package/dist/146.a4ab1f2f5177d9e27861.bundle.js +0 -2
- package/dist/146.a4ab1f2f5177d9e27861.bundle.js.map +0 -1
- package/dist/147.f6bd445276a200981cff.bundle.js.map +0 -1
- package/dist/148.1c23268b87514b7220b3.bundle.js +0 -2
- package/dist/148.1c23268b87514b7220b3.bundle.js.map +0 -1
- package/dist/149.82fc16905f1377c6610a.bundle.js +0 -2
- package/dist/149.82fc16905f1377c6610a.bundle.js.map +0 -1
- package/dist/15.ba4fe6f57951d2f73adc.bundle.js +0 -2
- package/dist/15.ba4fe6f57951d2f73adc.bundle.js.map +0 -1
- package/dist/150.6d8e3bb0cbc5774322d9.bundle.js +0 -2
- package/dist/150.6d8e3bb0cbc5774322d9.bundle.js.map +0 -1
- package/dist/151.c752cbb4d5f9299df813.bundle.js +0 -2
- package/dist/151.c752cbb4d5f9299df813.bundle.js.map +0 -1
- package/dist/152.78d7840c4b8f93748bfe.bundle.js +0 -2
- package/dist/152.78d7840c4b8f93748bfe.bundle.js.map +0 -1
- package/dist/153.ebc378a7a60222b69484.bundle.js.map +0 -1
- package/dist/154.4452ad65074e44967389.bundle.js +0 -2
- package/dist/154.4452ad65074e44967389.bundle.js.map +0 -1
- package/dist/155.12819130f26753e109ad.bundle.js +0 -2
- package/dist/155.12819130f26753e109ad.bundle.js.map +0 -1
- package/dist/16.a236b38d63123b1a3c61.bundle.js +0 -4
- package/dist/16.a236b38d63123b1a3c61.bundle.js.map +0 -1
- package/dist/17.d8d59fa7fbb3b422fdf8.bundle.js +0 -2
- package/dist/17.d8d59fa7fbb3b422fdf8.bundle.js.map +0 -1
- package/dist/18.bc2da9ff57be136ef082.bundle.js +0 -2
- package/dist/18.bc2da9ff57be136ef082.bundle.js.map +0 -1
- package/dist/19.19811699b6e54f19f71e.bundle.js +0 -3
- package/dist/19.19811699b6e54f19f71e.bundle.js.map +0 -1
- package/dist/2.fb2f97f5c543a24296f6.bundle.js +0 -2
- package/dist/2.fb2f97f5c543a24296f6.bundle.js.map +0 -1
- package/dist/20.df3652981fc73c6a8b8c.bundle.js +0 -2
- package/dist/20.df3652981fc73c6a8b8c.bundle.js.map +0 -1
- package/dist/21.b7fbdf3c3b22b578928c.bundle.js +0 -2
- package/dist/21.b7fbdf3c3b22b578928c.bundle.js.map +0 -1
- package/dist/22.2da0e8ec2ac2048ecd60.bundle.js +0 -3
- package/dist/22.2da0e8ec2ac2048ecd60.bundle.js.map +0 -1
- package/dist/23.4140c4c20347efc963a4.bundle.js +0 -2
- package/dist/23.4140c4c20347efc963a4.bundle.js.map +0 -1
- package/dist/24.219ce55f8f6a5bd02dad.bundle.js +0 -2
- package/dist/24.219ce55f8f6a5bd02dad.bundle.js.map +0 -1
- package/dist/25.e79de2370b1ee4072e19.bundle.js +0 -2
- package/dist/25.e79de2370b1ee4072e19.bundle.js.map +0 -1
- package/dist/26.c1619706b8cbb1ab23cb.bundle.js +0 -2
- package/dist/26.c1619706b8cbb1ab23cb.bundle.js.map +0 -1
- package/dist/27.350dba622e243e1ab5fb.bundle.js +0 -2
- package/dist/27.350dba622e243e1ab5fb.bundle.js.map +0 -1
- package/dist/28.e687c87a5f1dc8a30fd0.bundle.js +0 -2
- package/dist/28.e687c87a5f1dc8a30fd0.bundle.js.map +0 -1
- package/dist/29.34a4af65623cd4af6899.bundle.js +0 -2
- package/dist/29.34a4af65623cd4af6899.bundle.js.map +0 -1
- package/dist/3.dfa66b44200c3fca24a2.bundle.js +0 -2
- package/dist/3.dfa66b44200c3fca24a2.bundle.js.map +0 -1
- package/dist/30.f4738c7c2d74f00f2e5f.bundle.js +0 -2
- package/dist/30.f4738c7c2d74f00f2e5f.bundle.js.map +0 -1
- package/dist/31.ab8f2e70841221e1d427.bundle.js +0 -2
- package/dist/31.ab8f2e70841221e1d427.bundle.js.map +0 -1
- package/dist/32.3210a7952ffcb57daa1a.bundle.js +0 -2
- package/dist/32.3210a7952ffcb57daa1a.bundle.js.map +0 -1
- package/dist/33.fcf9c56901b5590bd603.bundle.js +0 -2
- package/dist/33.fcf9c56901b5590bd603.bundle.js.map +0 -1
- package/dist/34.2c344c05bfc4048c3d53.bundle.js +0 -2
- package/dist/34.2c344c05bfc4048c3d53.bundle.js.map +0 -1
- package/dist/35.423c4a91e80adf5d97c8.bundle.js +0 -2
- package/dist/35.423c4a91e80adf5d97c8.bundle.js.map +0 -1
- package/dist/36.247686b6d65de11ec10d.bundle.js +0 -2
- package/dist/36.247686b6d65de11ec10d.bundle.js.map +0 -1
- package/dist/37.5f6089a939b59309cc82.bundle.js +0 -2
- package/dist/37.5f6089a939b59309cc82.bundle.js.map +0 -1
- package/dist/38.9e79a9ec2f9d5af38692.bundle.js +0 -2
- package/dist/38.9e79a9ec2f9d5af38692.bundle.js.map +0 -1
- package/dist/39.b64ae969a5f5fea4504c.bundle.js +0 -2
- package/dist/39.b64ae969a5f5fea4504c.bundle.js.map +0 -1
- package/dist/4.188966396c80909f58cd.bundle.js +0 -2
- package/dist/4.188966396c80909f58cd.bundle.js.map +0 -1
- package/dist/40.1303e99feecbba2614a7.bundle.js +0 -2
- package/dist/40.1303e99feecbba2614a7.bundle.js.map +0 -1
- package/dist/41.687956ca2240355a838f.bundle.js +0 -2
- package/dist/41.687956ca2240355a838f.bundle.js.map +0 -1
- package/dist/42.78e0302e87b9d244a1d7.bundle.js +0 -2
- package/dist/42.78e0302e87b9d244a1d7.bundle.js.map +0 -1
- package/dist/43.ee0de548c525f8e422ba.bundle.js +0 -2
- package/dist/43.ee0de548c525f8e422ba.bundle.js.map +0 -1
- package/dist/44.38b4979d4b201ae1fffb.bundle.js +0 -2
- package/dist/44.38b4979d4b201ae1fffb.bundle.js.map +0 -1
- package/dist/45.8a0ab002ad0f614964e5.bundle.js +0 -2
- package/dist/45.8a0ab002ad0f614964e5.bundle.js.map +0 -1
- package/dist/46.720c0f65b93f4fe01a7c.bundle.js +0 -2
- package/dist/46.720c0f65b93f4fe01a7c.bundle.js.map +0 -1
- package/dist/47.686e599732ae6f41120c.bundle.js.map +0 -1
- package/dist/48.bdb51ad865126b918831.bundle.js +0 -2
- package/dist/48.bdb51ad865126b918831.bundle.js.map +0 -1
- package/dist/49.74a24e08097ef1f6fcd2.bundle.js +0 -2
- package/dist/49.74a24e08097ef1f6fcd2.bundle.js.map +0 -1
- package/dist/5.9bbd38317d375cd02da2.bundle.js +0 -8
- package/dist/5.9bbd38317d375cd02da2.bundle.js.map +0 -1
- package/dist/50.313e315d4c339ad1bcdd.bundle.js +0 -2
- package/dist/50.313e315d4c339ad1bcdd.bundle.js.map +0 -1
- package/dist/51.895a3dacdc3a8eaee275.bundle.js.map +0 -1
- package/dist/52.1f6bc47f1c9abcc79e8d.bundle.js +0 -2
- package/dist/52.1f6bc47f1c9abcc79e8d.bundle.js.map +0 -1
- package/dist/53.f6c19075252833268cca.bundle.js +0 -2
- package/dist/53.f6c19075252833268cca.bundle.js.map +0 -1
- package/dist/54.599ca3ae32ee1fb5f937.bundle.js +0 -2
- package/dist/54.599ca3ae32ee1fb5f937.bundle.js.map +0 -1
- package/dist/55.c20a51cb1d894f9113b4.bundle.js +0 -2
- package/dist/55.c20a51cb1d894f9113b4.bundle.js.map +0 -1
- package/dist/56.91947e80d8e04223ac58.bundle.js.map +0 -1
- package/dist/57.ab4ee313c9d6c7e29384.bundle.js +0 -2
- package/dist/57.ab4ee313c9d6c7e29384.bundle.js.map +0 -1
- package/dist/58.99c83a8dac31c1b681df.bundle.js +0 -2
- package/dist/58.99c83a8dac31c1b681df.bundle.js.map +0 -1
- package/dist/59.99da52e1d8946ac0f601.bundle.js +0 -2
- package/dist/59.99da52e1d8946ac0f601.bundle.js.map +0 -1
- package/dist/6.6c67a1bcf82bb335b0c4.bundle.js +0 -2
- package/dist/6.6c67a1bcf82bb335b0c4.bundle.js.map +0 -1
- package/dist/60.92b9758945e497e52bac.bundle.js +0 -2
- package/dist/60.92b9758945e497e52bac.bundle.js.map +0 -1
- package/dist/61.42887fbc87f941cf7c81.bundle.js +0 -2
- package/dist/61.42887fbc87f941cf7c81.bundle.js.map +0 -1
- package/dist/62.c21410d6e123395d3920.bundle.js +0 -2
- package/dist/62.c21410d6e123395d3920.bundle.js.map +0 -1
- package/dist/63.1ab0c580ba57aee5479c.bundle.js +0 -2
- package/dist/63.1ab0c580ba57aee5479c.bundle.js.map +0 -1
- package/dist/64.ac922cb38c3ff6c431fb.bundle.js.map +0 -1
- package/dist/65.9fcde753699dc94bea1d.bundle.js +0 -2
- package/dist/65.9fcde753699dc94bea1d.bundle.js.map +0 -1
- package/dist/66.8213a0430e7543b6d7f7.bundle.js +0 -2
- package/dist/66.8213a0430e7543b6d7f7.bundle.js.map +0 -1
- package/dist/67.320a484bc979f5076d8c.bundle.js +0 -2
- package/dist/67.320a484bc979f5076d8c.bundle.js.map +0 -1
- package/dist/68.a69e9e22327878f44dbd.bundle.js +0 -2
- package/dist/68.a69e9e22327878f44dbd.bundle.js.map +0 -1
- package/dist/69.be786580c66ac4ee18cb.bundle.js +0 -2
- package/dist/69.be786580c66ac4ee18cb.bundle.js.map +0 -1
- package/dist/7.0fd9bc389f42820382e4.bundle.js +0 -3
- package/dist/7.0fd9bc389f42820382e4.bundle.js.map +0 -1
- package/dist/70.93cfa1f02948e8276451.bundle.js +0 -2
- package/dist/70.93cfa1f02948e8276451.bundle.js.map +0 -1
- package/dist/71.6b8c8bce52a95f2da242.bundle.js +0 -2
- package/dist/71.6b8c8bce52a95f2da242.bundle.js.map +0 -1
- package/dist/72.6cbb41a38d917191c660.bundle.js +0 -2
- package/dist/72.6cbb41a38d917191c660.bundle.js.map +0 -1
- package/dist/73.801e05b4acc74a3e268c.bundle.js +0 -2
- package/dist/73.801e05b4acc74a3e268c.bundle.js.map +0 -1
- package/dist/74.1c6322e5f93d5376fd76.bundle.js +0 -2
- package/dist/74.1c6322e5f93d5376fd76.bundle.js.map +0 -1
- package/dist/75.c95c9015a30a98acb353.bundle.js +0 -2
- package/dist/75.c95c9015a30a98acb353.bundle.js.map +0 -1
- package/dist/76.29111b9618d43a0dd149.bundle.js +0 -2
- package/dist/76.29111b9618d43a0dd149.bundle.js.map +0 -1
- package/dist/77.6ced6f6e26dfe1c4e00f.bundle.js +0 -2
- package/dist/77.6ced6f6e26dfe1c4e00f.bundle.js.map +0 -1
- package/dist/78.7c7d2a0d9e7c2d2483e6.bundle.js +0 -2
- package/dist/78.7c7d2a0d9e7c2d2483e6.bundle.js.map +0 -1
- package/dist/79.696045e048461f420813.bundle.js +0 -2
- package/dist/79.696045e048461f420813.bundle.js.map +0 -1
- package/dist/8.22695f5c20dcddc1c7f9.bundle.js +0 -2
- package/dist/8.22695f5c20dcddc1c7f9.bundle.js.map +0 -1
- package/dist/80.b5e832779f88ebe839e2.bundle.js +0 -2
- package/dist/80.b5e832779f88ebe839e2.bundle.js.map +0 -1
- package/dist/81.5a0776b89463df60bd1a.bundle.js +0 -2
- package/dist/81.5a0776b89463df60bd1a.bundle.js.map +0 -1
- package/dist/82.0a98b482c7c37a9812fc.bundle.js +0 -2
- package/dist/82.0a98b482c7c37a9812fc.bundle.js.map +0 -1
- package/dist/83.8beeb651df72c23d53ac.bundle.js +0 -2
- package/dist/83.8beeb651df72c23d53ac.bundle.js.map +0 -1
- package/dist/84.6f35fe422db61d53ae3e.bundle.js +0 -2
- package/dist/84.6f35fe422db61d53ae3e.bundle.js.map +0 -1
- package/dist/85.2d1142fcbdf4c9868e94.bundle.js +0 -2
- package/dist/85.2d1142fcbdf4c9868e94.bundle.js.map +0 -1
- package/dist/86.ce91cb69963c2b84e551.bundle.js +0 -2
- package/dist/86.ce91cb69963c2b84e551.bundle.js.map +0 -1
- package/dist/87.d4aa485128cd374a11c7.bundle.js +0 -2
- package/dist/87.d4aa485128cd374a11c7.bundle.js.map +0 -1
- package/dist/88.b4cd8e99a6af1abea692.bundle.js +0 -2
- package/dist/88.b4cd8e99a6af1abea692.bundle.js.map +0 -1
- package/dist/89.8ce40cc9d5fe2596fdf9.bundle.js +0 -2
- package/dist/89.8ce40cc9d5fe2596fdf9.bundle.js.map +0 -1
- package/dist/9.d94f24c12177433d455a.bundle.js +0 -2
- package/dist/9.d94f24c12177433d455a.bundle.js.map +0 -1
- package/dist/90.94988124ca51fa46932e.bundle.js +0 -2
- package/dist/90.94988124ca51fa46932e.bundle.js.map +0 -1
- package/dist/91.bfbbacbaea095478d82e.bundle.js +0 -2
- package/dist/91.bfbbacbaea095478d82e.bundle.js.map +0 -1
- package/dist/92.791121a262e5f42a2ba2.bundle.js +0 -2
- package/dist/92.791121a262e5f42a2ba2.bundle.js.map +0 -1
- package/dist/93.7da268902b8515abecf6.bundle.js +0 -2
- package/dist/93.7da268902b8515abecf6.bundle.js.map +0 -1
- package/dist/94.88f1bd8fa645739c4f30.bundle.js +0 -2
- package/dist/94.88f1bd8fa645739c4f30.bundle.js.map +0 -1
- package/dist/95.bbd1b757de3af20f2ac1.bundle.js +0 -2
- package/dist/95.bbd1b757de3af20f2ac1.bundle.js.map +0 -1
- package/dist/96.38e7df277c99946f9a20.bundle.js +0 -2
- package/dist/96.38e7df277c99946f9a20.bundle.js.map +0 -1
- package/dist/97.1818744137f2fb66596a.bundle.js +0 -2
- package/dist/97.1818744137f2fb66596a.bundle.js.map +0 -1
- package/dist/98.1a14af46a31cf35db0e5.bundle.js +0 -2
- package/dist/98.1a14af46a31cf35db0e5.bundle.js.map +0 -1
- package/dist/99.bd486f7d738e281a0752.bundle.js +0 -2
- package/dist/99.bd486f7d738e281a0752.bundle.js.map +0 -1
- package/dist/bundle.5eeff901b77240e58d27.bundle.js +0 -89
- package/dist/bundle.5eeff901b77240e58d27.bundle.js.map +0 -1
- package/dist/css/fonts/rubik-italic.woff +0 -0
- package/dist/css/fonts/rubik-italic.woff2 +0 -0
- package/dist/css/fonts/rubik-light.woff +0 -0
- package/dist/css/fonts/rubik-light.woff2 +0 -0
- package/dist/css/fonts/rubik-lightitalic.woff +0 -0
- package/dist/css/fonts/rubik-lightitalic.woff2 +0 -0
- package/dist/css/fonts/rubik-medium.woff +0 -0
- package/dist/css/fonts/rubik-medium.woff2 +0 -0
- package/dist/css/fonts/rubik-mediumitalic.woff +0 -0
- package/dist/css/fonts/rubik-mediumitalic.woff2 +0 -0
- package/dist/css/fonts/rubik-regular.woff +0 -0
- package/dist/css/fonts/rubik-regular.woff2 +0 -0
- package/dist/css/lib/bootstrap-switch/bootstrap-switch.min.css +0 -10
- package/dist/img/graphdb-splash.2eb3f7f02aa7e25a2545459e096f3738.svg +0 -141
- package/dist/js/angular/clustermanagement/templates/modal/clone-modal.html +0 -27
- package/dist/js/lib/nvd3/nv.d3.css +0 -755
- package/dist/main.e5d47f1d0bcd23074c38.css +0 -1
- package/dist/main.f10730ef6eebe969b494.bundle.js +0 -2
- package/dist/main.f10730ef6eebe969b494.bundle.js.map +0 -1
- package/dist/pages/cluster-management/cluster-configuration.html +0 -183
- package/dist/res/swagger/css/style.css +0 -250
- package/dist/res/swagger/css/typography.css +0 -60
- package/dist/vendor.327ffd7c7997ca288654.bundle.js +0 -50
- package/dist/vendor.327ffd7c7997ca288654.bundle.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/js/angular/graphexplore/app.js","webpack:///./src/js/lib/common/d3-utils.js","webpack:///./src/js/lib/common/svg-export.js","webpack:///./src/js/lib/d3-tip/d3-tip-patch.js","webpack:///./src/js/lib/d3-ONTO-chord-patch.js","webpack:///./src/js/lib/common/circle-packing.js","webpack:///./src/js/lib/angucomplete-alt/angucomplete-alt.js","webpack:///./src/js/angular/utils/notifications.js","webpack:///./src/js/angular/core/directives/queryeditor/query-editor.controller.js","webpack:///./src/js/angular/repositories/repository.constants.js","webpack:///./src/js/angular/rest/graph-data.rest.service.js","webpack:///./src/js/angular/graphexplore/services/ui-scroll.service.js","webpack:///./src/js/angular/graphexplore/services/rdfs-label-comment.service.js","webpack:///./src/js/angular/rest/saved-graphs.rest.service.js","webpack:///./src/js/angular/rest/graph-config.rest.service.js","webpack:///./src/js/angular/graphexplore/controllers/rdf-class-hierarchy.controller.js","webpack:///./src/js/angular/graphexplore/controllers/domain-range-graph.controller.js","webpack:///./src/js/angular/graphexplore/controllers/dependencies-chord.controller.js","webpack:///./src/js/angular/graphexplore/controllers/graphs-visualizations.controller.js","webpack:///./src/js/angular/graphexplore/controllers/graphs-config.controller.js","webpack:///./src/js/angular/graphexplore/directives/rdf-class-hierarchy.directive.js","webpack:///./src/js/angular/graphexplore/directives/domain-range-graph.directive.js","webpack:///./src/js/angular/graphexplore/directives/system-repo-warning.directive.js","webpack:///./src/js/angular/graphexplore/directives/rdfs-comment-label.directive.js","webpack:///./src/js/angular/graphexplore/directives/dependencies-chord.directive.js","webpack:///./src/js/angular/graphexplore/directives/list-items-search-filter.directive.js","webpack:///./src/js/angular/graphexplore/directives/search-icon-input.directive.js"],"names":["angular","module","D3","Text","calcFontSizeRaw","text","radius","minimumSize","isMultiline","textSize","substring","length","match","Math","round","calcFontSize","getTextWithElipsisIfNeeded","str","threshold","Transition","fadeIn","sel","duration","style","transition","fadeOut","Click","delayDblClick","event","d3","dispatch","rebind","selection","down","wait","on","mouse","document","body","Date","d","a","b","sqrt","pow","window","clearTimeout","dblclick","setTimeout","click","SVG","Export","getCSSRules","cssSourceFilePath","cssRules","$","sheet","rules","cssStr","_","each","value","cssText","generateBase64ImageSource","exportSvg","selectAll","attr","version","xmlns","node","parentNode","innerHTML","btoa","unescape","encodeURIComponent","direction","offset","html","initNode","svg","point","target","customPosition","tip","vis","el","tagName","toLowerCase","ownerSVGElement","createSVGPoint","appendChild","show","args","Array","prototype","slice","call","arguments","SVGElement","pop","coords","content","apply","this","poffset","dir","nodel","getNodeEl","i","directions","scrollTop","documentElement","scrollLeft","customPos","opacity","classed","direction_callbacks","get","top","left","hide","n","v","functor","destroy","remove","map","bbox","getScreenBBox","y","offsetHeight","x","offsetWidth","s","e","w","nw","ne","sw","se","keys","select","createElement","position","targetel","getScreenCTM","matrix","tbbox","getBBox","width","height","matrixTransform","d3_arraySlice","d3_array","list","d3_document","d3_documentElement","ownerDocument","d3_window","defaultView","childNodes","nodeType","array","now","setProperty","error","d3_element_prototype","Element","d3_element_setAttribute","setAttribute","d3_element_setAttributeNS","setAttributeNS","d3_style_prototype","CSSStyleDeclaration","d3_style_setProperty","name","space","local","priority","d3_ascending","NaN","d3_number","d3_numeric","isNaN","d3_bisector","compare","lo","hi","mid","right","ascending","descending","min","f","max","extent","c","sum","mean","j","quantile","values","p","H","h","floor","median","numbers","push","sort","variance","m","deviation","d3_bisect","d3_zipLength","bisectLeft","bisect","bisectRight","bisector","shuffle","i0","i1","t","random","permute","indexes","permutes","pairs","p1","zip","zips","transpose","key","entries","merge","arrays","merged","abs","d3_range_integerScale","k","d3_class","ctor","properties","Object","defineProperty","enumerable","d3_Map","create","range","start","stop","step","Infinity","Error","object","forEach","set","isArray","o","d3_map_proto","d3_map_zero","d3_map_escape","d3_map_unescape","d3_map_has","d3_map_remove","d3_map_keys","d3_map_size","size","d3_map_empty","d3_Set","d3_identity","d3_rebind","source","method","d3_vendorSymbol","charAt","toUpperCase","d3_vendorPrefixes","prefixName","has","empty","nest","sortValues","rollup","sortKeys","mapType","depth","keyValue","setter","valuesByKey","sortKey","keyMap","order","add","behavior","d3_noop","d3_dispatch","d3_dispatch_event","listeners","listenerByName","l","z","listener","indexOf","concat","d3_eventPreventDefault","preventDefault","d3_eventSource","sourceEvent","d3_eventDispatch","of","thiz","argumentz","e1","e0","type","hasOwnProperty","requote","replace","d3_requote_re","d3_subclass","__proto__","property","d3_selection","groups","d3_selectionPrototype","d3_select","querySelector","d3_selectAll","querySelectorAll","d3_selectMatches","d3_selectMatcher","matches","Sizzle","matchesSelector","d3_selection_selector","selector","d3_selection_selectorAll","subgroup","subnode","group","subgroups","__data__","d3_nsPrefix","xhtml","xlink","xml","d3_selection_attr","ns","qualify","removeAttributeNS","removeAttribute","d3_collapse","trim","d3_selection_classedRe","RegExp","d3_selection_classes","split","d3_selection_classed","d3_selection_classedName","re","classList","getAttribute","lastIndex","test","d3_selection_style","removeProperty","d3_selection_property","d3_selection_creator","createElementNS","namespace","namespaceURI","d3_selectionRemove","parent","removeChild","d3_selection_dataNode","data","d3_selection_filter","d3_selection_sortComparator","comparator","d3_selection_each","callback","d3_selection_enter","d3_selection_enterPrototype","prefix","getAttributeNS","contains","getComputedStyle","getPropertyValue","textContent","append","insert","before","insertBefore","bind","groupData","nodeData","n0","updateNodes","enterNodes","exitNodes","nodeByKeyValue","keyValues","update","enter","exit","datum","filter","next","nextSibling","d3_selection_enterInsertBefore","j0","d3_selection_on","capture","wrap","d3_selection_onListener","d3_selection_onFilters","onRemove","removeEventListener","d3_selection_onFilter","addEventListener","upgroup","nodes","mouseenter","mouseleave","related","relatedTarget","compareDocumentPosition","d3_event_dragSelect","d3_event_dragId","d3_event_dragSuppress","suppressClick","off","container","d3_mousePoint","d3_mouse_bug44083","navigator","userAgent","changedTouches","scrollX","scrollY","ctm","margin","padding","border","pageX","pageY","clientX","clientY","inverse","rect","getBoundingClientRect","clientLeft","clientTop","d3_behavior_dragTouchId","identifier","touch","touches","drag","origin","mousedown","dragstart","touchstart","id","subject","move","end","dragOffset","that","dragged","dragId","dragName","dragSubject","moved","ended","dragRestore","position0","dx","dy","position1","ε","ε2","π","PI","τ","τε","halfπ","d3_radians","d3_degrees","d3_sgn","d3_cross2d","d3_acos","acos","d3_asin","asin","d3_cosh","exp","d3_haversin","sin","ρ","SQRT2","interpolateZoom","p0","S","ux0","uy0","w0","ux1","uy1","w1","d2","log","d1","b0","b1","r0","r1","coshr0","u","d3_sinh","zoom","translate0","center0","center","mousewheelTimer","touchtime","x0","x1","y0","y1","view","scaleExtent","d3_behavior_zoomInfinity","zooming","mousemove","mouseup","g","mousedowned","d3_behavior_zoomWheel","mousewheeled","dblclicked","touchstarted","location","scaleTo","translateTo","zoomTo","__chart__","rescale","domain","invert","zoomstarted","zoomed","scale","translate","zoomended","location0","d3_selection_interrupt","scale0","locations0","distance0","zoomName","touchmove","touchend","targets","relocate","started","changed","LN2","q","l0","l1","distance1","scale1","d3_behavior_zoomDelta","shiftKey","ceil","deltaY","deltaMode","wheelDelta","detail","view1","d3_transitionInheritId","tween","cx","cy","copy","d3_color","d3_hsl","d3_rgb_parse","d3_rgb_hsl","color","toString","rgb","hsl","d3_hslPrototype","d3_hsl_rgb","m1","m2","vv","d3_rgb","d3_hcl","d3_lab_hcl","d3_lab","d3_rgb_lab","r","brighter","darker","hcl","d3_hclPrototype","d3_hcl_lab","cos","d3_lab_K","lab","d3_lab_X","d3_lab_Y","d3_lab_Z","d3_labPrototype","d3_lab_rgb","d3_xyz_rgb","d3_lab_xyz","atan2","d3_xyz_lab","d3_rgbNumber","d3_rgbString","d3_rgbPrototype","d3_rgb_hex","format","exec","parseFloat","d3_rgb_parseNumber","d3_rgb_names","parseInt","d3_rgb_xyz","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","d3_functor","d3_xhrType","response","url","mimeType","d3_xhr","xhr","headers","request","XMLHttpRequest","responseType","respond","result","status","responseText","d3_xhrHasResponse","load","XDomainRequest","onload","onerror","onreadystatechange","readyState","onprogress","progress","header","send","open","setRequestHeader","overrideMimeType","beforesend","abort","d3_xhr_fixCallback","dsv","delimiter","reFormat","delimiterCode","charCodeAt","row","typedResponse","parse","formatRow","formatValue","join","parseRows","Function","JSON","stringify","eol","EOL","EOF","rows","N","I","token","formatRows","fieldSet","fields","field","csv","tsv","d3_timer_queueHead","d3_timer_queueTail","d3_timer_interval","d3_timer_timeout","d3_timer_frame","d3_timer","delay","then","timer","d3_timer_step","d3_timer_mark","d3_timer_sweep","isFinite","t0","t1","time","d3_format_precision","LN10","flush","d3_formatPrefixes","symbol","d3_locale_numberFormat","locale","locale_decimal","decimal","locale_thousands","thousands","locale_grouping","grouping","locale_currency","currency","formatGroup","reverse","specifier","d3_format_re","fill","align","sign","zfill","comma","precision","suffix","integer","exponent","d3_format_types","d3_format_typeDefault","zcomma","fullSuffix","negative","unit","formatPrefix","after","lastIndexOf","String","fromCharCode","X","toPrecision","toExponential","toFixed","d3_time","d3_date","d3_date_utc","UTC","getDate","getUTCDate","getDay","getUTCDay","getFullYear","getUTCFullYear","getHours","getUTCHours","getMilliseconds","getUTCMilliseconds","getMinutes","getUTCMinutes","getMonth","getUTCMonth","getSeconds","getUTCSeconds","getTime","getTimezoneOffset","valueOf","setDate","d3_time_prototype","setUTCDate","setDay","setUTCDay","setFullYear","setUTCFullYear","setHours","setUTCHours","setMilliseconds","setUTCMilliseconds","setMinutes","setUTCMinutes","setMonth","setUTCMonth","setSeconds","setUTCSeconds","setTime","d3_time_interval","number","date","d0","dt","times","utc","d3_time_interval_utc","d3_locale_timeFormat","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_days","days","locale_shortDays","shortDays","locale_months","months","locale_shortMonths","shortMonths","d3_time_format","template","string","d3_time_formatPads","d3_time_formats","M","L","Z","d3_time_parse","localZ","W","U","d3_time_parsers","multi","d3_time_formatMulti","d3_time_periodLookup","d3_time_dayRe","d3_time_formatRe","d3_time_dayLookup","d3_time_formatLookup","d3_time_dayAbbrevRe","d3_time_dayAbbrevLookup","d3_time_monthRe","d3_time_monthLookup","d3_time_monthAbbrevRe","d3_time_monthAbbrevLookup","A","B","d3_time_formatPad","dayOfYear","sundayOfYear","mondayOfYear","Y","d3_time_zone","d3_time_parseDay","d3_time_parseHour24","d3_time_parseDayOfYear","d3_time_parseMilliseconds","d3_time_parseMonthNumber","d3_time_parseMinutes","d3_time_parseSeconds","d3_time_parseWeekNumberSunday","d3_time_parseWeekdayNumber","d3_time_parseWeekNumberMonday","d3_time_parseYear","d3_time_parseFullYear","d3_time_parseZone","d3_time_parseLiteralPercent","year","day","years","interval","week","sunday","weeks","weekOfYear","d3_time_numberRe","d3_time_percentRe","names","zs","zh","zm","formats","numberFormat","timeFormat","d3_locale_enUS","d3_adder","geo","d3_adderSum","d3_adderTemp","reset","bv","av","d3_geo_streamGeometry","geometry","d3_geo_streamGeometryType","stream","d3_geo_streamObjectType","Feature","feature","FeatureCollection","features","Sphere","sphere","Point","coordinates","MultiPoint","LineString","d3_geo_streamLine","MultiLineString","Polygon","d3_geo_streamPolygon","MultiPolygon","GeometryCollection","geometries","closed","coordinate","lineStart","lineEnd","polygonStart","polygonEnd","area","d3_geo_areaSum","d3_geo_area","d3_geo_centroidW0","d3_geo_centroidW1","d3_geo_centroidX0","d3_geo_centroidY0","d3_geo_centroidZ0","d3_geo_centroidX1","d3_geo_centroidY1","d3_geo_centroidZ1","d3_geo_centroidX2","d3_geo_centroidY2","d3_geo_centroidZ2","d3_geo_areaRingSum","d3_geo_areaRingStart","λ00","φ00","λ0","cosφ0","sinφ0","nextPoint","λ","φ","dλ","sdλ","adλ","cosφ","sinφ","d3_geo_cartesian","spherical","d3_geo_cartesianDot","d3_geo_cartesianCross","d3_geo_cartesianAdd","d3_geo_cartesianScale","vector","d3_geo_cartesianNormalize","d3_geo_spherical","cartesian","d3_geo_sphericalEqual","bounds","φ0","λ1","φ1","λ_","λ__","φ__","dλSum","ranges","bound","ringPoint","ringStart","ringEnd","linePoint","normal","inflection","λi","antimeridian","φi","angle","compareRanges","withinRange","best","centroid","d3_geo_centroid","d3_geo_centroidPoint","d3_geo_centroidLineStart","d3_geo_centroidLineEnd","d3_geo_centroidRingStart","d3_geo_centroidPointXYZ","z0","cz","d3_geo_compose","compose","d3_true","d3_geo_clipPolygon","segments","clipStartInside","interpolate","clip","segment","d3_geo_clipPolygonIntersection","d3_geo_clipPolygonLinkCircular","entry","points","current","isSubject","other","d3_geo_clip","pointVisible","clipLine","clipStart","rotate","line","rotatedClipStart","pointRing","polygon","meridian","parallel","meridianNormal","polarAngle","winding","ring","point0","arc","intersection","φarc","d3_geo_pointInPolygon","polygonStarted","d3_geo_clipSort","pointLine","buffer","d3_geo_clipBufferListener","ringListener","clean","ringSegments","shift","d3_geo_clipSegmentLength1","lines","rejoin","d3_geo_clipAntimeridian","sλ0","sλ1","cosφ1","sinλ0_λ1","atan","d3_geo_clipAntimeridianIntersect","from","to","d3_geo_clipCircle","cr","smallRadius","notHemisphere","visible","c0","v0","v00","point2","point1","code","intersect","d3_geo_circleInterpolate","two","n1","n2","n2n2","n1n2","determinant","c1","c2","n1xn2","uu","t2","δλ","polar","q1","d3_geom_clipLine","ax","ay","d3_geo_clipExtentMAX","d3_geo_clipExtent","x__","y__","v__","x_","y_","v_","first","listener_","bufferListener","wn","insidePolygon","inside","a1","corner","comparePoints","ca","cb","d3_geo_conic","projectAt","d3_geo_projectionMutator","parallels","d3_geo_conicEqualArea","C","ρ0","forward","ρ0_y","clipExtent","output","valid","conicEqualArea","raw","albers","albersUsa","lower48Point","alaskaPoint","hawaiiPoint","lower48","alaska","hawaii","pointStream","lower48Stream","alaskaStream","hawaiiStream","d3_geo_pathAreaSum","d3_geo_pathAreaPolygon","d3_geo_pathBoundsX0","d3_geo_pathBoundsY0","d3_geo_pathBoundsX1","d3_geo_pathBoundsY1","d3_geo_pathArea","d3_geo_pathAreaRingStart","x00","y00","d3_geo_pathBounds","d3_geo_pathBuffer","pointCircle","d3_geo_pathBufferCircle","pointLineStart","lineEndPolygon","pointRadius","d3_geo_lengthSum","d3_geo_pathCentroid","d3_geo_pathCentroidPoint","d3_geo_pathCentroidLineStart","d3_geo_pathCentroidLineEnd","d3_geo_pathCentroidRingStart","d3_geo_pathContext","context","moveTo","lineTo","closePath","d3_geo_resample","project","δ2","cosMinDistance","maxDepth","resample","resampleRecursive","resampleNone","d3_geo_transformPoint","a00","b00","c00","a0","resampleLineTo","φ2","λ2","x2","y2","dx2","dy2","dz","d3_geo_pathProjectStream","d3_geo_projectionRadians","d3_geo_transform","d3_geo_projection","projectRotate","δx","δy","projectResample","δφ","δγ","preclip","postclip","clipAngle","projection","d3_geo_rotation","invalidate","d3_geo_equirectangular","d3_geo_identityRotation","d3_geo_rotationλ","d3_geo_rotationφγ","d3_geo_forwardRotationλ","rotation","cosδφ","sinδφ","cosδγ","sinδγ","sr","d3_geo_circleAngle","d3_geo_graticuleX","d3_geo_graticuleY","d3_source","d3_target","path","projectStream","contextStream","cacheStream","transform","methods","projectionMutator","equirectangular","circle","distance","Δλ","sinΔλ","cosΔλ","sinφ1","graticule","X1","X0","Y1","Y0","DX","DY","outline","majorExtent","minorExtent","majorStep","minorStep","greatArc","source_","target_","cy0","sy0","cy1","sy1","kx0","ky0","kx1","ky1","d3_geo_length","d3_geo_azimuthal","azimuthal","cosλ","sinc","cosc","d3_geo_azimuthalEqualArea","cosλcosφ","azimuthalEqualArea","d3_geo_azimuthalEquidistant","d3_geo_conicConformal","F","d3_geo_mercator","d3_geo_conicEquidistant","G","azimuthalEquidistant","conicConformal","conicEquidistant","d3_geo_gnomonic","d3_geo_mercatorProjection","clipAuto","gnomonic","mercator","d3_geo_orthographic","orthographic","d3_geo_stereographic","d3_geo_transverseMercator","d3_geom_pointX","d3_geom_pointY","d3_geom_hullUpper","hull","hs","d3_geom_hullOrder","stereographic","transverseMercator","geom","vertices","fx","fy","flippedPoints","upper","lower","skipLeft","skipRight","d3_geom_polygonPrototype","d3_geom_polygonInside","d3_geom_polygonIntersect","x3","x21","x43","y3","y21","y43","ua","d3_geom_polygonClosed","input","d3_geom_voronoiEdges","d3_geom_voronoiCells","d3_geom_voronoiBeaches","d3_geom_voronoiFirstCircle","d3_geom_voronoiCircles","d3_geom_voronoiBeachPool","d3_geom_voronoiCirclePool","d3_geom_voronoiBeach","d3_geom_voronoiRedBlackNode","edge","site","d3_geom_voronoiCreateBeach","beach","d3_geom_voronoiDetachBeach","d3_geom_voronoiDetachCircle","d3_geom_voronoiRemoveBeach","vertex","previous","P","disappearing","lArc","unshift","rArc","iArc","nArcs","d3_geom_voronoiSetEdgeEnd","d3_geom_voronoiCreateEdge","d3_geom_voronoiAttachCircle","d3_geom_voronoiAddBeach","dxl","dxr","directrix","d3_geom_voronoiLeftBreakPoint","d3_geom_voronoiRightBreakPoint","R","newArc","lSite","bx","by","rSite","hb","hc","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","d3_geom_voronoiCell","edges","d3_geom_voronoiHalfEdgeOrder","d3_geom_voronoiCircle","cSite","ha","d3_geom_voronoiConnectEdge","vb","fm","fb","va","lx","ly","rx","ry","d3_geom_voronoiEdge","d3_geom_voronoiHalfEdge","d3_geom_voronoiCreateBorderEdge","d3_geom_voronoiRedBlackTree","d3_geom_voronoiRedBlackRotateLeft","tree","d3_geom_voronoiRedBlackRotateRight","d3_geom_voronoiRedBlackFirst","d3_geom_voronoi","sites","d3_geom_voronoiVertexOrder","splice","d3_geom_voronoiClipEdges","cell","iHalfEdge","halfEdges","nHalfEdges","cells","iCell","prepare","d3_geom_voronoiCloseCells","diagram","grandpa","uncle","sibling","voronoi","d3_geom_voronoiClipExtent","polygons","links","triangles","s0","s1","d3_geom_quadtreeCompatX","d3_geom_quadtreeCompatY","d3_geom_quadtreeVisit","sx","sy","children","d3_geom_quadtreeFind","root","closestPoint","minDistance2","find","distance2","xm","ym","d3_interpolateRgb","ar","ag","ab","br","bg","bb","d3_interpolateObject","d3_interpolate","d3_interpolateNumber","d3_interpolateString","am","bm","bs","bi","d3_interpolate_numberA","d3_interpolate_numberB","index","delaunay","quadtree","compat","xs","ys","x1_","y1_","x2_","y2_","leaf","nx","ny","insertChild","nPoint","below","interpolateRgb","interpolateObject","interpolateNumber","interpolateString","interpolators","d3_interpolateArray","na","nb","interpolateArray","d3_ease_default","d3_ease","linear","poly","quad","d3_ease_quad","cubic","d3_ease_cubic","d3_ease_sin","d3_ease_exp","d3_ease_circle","elastic","back","bounce","d3_ease_bounce","d3_ease_mode","out","d3_ease_reverse","d3_ease_reflect","d3_ease_clamp","d3_ease_cubicInOut","t3","d3_interpolateRound","d3_transform","kx","d3_transformNormalize","kz","d3_transformDot","ky","skew","ease","interpolateHcl","ah","ac","al","bh","bc","bl","interpolateHsl","as","interpolateHslLong","interpolateLab","aa","ba","interpolateRound","baseVal","consolidate","d3_transformIdentity","d3_interpolateTransformPop","d3_interpolateTransform","ta","tb","d3_interpolateTranslate","ra","rb","d3_interpolateRotate","wa","wb","d3_interpolateSkew","ka","kb","d3_interpolateScale","d3_uninterpolateNumber","d3_uninterpolateClamp","d3_layout_bundlePath","link","lca","aNodes","d3_layout_bundleAncestors","bNodes","aNode","bNode","sharedNode","d3_layout_bundleLeastCommonAncestor","ancestors","d3_layout_forceDragstart","fixed","d3_layout_forceDragend","d3_layout_forceMouseover","px","py","d3_layout_forceMouseout","interpolateTransform","layout","bundle","paths","chord","chords","sortGroups","sortSubgroups","sortChords","relayout","groupSums","groupIndex","subgroupIndex","di","dj","subindex","startAngle","endAngle","resort","force","alpha","distances","strengths","charges","friction","linkDistance","d3_layout_forceLinkDistance","linkStrength","d3_layout_forceLinkStrength","charge","chargeDistance2","d3_layout_forceChargeDistance2","gravity","theta2","repulse","dw","dn","pointCharge","dragmove","resume","tick","weight","d3_layout_forceAccumulate","visit","chargeDistance","theta","neighbors","dimension","candidates","d3_layout_hierarchyRebind","hierarchy","d3_layout_hierarchyLinks","d3_layout_hierarchyVisitBefore","d3_layout_hierarchyVisitAfter","nodes2","d3_layout_hierarchyChildren","d3_layout_hierarchyValue","d3_layout_hierarchySort","child","stack","childs","revalue","partition","pie","Number","d3_layout_pieSortByValue","padAngle","da","pa","arcs","d3_layout_stackX","d3_layout_stackY","d3_layout_stackOut","d3_layout_stackOrderDefault","d3_layout_stackOffsetZero","series","orders","offsets","d3_layout_stackOrders","d3_layout_stackOffsets","d3_layout_stackMaxIndex","sums","d3_layout_stackReduceSum","bottom","tops","bottoms","silhouette","wiggle","s2","s3","o0","expand","zero","reduce","d3_layout_stackSum","d3_layout_histogramBinSturges","d3_layout_histogramBinFixed","d3_layout_histogramRange","d3_layout_packSort","d3_layout_packInsert","_pack_next","_pack_prev","d3_layout_packSplice","d3_layout_packIntersects","dr","d3_layout_packSiblings","xMin","xMax","yMin","yMax","d3_layout_packLink","d3_layout_packPlace","isect","d3_layout_packUnlink","db","dc","d3_layout_treeSeparation","d3_layout_treeLeft","d3_layout_treeRight","d3_layout_treeMove","wm","wp","change","d3_layout_treeAncestor","vim","ancestor","d3_layout_treemapPadNull","d3_layout_treemapPad","d3_scaleExtent","d3_scaleRange","rangeExtent","d3_scale_bilinear","uninterpolate","d3_scale_nice","nice","d3_scale_niceStep","d3_scale_niceIdentity","histogram","frequency","valuer","ranger","binner","bin","bins","thresholds","pack","d3_layout_packTransform","separation","nodeSize","root0","root1","node1","queue","wrapTree","firstWalk","secondWalk","sizeNode","tx","siblings","d3_layout_treeShift","midpoint","vip","vop","vom","sip","sop","sim","som","apportion","cluster","previousNode","d3_layout_clusterX","d3_layout_clusterY","d3_layout_clusterLeft","d3_layout_clusterRight","treemap","stickies","pad","sticky","mode","ratio","squarify","score","remaining","worst","stickify","rmax","rmin","padFunction","padConstant","µ","σ","logNormal","bates","irwinHall","d3_scale_polylinear","d3_scale_linearRebind","d3_scale_linearNice","d3_scale_linearTickRange","span","err","d3_scale_linearTicks","d3_scale_linearTickFormat","d3_scale_linearPrecision","d3_scale_linearFormatSignificant","d3_scale_linearFormatPrecision","d3_scale_linear","clamp","rangeRound","ticks","tickFormat","d3_scale_log","base","positive","niced","d3_scale_logNiceNegative","d3_scale_logFormat","d3_scale_powPow","d3_scale_pow","powp","powb","ordinal","d3_scale_ordinal","rangeBand","steps","xi","rangePoints","rangeRoundPoints","rangeBands","outerPadding","rangeRoundBands","category10","d3_category10","category20","d3_category20","category20b","d3_category20b","category20c","d3_category20c","d3_zero","d3_scale_quantile","quantiles","invertExtent","quantize","d3_scale_quantize","d3_scale_threshold","identity","d3_scale_identity","innerRadius","d3_svg_arcInnerRadius","outerRadius","d3_svg_arcOuterRadius","cornerRadius","padRadius","d3_svg_arcAuto","d3_svg_arcStartAngle","d3_svg_arcEndAngle","d3_svg_arcPadAngle","cw","rc","circleSegment","rp","ap","d3_svg_arcSweep","h1","h0","rc1","rc0","oc","kc","lc","t30","d3_svg_arcCornerTangents","t12","t03","t21","x01","y01","ox","oy","D","cx0","cx1","dx0","dy0","dx1","dy1","d3_svg_line","defined","d3_svg_lineLinear","interpolateKey","tension","d3_svg_lineInterpolators","d3_svg_lineLinearClosed","d3_svg_lineStepBefore","d3_svg_lineStepAfter","basis","d3_svg_lineBasis","pi","d3_svg_lineDot4","d3_svg_lineBasisBezier3","d3_svg_lineBasisBezier","cardinal","d3_svg_lineHermite","d3_svg_lineCardinalTangents","monotone","tangents","d3_svg_lineSlope","d3_svg_lineFiniteDifferences","d3_svg_lineMonotoneTangents","lp","p2","d3_svg_lineBasisBezier1","d3_svg_lineBasisBezier2","d3_svg_lineRadial","d3_svg_area","interpolateReverse","points0","points1","fx0","fy0","fx1","fy1","d3_svg_chordRadius","d3_svg_diagonalProjection","d3_svg_diagonalRadialProjection","d3_svg_symbolSize","d3_svg_symbolType","d3_svg_symbolCircle","radial","renderArc","sGr","curve","self","diagonal","p3","projection_","d3_svg_symbols","cross","diamond","d3_svg_symbolTan30","square","d3_svg_symbolSqrt3","symbolTypes","d3_transitionId","d3_transitionNamespace","d3_transitionInherit","d3_transitionNode","d3_transition","interrupt","d3_selection_interruptNS","lock","activeId","active","count","d3_transitionPrototype","d3_transition_tween","d3_transition_text","inherit","tweens","elapsed","cancelId","cancel","subnodes","nameNS","attrNull","attrNullNS","attrTween","attrTweenNS","styleNull","styleString","styleTween","inheritId","id0","id1","axis","tickFormat_","orient","d3_svg_axisDefaultOrient","innerTickSize","outerTickSize","tickPadding","tickArguments_","tickValues","tickTransform","tickEnter","tickExit","tickUpdate","tickSpacing","pathUpdate","lineEnter","lineUpdate","textEnter","textUpdate","d3_svg_axisX","d3_svg_axisY","d3_svg_axisOrients","tickSize","tickSubdivide","brush","xExtentDomain","yExtentDomain","xExtent","yExtent","xClamp","yClamp","resizes","d3_svg_brushResizes","brushstart","background","resize","d3_svg_brushCursor","gUpdate","backgroundUpdate","redrawX","redrawY","redraw","eventTarget","event_","resizing","resizingX","resizingY","dragging","keyCode","brushmove","brushend","ex","ey","altKey","move1","extent1","extent0","yi","clear","d3_time_formatUtc","d3_time_formatIso","d3_time_formatIsoNative","toISOString","d3_time_scale","tickMethod","d3_time_scaleSteps","d3_time_scaleMilliseconds","d3_time_scaleDate","skip","skipped","iso","second","seconds","minute","minutes","hour","timezone","hours","month","d3_time_scaleLocalMethods","d3_time_scaleLocalFormat","d3_time_scaleUtcMethods","d3_time_scaleUtcFormat","d3_json","d3_html","createRange","selectNode","createContextualFragment","json","responseXML","CirclePacking","SingleChild","addPlaceholders","placeholderSize","removePlaceholders","centerNodes","reposition","makePositionsRelativeToZero","offsetX","offsetY","factory","directive","$q","$parse","$http","$sce","$timeout","$templateCache","$interpolate","KEY_DW","KEY_RT","KEY_UP","KEY_LF","KEY_ES","KEY_EN","KEY_TAB","MIN_LENGTH","MAX_LENGTH","PAUSE","BLUR_TIMEOUT","REQUIRED_CLASS","TEXT_SEARCHING","TEXT_NORESULTS","scope","elem","attrs","ctrl","hideTimer","responseFormatter","unbindInitialValue","displaySearching","displayNoResults","fn","inputField","minlength","searchTimer","requiredClassName","validState","httpCanceller","dd","isScrollOn","mousedownOn","handleInputChange","newval","initial","searchStr","extractTitle","callOrAssign","originalObject","console","handleRequired","clickoutHandlerForDropdown","hideResults","ie8EventNormalizer","which","selectedObject","selectedObjectData","titleField","extractValue","obj","findMatchString","matchClass","trustAsHtml","notEmpty","fieldRequired","inputName","$setValidity","handleOverrideSuggestions","overrideSuggestions","cancelHttpRequest","clearSelected","clearResults","dropdownRow","currentIndex","dropdownScrollTopTo","updateInputField","results","val","title","httpSuccessCallbackGen","responseData","config","searching","processResults","remoteUrlDataField","httpErrorCallback","errorRes","remoteUrlErrorCallback","resolve","getRemoteResults","params","remoteUrl","remoteUrlRequestFormatter","remoteUrlRequestWithCredentials","withCredentials","defer","timeout","promise","success","getRemoteResultsWithCustomHandler","remoteApiHandler","catch","showDropdown","initResults","focusFirst","searchTimerComplete","localData","$apply","localSearch","searchFields","parseInput","getLocalResults","description","image","formattedText","formattedDesc","descriptionField","imageField","autoMatch","selectResult","checkExactMatch","desc","showAll","className","$watch","oldval","$on","elementId","onFocusHandler","focusIn","focusOut","resetHideResults","hoverRow","inputChangeHandler","inputChanged","fieldRequiredClass","pause","initialValue","inputType","textSearching","textNoResults","maxlength","rowTop","maxHeight","css","marginTop","marginBottom","dropdownRowOffsetHeight","paddingTop","$digest","overflowY","put","restrict","require","disableInput","remoteUrlResponseFormatter","placeholder","inputClass","fieldTabindex","templateUrl","element","compile","tElement","startSym","startSymbol","endSym","endSymbol","interpolatedHtml","Notifications","toastr","$translate","showToastMessageWithDelay","message","Promise","instant","$inject","QueryEditorCtrl","$scope","$repositories","$modal","ModalService","SparqlRestService","$filter","$window","$jwtAuth","RDF4JRepositoriesRestService","MonitoringRestService","LocalStorageAdapter","LSKeys","defaultTabConfig","query","inference","sameAs","checkQueryIntervalId","principal","getPrincipal","initTabs","appSettings","DEFAULT_INFERENCE","DEFAULT_SAMEAS","skipCountQuery","EXECUTE_COUNT","ignoreSharedQueries","IGNORE_SHARED_QUERIES","tabsData","tabs","TABS_STATE","$watchCollection","newVal","oldVal","saveQueryToLocal","currentQuery","deleteCachedSparqlResults","currentQueryTab","isActiveRepoOntopType","sameAsBtn","getElementById","disabled","shouldDisableSameAs","tab","setLoader","isRunning","progressMessage","extraMessage","noTimer","yasrInnerContainer","queryIsRunning","queryStartTime","countTimeouted","noLoaderTimer","addClass","currentTrackAlias","abortRequested","removeClass","$$phase","fixSizesOnHorizontalViewModeSwitch","verticalView","visibleWindowHeight","innerHeight","clientHeight","orientationViewMode","viewMode","newHeight","noPadding","minHeight","paddingRight","paddingLeft","editor","yasr","showHideEditor","foo","newRepo","item","yasrData","undefined","queryType","resultsCount","allResultsCount","sizeDelta","errorMessage","repositoryError","selectTab","runQuery","changePage","explain","executedQueryTab","getQueryType","warning","explainRequested","currentTabConfig","resetCurrentTabConfig","lastRunQueryMode","getQueryMode","toggleSampleQueries","showSampleQueries","getSavedQueries","sampleQueries","collapse","msg","getError","getExistingTabId","existingTabId","showModal","modalSelector","shared","savedQuery","getValue","modal","findTabIndexByID","currentScope","hint","fontSize","backgroundColor","zIndex","newValue","elRect","pageSize","page","queryExists","saveTab","idx","loadTab","setValue","updateDownloadDropdown","$broadcast","options","outputType","customError","getException","setYasrResponse","textStatus","jqXhrOrErrorString","hasClass","TABS_STATE_CURRENT_ID","allResultsCountExact","timeFinished","timeTook","customUpdateMessage","warningMessage","setInterval","showOrHideSaveAsDropDown","isOntop","isFedX","isActiveRepoFedXType","inferenceBtn","handleSameAsAndInferenceBtns","nocount","overrideSameAsInferenceAndNoCountIfNeeded","addNewTab","tabName","isTabChangeOk","maxID","newID","newTab","TABS_STATE_MAXID","callbackArgs","abortCurrentQuery","abortQueryByAlias","editQuery","controller","edit","okButtonText","queryModal","addNewSavedQuery","deleteQueryHttp","editSavedQuery","getNamespaces","namespacesLoading","getRepositoryNamespaces","usedPrefixes","bindings","namespaces","finally","changePagination","addKnownPrefixes","isDefined","querySelected","tabId","highlightNextTabChange","deleteQuery","savedQueryName","openSimpleModal","deleteSavedQuery","saveQuery","existingQueryErrMsg","saveQueryHttp","getLoaderMessage","timeSeconds","timeHuman","getHumanReadableSeconds","changeViewMode","VIEW_MODE","focusQueryEditor","is","focus","getActiveRepository","getActiveRepositoryNoError","onbeforeunload","clearInterval","getQueryID","$saveAsDropDown","queryValid","isNew","info","tabEvent","colors","highlightFun","editQueryModal","deleteQueryModal","saveQueryModal","getResultsDescription","currentPageEnd","getUpdateDescription","getStaleWarningMessage","secondsAgo","unbind","QuerySampleModalCtrl","$modalInstance","ok","form","$valid","close","dismiss","STATIC_RULESETS","REPOSITORY_TYPES","graphdbRepo","free","eeWorker","eeMaster","ontop","fedx","FILENAME_PATTERN","NUMBER_PATTERN","GraphDataRestService","CLASS_HIERARCHY_ENDPOINT","DOMAIN_RANGE_ENDPOINT","DEPENDENCIES_ENDPOINT","EXPORE_GRAPH_ENDPOINT","getClassHierarchyData","graphURI","reloadClassHierarchy","doReload","getClassInstances","targetUri","getDomainRangeData","collapsed","checkDomainRangeData","head","getRelationshipsData","selectedClasses","getRelationshipsClasses","getRelationshipsStatus","calculateRelationships","getPredicates","sourceClass","destinationClass","getInstanceNode","iri","getInstanceNodeLinks","getRdfsLabelAndComment","languages","extraParams","requestParams","extend","uri","UiScrollService","initLazyList","actualIndex","processAndFilterLabelAndComment","processKeysWithColon","newObj","origKey","labels","comments","processedObj","isUndefined","label","comment","langFilter","lang","filteredRdfsLabel","grep","filteredRdfsComment","rdfsLabel","rdfsComment","SavedGraphsRestService","SAVED_GRAPHS_ENDPOINT","getSavedGraphs","getSavedGraph","editSavedGraph","graph","deleteSavedGraph","delete","addNewSavedGraph","post","GraphConfigRestService","EXPLORE_GRAPH_ENDPOINT","EXPLORE_GRAPH_CONFIG_ENDPOINT","getGraphConfigs","getGraphConfigSamples","loadGraphForConfig","includeInferred","linksLimit","startQuerySameAs","getConfig","createGraphConfig","updateGraphConfig","deleteGraphConfig","validateQuery","all","oneOf","SAFARI_IE_EDGE_CLASS_LIMIT","FIREFOX_CLASS_LIMIT","CLASS_COUNT_THRESHOLD","CLASS_COUNT_THRESHOLD_IE","RdfClassHierarchyCtlr","$rootScope","$location","$licenseService","RdfsLabelCommentService","bowser","classHierarchyData","instancesObj","instancesQueryObj","items","instancesNotFiltered","isWarningShowed","onopen","onclose","noop","currentBrowserLimit","firefox","safari","msie","msedge","datasource","selectedGraph","allGraphs","initView","resolveGraphs","graphsInRepo","setSelectedGraphFromCache","selGraphFromCache","some","contextID","initClassCountSlider","classCount","currentSliderValue","classCountSlider","classLimit","showExternalElements","vertical","showSelectionBar","onChange","setNewCurrentSliderValue","CLASS_HIERARCHY_CURRENT_SLIDER_VALUE","chrome","browser","CLASS_HIERARCHY_SWITCH_PREFIXES","lastTimeWheel","stopPropagation","originalEvent","goToDomainRangeGraphView","selectedClass","fullName","CLASS_HIERARCHY_LAST_SELECTED_CLASS","hash","search","refreshDiagramExternalElements","showClassInfoPanel","clearClassHieararchyState","hidePrefixes","CLASS_HIERARCHY_HIDE_PREFIXES","fixToolbar","hasClassHierarchy","revision","adapterContainer","adapter","remain","isLicenseValid","currentActiveRepository","toggleClassInfoSidePanel","isSystemRepository","confirmReloadClassHierarchy","loader","hierarchyError","focusOnRoot","copyToClipboard","openCopyToClipboardModal","searchedClassCallback","selected","searchedClass","instancesFilterFunc","inst","resolvedUri","reload","localNameStartIdx","encodedUri","encodedQuery","viewInstancesUri","expanded","instancesLoader","startsWith","endsWith","absUri","absUriNonEncoded","instancesSearchPlaceholder","prepareDataForClassInfoSidePanel","ready","chosenGraph","getSelGraphValue","isAllGraphsSelected","DomainRangeGraphCtlr","predicatesObj","predicatesQueryObj","predicatesListNotFiltered","predicatesSearchPlaceholder","doCollapseEdges","DOMAIN_RANGE_COLLAPSE_EDGES","goToClassHierarchyView","lastSelectedClass","collapseEdges","objectPropClassUri","objectPropClassName","toggleCollapseEdgesState","history","pushState","predicatesListFilterFunc","pred","showPredicatesInfoPanel","selectedPredicate","targetNode","sourceNode","sourceTargetObjectNodeUri","encodedSourceTargetObjectNodeUri","sourceTargetObjectNodeName","allEdges","isImplicit","implicit","prepareDataForPredicatesInfoSidePanel","humanize","DependenciesChordCtrl","STATUS","WAIT","NO_REPO","matrixData","dependenciesData","hasLinks","arr","READY","IN_PROGRESS","classesData","allClasses","classFilterFunc","allNotFilteredClasses","ERROR","classQuery","isLoading","confirmCalculateDependencies","calculateDependencies","clazz","showClass","classToShow","isClassByNameShown","addClassByName","removeClassByName","removeAllClasses","repoIsSetListener","removeRepoIsSetListener","selectGraph","getSelectedGraphValue","global","$tooltipProvider","appendToBody","GraphsVisualizationsCtrl","ClassInstanceDetailsService","AutocompleteRestService","languageChanged","propertiesObj","propertiesQueryObj","propertiesNotFiltered","searchVisible","nodeSelected","queryResultsMode","embedded","openedNodeInfoPanel","invalidLimit","INVALID_LINKS_MSG","INVALID_LINKS_TOOLTIP","propertiesSearchPlaceholder","saved","noGoHome","type2color","colorIndex","nodeLabelMinFontSize","panAndZoom","transformValues","tipElement","openedLink","initSettings","settingsFromPrincipal","defaultSettings","sameAsState","includeSchema","localStorageSettings","GRAPHS_VIZ","saveSettings","unique","propertiesFilterFunc","resetState","configLoaded","lastSavedGraphName","lastSavedGraphId","numberOfPinnedNodes","pushHistory","searchParams","state","goToHome","shouldShowSettings","defaultGraphConfig","sameAsCheckbox","settings","prop","toggleMoreInfo","ev","currentTarget","toggle","toggleClass","showLinksText","preferredTypes","rejectedTypes","preferredPredicates","rejectedPredicates","preferredTypesOnly","preferredPredicatesOnly","renderSettings","languagesMap","preferredTypesMap","rejectedTypesMap","preferredPredicatesMap","rejectedPredicatesMap","resetSettings","validateLinksLimit","changeLimit","delta","showSettings","showInfoPanel","showFilter","showNodeInfo","showPredicates","reExpandNode","rootNodeIri","loadGraphForQuery","queryString","sameAsParam","inferredParam","sendSameAs","sendInferred","loading","initGraphFromResponse","removeSpecialChars","convertTripleToLinkId","triple","tripleLike","tripleParts","convertLinkDataToLinkId","getNodeX","isTriple","getNodeY","createTriple","createArrowMarkerUniqueID","Graph","tripleNodes","Map","tripleLinksCopy","addNode","computeConnectedness","counts","seenLinks","i2","seenKey","connectedness","addAndMatchLinks","newLinks","isTripleSource","getTripleNode","isTripleTarget","matchedLink","predicates","linkId","matchLinksToNodes","countLinks","findLinksForNode","linksTypes","linksForNode","types","uniq","flatten","linksPredicates","removeTriples","triplesToRemove","targetTriples","reject","sourceSplit","lSource","lTarget","targetSplit","isRejected","removeNode","removeNodeLeafLinks","targetLinks","addTriple","copyState","nodesCopy","rdfRank","triplesCopy","restoreState","draw","updateSettings","startMode","loadGraphConfig","graphCallback","graphConfigs","loadConfigForId","configId","successCallback","findConfigById","easyGraphSearch","openUri","startIRI","startGraphQuery","startQueryIncludeInferred","deleteConfig","configName","refreshSavedGraphs","goToGraphConfig","onpopstate","savedGraph","loadSavedGraph","initGraphFromQueryParam","inputValue","rootNode","expandNode","loadGraphFromQueryParam","initForRepository","hasInitedRepository","getNamespacesPromise","nss","sortBy","checkAutocompleteStatus","getAutocompletePromise","replaceIRIWithPrefix","namespacePrefix","findLast","addedTag","tag","uriParts","uriPart","localName","expandedUri","getNamespaceUriForPrefix","expandPrefix","pageslideExpanded","validateTag","category","wildcardOK","wildcardPos","getTagClass","tagText","multiClickDelay","nodeLabelRectScaleX","color1","color2","getColor","showNodeTipAndIconsTimer","removeIconsTimer","setLoadingState","getLoadingState","init","resetRootNode","removeMenuIfVisible","createTipText","getShortPredicate","numOfPredLeft","numberOfPredLeft","textToShow","tipPredicateElement","tipPredicates","textWidth","ctx","getContext","font","measureText","calculateWidth","hideTipForNode","tipTimer","splitedLink","predicateText","textLength","getPredicateTextLength","predicate","getPredicate","tipPredicateTimer","thisPredicateTipElement","showPredicateToolTip","revertElementsStyleToDefault","tripleNode","clickedNode","button","nodeCopy","applyElementsStyleChanges","foundNodeIndex","findIndex","getTripleNodeIndex","isPartOfTriple","partOfTriple","nodeIndex","openPredicates","linkActions","mouseEventTimer","upEventLast","virtualClickEventTimer","moveEventCount","downEventHandler","timeStamp","upEventHandler","closeInfoPanel","showPinAnimation","startSize","endSize","startOpacity","endOpacity","animate","pin","innerD","fixedBeforeDrag","isBeingDragged","beginDragging","pinWasFixed","menuEvents","closeIcon","expandIcon","focusIcon","copyURIIcon","removeIcons","initIcons","expandNodeIcons","thisTipElement","showTipForNode","hideNode","updateTipForNode","nodeLabels","endlessLoopGuard","scrollHeight","scrollWidth","clientWidth","updateNodeLabels","sourceX","targetX","sourceY","targetY","linkedNodes","angleDeg","findAngleBetweenNodes","sourceId","targetId","twoWayLinkID","textNode","createTextNode","lastChild","getPositionAndAngle","collapseIcon","actionsTip","expandedState","isExpanded","animateMenu","ctrlKey","metaKey","initGraph","renderGraphFromResponse","isStartNode","linksFound","newLink","existingLink","linksCopy","tripleLinksIt","nodesFromLinks","distinctBy","union","existingNodes","Boolean","tripleNodesIt","newNodes","promises","newNodesData","newNode","res","newNodeData","expandIri","nodeTypes","nodeIri","resourceType","encodedIri","encodeURI","dataNodeKeysQuery","mapKeys","nodeImage","imageVal","updatePredicatesColor","getElementsByClassName","linkLink","stroke","strokeWidth","markers","marker","markerLink","preds","predLink","oppLinkIRI","oppTriplePred","currEl","fontWeight","shortIRI","toggleSidePanel","clickLink","predData","clickedEl","every","linkPred","splitPredicate","isLoadingLocation","hasActiveLocation","isLeft","pivotX","pivotY","noHistory","saveOrUpdateGraph","graphToSave","saveGraphModal","renameSavedGraph","graphToRename","editSavedGraphHttp","graphExists","restart","saveGraphHttp","savedGraphs","graphToLoad","owner","copyToClipboardSavedGraph","protocol","host","pathname","graphName","deleteSavedGraphHttp","openIRI","togglePinAllNodes","nodeName","getLiteralFromPropValue","SaveGraphModalCtrl","saveNew","GraphConfigCtrl","$routeParams","selectedFixedNodeChanged","totalPages","helpHidden","HIDE_GRAPH_CONFIG_HELP","toggleHelp","fixedVisualCallback","newConfig","startIRILabel","isDefaultGraph","sample","isUserGraph","getSampleName","extra","samples","revertConfig","showInvalidMsg","getQueryForCurrentPage","expandQuery","resourceQuery","predicateLabelQuery","resourcePropertiesQuery","initForConfig","async","validateQueryWithCallback","broadcastAddStartFixedNodeEvent","checkPageAndMode","validateCurrentPage","updateModel","goToPage","nextPage","showEditor","notoolbar","goToPreviousPage","goToNextPage","saveGraphConfig","isUpdate","setQuery","updateDirty","q2","queryEditorIsDirty","updateEditor","showPreview","revertEditor","encodeQuery","tabID","verticalViewParam","classHierarchyDirective","ZOOM_DURATION","ROOT_OBJ_NAME","flattenedClassNames","diameter","appendMainGroup","getPrefixesState","prepareForSVGImageExport","imgSrc","href","download","autoZoomToPreviousState","doFocus","oldRoot","rootFocusEvent","classSearchEvent","prefixesWatch","currentClassCountWatch","searchedClassBroadcast","onEnterClassSearchBroadcast","flattenedClassData","drawDiagram","newFocus","switchPrefixes","isInFocusTransitive","innerWidth","circleGroup","doFade","role","noPrefixes","textHidden","getCurrentClassDataAndMarkSelected","closeClassInfoPanel","uniqBy","clickCancel","newobj","sortingRank","replaceState","sendSliderData","textSel","noPrefixName","keepPrevState","focusOnCurrentClass","focusHistoryId","topLevelParentUri","adjustRadius","newr","textUpdateStart","display","textUpdateEnd","shouldClosePanel","currentClassCount","removeResizeListener","initialPrefixesState","newRoot","noPrefixesGlobal","sorted","sortRoot","restoreDiagramState","currentRoot","prefixesConfig","redrawFilteredDiagram","sortedRoot","useSlider","addedIds","Set","fixChildren","newChildren","currentSearchedClass","basicConfig","savePrefixesState","renderCirclePacking","constant","domainRangeGraphDirective","ONTO_RED","ONTO_GREEN","ONTO_BLUE","NON_COLLAPSED_REFLEXIVE_LINK_LIMIT","moveToFront","moveToBack","firstChild","mainClassSize","otherClassSize","datatypeSize","labelFontSize","basicArrowStrokeWidth","collapsedArrowStrokeWidth","defs","viewBox","refX","refY","markerUnits","markerWidth","markerHeight","class","legendBackgroundWidth","legendBackgroundHeight","legendCellGroup","legendTextX","legendLabelFontSize","classNodeY","classNodeTextY","objectNodeY","objectNodeTextY","datatypeNodeY","datatypeNodeTextY","basicPropertyArrowY","absUrl","implicitPropArrowY","collapsedPropArrowY","selectedRdfUri","classNodeLabel","domainRangeGraphData","DOMAIN_RANGE_WENT_BACK","switchEdgeMode","linkGroup","styleArrowsInCollapsedMode","loopLink","loopLinkEdgeCount","objectPropNodeClassUri","propertyType","targetRadius","targetNodeEdgeCount","loopLinkSize","previousPropertyNameSelection","disableCollapsedPredicateLabelHightlighting","isEmptyObject","onCollapsedPropertyNameClick","previousSibling","propertyNames","textPadding","linkRect","calculatedWidth","calculatedHeight","translateX","nodeGroup","classPosition","rdfClassName","classNode","loopLinkBackgroundSel","loopLinkPropertyName","loopLinkBackgroundProps","positionLoopLinkBackgrounds","loopLinkBackgroundY","loopLinkBackgroundX","allLoopLinkEdges","foundLoopLinkBackgroundProps","viewMoreTextWidth","getComputedTextLength","adjustViewMorePredicatesLabel","pushEdgesToLeftAndRight","loopTranslateX","loopTranslateY","positionLoopLink","currentBackgroundHeight","loopLinkLabelX","loopLinkLabelY","predicatesLeft","labelSel","backgroundSel","createViewMorePredicatesLabel","positionLoopLinkLabels","log10","absDiff","logOffset","centerClassNode","renderDomainRangeGraph","systemRepoWarningDirective","hasPermission","rdfsCommentLabelDirective","SHORT_COMMENT_LENGTH","alwaysExpanded","stringLimit","scrollToTop","checkCommentLength","innerText","equalHeights","commentHeight","toggleFullComment","dependenciesChordDirective","zeroMatrix","isZeroMatrix","tooltip","predicatesData","tooltipContent","icon","drawChord","listItemsSearchFilterDirective","filterQueryObj","filterFunction","listItemsObj","listItemsNotFiltered","searchPlaceholder","searchQuery","nonFilteredData","customFilter","searchIconInputDirective","searchData","searchedObjCallback","performSearchActionOnEnter","showInput","hideInput"],"mappings":"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","file":"12.9004ab127289745129a4.bundle.js","sourcesContent":["import 'angular/core/services';\nimport 'angular/core/controllers';\nimport 'angular/core/directives';\nimport 'angular/core/services/repositories.service';\nimport 'angular-ui-scroll/dist/ui-scroll.min';\nimport 'angular-ui-scroll/dist/ui-scroll-jqlite.min';\nimport 'd3/build/d3';\nimport 'lib/d3-ONTO-chord-patch';\nimport 'lib/d3-tip/d3-tip-patch';\nimport 'angular-pageslide-directive/dist/angular-pageslide-directive';\nimport 'angularjs-slider/dist/rzslider.min';\nimport 'lib/angucomplete-alt/angucomplete-alt';\nimport 'ng-tags-input/build/ng-tags-input.min';\nimport 'lib/common/d3-utils';\nimport 'lib/common/circle-packing';\nimport 'lib/common/svg-export';\nimport 'angular/rest/graph-data.rest.service';\nimport 'angular/graphexplore/services/ui-scroll.service';\nimport 'angular/graphexplore/services/rdfs-label-comment.service';\nimport 'angular/rest/saved-graphs.rest.service';\nimport 'angular/rest/graph-config.rest.service';\nimport 'angular/graphexplore/controllers/rdf-class-hierarchy.controller';\nimport 'angular/graphexplore/controllers/domain-range-graph.controller';\nimport 'angular/graphexplore/controllers/dependencies-chord.controller';\nimport 'angular/graphexplore/controllers/graphs-visualizations.controller';\nimport 'angular/graphexplore/controllers/graphs-config.controller';\nimport 'angular/graphexplore/directives/rdf-class-hierarchy.directive';\nimport 'angular/graphexplore/directives/domain-range-graph.directive';\nimport 'angular/graphexplore/directives/system-repo-warning.directive';\nimport 'angular/graphexplore/directives/rdfs-comment-label.directive';\nimport 'angular/graphexplore/directives/dependencies-chord.directive';\nimport 'angular/graphexplore/directives/list-items-search-filter.directive';\nimport 'angular/graphexplore/directives/search-icon-input.directive';\nimport 'angular/core/directives/queryeditor/query-editor.controller';\nimport 'angular/core/directives/queryeditor/query-editor.directive';\n\nangular.module('graphdb.framework.graphexplore', [\n 'graphdb.framework.core.controllers',\n 'graphdb.framework.core.directives',\n 'graphdb.framework.rest.graphexplore.data.service',\n 'graphdb.framework.graphexplore.services.uiscroll',\n 'graphdb.framework.graphexplore.services.rdfsdetails',\n 'graphdb.framework.rest.graphexplore.savedgraphs.service',\n 'graphdb.framework.rest.graphconfig.service',\n 'graphdb.framework.graphexplore.controllers.class',\n 'graphdb.framework.graphexplore.controllers.domainrange',\n 'graphdb.framework.graphexplore.controllers.dependencies',\n 'graphdb.framework.graphexplore.controllers.graphviz',\n 'graphdb.framework.graphexplore.controllers.graphviz.config',\n 'graphdb.framework.graphexplore.directives.sysrepo',\n 'graphdb.framework.graphexplore.directives.rdfsdetails',\n 'graphdb.framework.graphexplore.directives.searchfilter',\n 'graphdb.framework.graphexplore.directives.class',\n 'graphdb.framework.graphexplore.directives.domainrange',\n 'graphdb.framework.graphexplore.directives.dependencies',\n 'graphdb.framework.graphexplore.directives.searchcontrols',\n 'graphdb.framework.core.directives.queryeditor.controllers',\n 'graphdb.framework.core.directives.queryeditor.queryeditor'\n]);\n","var D3 = D3 || {};\n\nD3.Text = function () {\n function calcFontSizeRaw(text, radius, minimumSize, isMultiline) {\n minimumSize = minimumSize || 10;\n\n var textSize = radius / 3;\n if (typeof text === \"string\") {\n var len = text.substring(0, radius / 3).length + 1.5;\n textSize *= 10 / len;\n textSize += 1;\n // experimental alternative method:\n // var textSize = 3.3 * radius / text.length;\n\n // Tweak for Indian scripts and CJK ones\n if (text.match(/[\\u0900-\\u0DFF\\u1100-\\u11FF\\u2E80-\\u2EFF\\u3000-\\u9FFF]/)) {\n textSize *= 0.6;\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n /* Disabled for the time being, better without this\n if (isMultiline) {\n var numWords = text.split(/\\s+/).length;\n if (numWords > 1) {\n if (numWords > 4) {\n numWords = 4;\n }\n textSize += textSize * (4 - numWords) * 0.1;\n }\n }\n */\n\n return Math.round(textSize);\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n return Math.round(textSize);\n }\n\n function calcFontSize(text, radius, minimumSize, isMultiline) {\n return calcFontSizeRaw(text, radius, minimumSize, isMultiline) + 'px';\n }\n\n function getTextWithElipsisIfNeeded(str, threshold) {\n if (typeof str === \"string\") {\n if (str.length > threshold) {\n return str.substring(0, threshold - 3) + \"...\";\n }\n }\n return str;\n }\n\n return {\n calcFontSizeRaw: calcFontSizeRaw,\n calcFontSize: calcFontSize,\n getTextWithElipsisIfNeeded: getTextWithElipsisIfNeeded\n };\n}();\n\nD3.Transition = function () {\n function fadeIn(sel, duration) {\n sel.style(\"opacity\", 0.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 1.0);\n }\n\n function fadeOut(sel, duration) {\n sel.style(\"opacity\", 1.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 0.0);\n }\n\n return {\n fadeIn: fadeIn,\n fadeOut: fadeOut\n };\n}();\n\nD3.Click = function () {\n function delayDblClick() {\n var event = d3.dispatch('click', 'dblclick');\n\n function cc(selection) {\n var down,\n tolerance = 5,\n last,\n wait = null;\n\n // euclidean distance\n function dist(a, b) {\n return Math.sqrt(Math.pow(a[0] - b[0], 2), Math.pow(a[1] - b[1], 2));\n }\n\n selection.on('mousedown', function () {\n down = d3.mouse(document.body);\n last = +new Date();\n });\n selection.on('mouseup', function (d) {\n if (dist(down, d3.mouse(document.body)) > tolerance) {\n return;\n } else {\n if (wait) {\n window.clearTimeout(wait);\n wait = null;\n event.dblclick(d);\n } else {\n wait = window.setTimeout((function (e) {\n return function () {\n event.click(d);\n wait = null;\n };\n })(d3.event), 250);\n }\n }\n });\n }\n\n return d3.rebind(cc, event, 'on');\n }\n\n return {\n delayDblClick: delayDblClick\n };\n}();\n\nexport default D3;\n","var SVG = SVG || {};\n\nSVG.Export = function () {\n function getCSSRules(cssSourceFilePath) {\n var cssRules = $('link[href=\"' + cssSourceFilePath + '\"]')[0].sheet.rules;\n var cssStr = \"\";\n _.each(cssRules, function (value) {\n cssStr += value.cssText;\n });\n return cssStr;\n }\n\n function generateBase64ImageSource() {\n // add needed xml namespace\n var exportSvg = d3.selectAll(\"svg\")\n .attr({\n version: \"1.1\",\n xmlns: \"http://www.w3.org/2000/svg\"\n })\n .node().parentNode.innerHTML;\n\n // convert selected html to base64\n return \"data:image/svg+xml;charset=utf-8;base64,\" + btoa(unescape(encodeURIComponent(exportSvg)));\n }\n\n return {\n getCSSRules: getCSSRules,\n generateBase64ImageSource: generateBase64ImageSource\n };\n}();\n\nexport default SVG;\n","// d3.tip\n// Copyright (c) 2013 Justin Palmer\n//\n// Tooltips for d3.js SVG visualizations\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module with d3 as a dependency.\n define([], factory)\n } else if (typeof module === 'object' && module.exports) {\n // CommonJS\n module.exports = function(d3) {\n d3.tip = factory(d3)\n return d3.tip\n }\n } else {\n // Browser global.\n root.d3.tip = factory(root.d3)\n }\n}(this, function () {\n // Public - contructs a new tooltip\n //\n // Returns a tip\n return function() {\n var direction = d3_tip_direction,\n offset = d3_tip_offset,\n html = d3_tip_html,\n node = initNode(),\n svg = null,\n point = null,\n target = null,\n customPosition = null\n\n function tip(vis) {\n svg = getSVGNode(vis)\n point = svg.createSVGPoint()\n document.body.appendChild(node)\n }\n\n // Public - show the tooltip on the screen\n //\n // Returns a tip\n tip.show = function() {\n var args = Array.prototype.slice.call(arguments)\n if(args[args.length - 1] instanceof SVGElement) target = args.pop()\n\n var content = html.apply(this, args),\n poffset = offset.apply(this, args),\n dir = direction.apply(this, args),\n nodel = getNodeEl(),\n i = directions.length,\n coords,\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft,\n customPos = customPosition.apply(this, args)\n\n nodel.html(content)\n .style({ opacity: 1, 'pointer-events': 'all' })\n\n while(i--) nodel.classed(directions[i], false)\n coords = direction_callbacks.get(dir).apply(this)\n\n if (customPos) {\n nodel.style(customPos)\n } else {\n nodel.classed(dir, true).style({\n top: (coords.top + poffset[0]) + scrollTop + 'px',\n left: (coords.left + poffset[1]) + scrollLeft + 'px'\n })\n }\n\n return tip\n }\n\n // Public - hide the tooltip\n //\n // Returns a tip\n tip.hide = function() {\n var nodel = getNodeEl()\n nodel.style({ opacity: 0, 'pointer-events': 'none' })\n return tip\n }\n\n // Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.\n //\n // n - name of the attribute\n // v - value of the attribute\n //\n // Returns tip or attribute value\n tip.attr = function(n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().attr(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.attr.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Proxy style calls to the d3 tip container. Sets or gets a style value.\n //\n // n - name of the property\n // v - value of the property\n //\n // Returns tip or style property value\n tip.style = function(n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().style(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.style.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Set or get the direction of the tooltip\n //\n // v - One of n(north), s(south), e(east), or w(west), nw(northwest),\n // sw(southwest), ne(northeast) or se(southeast)\n //\n // Returns tip or direction\n tip.direction = function(v) {\n if (!arguments.length) return direction\n direction = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n // Public: Sets or gets the offset of the tip\n //\n // v - Array of [x, y] offset\n //\n // Returns offset or\n tip.offset = function(v) {\n if (!arguments.length) return offset\n offset = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n // Public: sets or gets the html value of the tooltip\n //\n // v - String value of the tip\n //\n // Returns html value or tip\n tip.html = function(v) {\n if (!arguments.length) return html\n html = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n tip.customPosition = function(v) {\n if (!arguments.length) return customPosition\n customPosition = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n // Public: destroys the tooltip and removes it from the DOM\n //\n // Returns a tip\n tip.destroy = function() {\n if(node) {\n getNodeEl().remove();\n node = null;\n }\n return tip;\n }\n\n function d3_tip_direction() { return 'n' }\n function d3_tip_offset() { return [0, 0] }\n function d3_tip_html() { return ' ' }\n\n var direction_callbacks = d3.map({\n n: direction_n,\n s: direction_s,\n e: direction_e,\n w: direction_w,\n nw: direction_nw,\n ne: direction_ne,\n sw: direction_sw,\n se: direction_se\n }),\n\n directions = direction_callbacks.keys()\n\n function direction_n() {\n var bbox = getScreenBBox()\n return {\n top: bbox.n.y - node.offsetHeight,\n left: bbox.n.x - node.offsetWidth / 2\n }\n }\n\n function direction_s() {\n var bbox = getScreenBBox()\n return {\n top: bbox.s.y,\n left: bbox.s.x - node.offsetWidth / 2\n }\n }\n\n function direction_e() {\n var bbox = getScreenBBox()\n return {\n top: bbox.e.y - node.offsetHeight / 2,\n left: bbox.e.x\n }\n }\n\n function direction_w() {\n var bbox = getScreenBBox()\n return {\n top: bbox.w.y - node.offsetHeight / 2,\n left: bbox.w.x - node.offsetWidth\n }\n }\n\n function direction_nw() {\n var bbox = getScreenBBox()\n return {\n top: bbox.nw.y - node.offsetHeight,\n left: bbox.nw.x - node.offsetWidth\n }\n }\n\n function direction_ne() {\n var bbox = getScreenBBox()\n return {\n top: bbox.ne.y - node.offsetHeight,\n left: bbox.ne.x\n }\n }\n\n function direction_sw() {\n var bbox = getScreenBBox()\n return {\n top: bbox.sw.y,\n left: bbox.sw.x - node.offsetWidth\n }\n }\n\n function direction_se() {\n var bbox = getScreenBBox()\n return {\n top: bbox.se.y,\n left: bbox.e.x\n }\n }\n\n function initNode() {\n var node = d3.select(document.createElement('div'))\n node.style({\n position: 'absolute',\n top: 0,\n opacity: 0,\n 'pointer-events': 'none',\n 'box-sizing': 'border-box'\n })\n\n return node.node()\n }\n\n function getSVGNode(el) {\n el = el.node()\n if(el.tagName.toLowerCase() === 'svg')\n return el\n\n return el.ownerSVGElement\n }\n\n function getNodeEl() {\n if(node === null) {\n node = initNode();\n // re-add node to DOM\n document.body.appendChild(node);\n };\n return d3.select(node);\n }\n\n // Private - gets the screen coordinates of a shape\n //\n // Given a shape on the screen, will return an SVGPoint for the directions\n // n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),\n // sw(southwest).\n //\n // +-+-+\n // | |\n // + +\n // | |\n // +-+-+\n //\n // Returns an Object {n, s, e, w, nw, sw, ne, se}\n function getScreenBBox() {\n var targetel = target || d3.event.target;\n\n while ('undefined' === typeof targetel.getScreenCTM && 'undefined' === targetel.parentNode) {\n targetel = targetel.parentNode;\n }\n\n var bbox = {},\n matrix = targetel.getScreenCTM(),\n tbbox = targetel.getBBox(),\n width = tbbox.width,\n height = tbbox.height,\n x = tbbox.x,\n y = tbbox.y\n\n point.x = x\n point.y = y\n bbox.nw = point.matrixTransform(matrix)\n point.x += width\n bbox.ne = point.matrixTransform(matrix)\n point.y += height\n bbox.se = point.matrixTransform(matrix)\n point.x -= width\n bbox.sw = point.matrixTransform(matrix)\n point.y -= height / 2\n bbox.w = point.matrixTransform(matrix)\n point.x += width\n bbox.e = point.matrixTransform(matrix)\n point.x -= width / 2\n point.y -= height / 2\n bbox.n = point.matrixTransform(matrix)\n point.y += height\n bbox.s = point.matrixTransform(matrix)\n\n return bbox\n }\n\n return tip\n };\n\n}));","!function() {\n var d3 = {\n version: \"3.5.12\"\n };\n var d3_arraySlice = [].slice, d3_array = function(list) {\n return d3_arraySlice.call(list);\n };\n var d3_document = this.document;\n function d3_documentElement(node) {\n return node && (node.ownerDocument || node.document || node).documentElement;\n }\n function d3_window(node) {\n return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n }\n if (d3_document) {\n try {\n d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n } catch (e) {\n d3_array = function(list) {\n var i = list.length, array = new Array(i);\n while (i--) array[i] = list[i];\n return array;\n };\n }\n }\n if (!Date.now) Date.now = function() {\n return +new Date();\n };\n if (d3_document) {\n try {\n d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n } catch (error) {\n var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n d3_element_prototype.setAttribute = function(name, value) {\n d3_element_setAttribute.call(this, name, value + \"\");\n };\n d3_element_prototype.setAttributeNS = function(space, local, value) {\n d3_element_setAttributeNS.call(this, space, local, value + \"\");\n };\n d3_style_prototype.setProperty = function(name, value, priority) {\n d3_style_setProperty.call(this, name, value + \"\", priority);\n };\n }\n }\n d3.ascending = d3_ascending;\n function d3_ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n }\n d3.descending = function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n };\n d3.min = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n }\n return a;\n };\n d3.max = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n }\n return a;\n };\n d3.extent = function(array, f) {\n var i = -1, n = array.length, a, b, c;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n }\n return [ a, c ];\n };\n function d3_number(x) {\n return x === null ? NaN : +x;\n }\n function d3_numeric(x) {\n return !isNaN(x);\n }\n d3.sum = function(array, f) {\n var s = 0, n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n } else {\n while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n }\n return s;\n };\n d3.mean = function(array, f) {\n var s = 0, n = array.length, a, i = -1, j = n;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n }\n if (j) return s / j;\n };\n d3.quantile = function(values, p) {\n var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n return e ? v + e * (values[h] - v) : v;\n };\n d3.median = function(array, f) {\n var numbers = [], n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n }\n if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n };\n d3.variance = function(array, f) {\n var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n if (arguments.length === 1) {\n while (++i < n) {\n if (d3_numeric(a = d3_number(array[i]))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n } else {\n while (++i < n) {\n if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n }\n if (j > 1) return s / (j - 1);\n };\n d3.deviation = function() {\n var v = d3.variance.apply(this, arguments);\n return v ? Math.sqrt(v) : v;\n };\n function d3_bisector(compare) {\n return {\n left: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n }\n return lo;\n }\n };\n }\n var d3_bisect = d3_bisector(d3_ascending);\n d3.bisectLeft = d3_bisect.left;\n d3.bisect = d3.bisectRight = d3_bisect.right;\n d3.bisector = function(f) {\n return d3_bisector(f.length === 1 ? function(d, x) {\n return d3_ascending(f(d), x);\n } : f);\n };\n d3.shuffle = function(array, i0, i1) {\n if ((m = arguments.length) < 3) {\n i1 = array.length;\n if (m < 2) i0 = 0;\n }\n var m = i1 - i0, t, i;\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n }\n return array;\n };\n d3.permute = function(array, indexes) {\n var i = indexes.length, permutes = new Array(i);\n while (i--) permutes[i] = array[indexes[i]];\n return permutes;\n };\n d3.pairs = function(array) {\n var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n return pairs;\n };\n d3.zip = function() {\n if (!(n = arguments.length)) return [];\n for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {\n for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {\n zip[j] = arguments[j][i];\n }\n }\n return zips;\n };\n function d3_zipLength(d) {\n return d.length;\n }\n d3.transpose = function(matrix) {\n return d3.zip.apply(d3, matrix);\n };\n d3.keys = function(map) {\n var keys = [];\n for (var key in map) keys.push(key);\n return keys;\n };\n d3.values = function(map) {\n var values = [];\n for (var key in map) values.push(map[key]);\n return values;\n };\n d3.entries = function(map) {\n var entries = [];\n for (var key in map) entries.push({\n key: key,\n value: map[key]\n });\n return entries;\n };\n d3.merge = function(arrays) {\n var n = arrays.length, m, i = -1, j = 0, merged, array;\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n return merged;\n };\n var abs = Math.abs;\n d3.range = function(start, stop, step) {\n if (arguments.length < 3) {\n step = 1;\n if (arguments.length < 2) {\n stop = start;\n start = 0;\n }\n }\n if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n start *= k, stop *= k, step *= k;\n if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n return range;\n };\n function d3_range_integerScale(x) {\n var k = 1;\n while (x * k % 1) k *= 10;\n return k;\n }\n function d3_class(ctor, properties) {\n for (var key in properties) {\n Object.defineProperty(ctor.prototype, key, {\n value: properties[key],\n enumerable: false\n });\n }\n }\n d3.map = function(object, f) {\n var map = new d3_Map();\n if (object instanceof d3_Map) {\n object.forEach(function(key, value) {\n map.set(key, value);\n });\n } else if (Array.isArray(object)) {\n var i = -1, n = object.length, o;\n if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n } else {\n for (var key in object) map.set(key, object[key]);\n }\n return map;\n };\n function d3_Map() {\n this._ = Object.create(null);\n }\n var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n d3_class(d3_Map, {\n has: d3_map_has,\n get: function(key) {\n return this._[d3_map_escape(key)];\n },\n set: function(key, value) {\n return this._[d3_map_escape(key)] = value;\n },\n remove: d3_map_remove,\n keys: d3_map_keys,\n values: function() {\n var values = [];\n for (var key in this._) values.push(this._[key]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var key in this._) entries.push({\n key: d3_map_unescape(key),\n value: this._[key]\n });\n return entries;\n },\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n }\n });\n function d3_map_escape(key) {\n return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n }\n function d3_map_unescape(key) {\n return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n }\n function d3_map_has(key) {\n return d3_map_escape(key) in this._;\n }\n function d3_map_remove(key) {\n return (key = d3_map_escape(key)) in this._ && delete this._[key];\n }\n function d3_map_keys() {\n var keys = [];\n for (var key in this._) keys.push(d3_map_unescape(key));\n return keys;\n }\n function d3_map_size() {\n var size = 0;\n for (var key in this._) ++size;\n return size;\n }\n function d3_map_empty() {\n for (var key in this._) return false;\n return true;\n }\n d3.nest = function() {\n var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n function map(mapType, array, depth) {\n if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n values.push(object);\n } else {\n valuesByKey.set(keyValue, [ object ]);\n }\n }\n if (mapType) {\n object = mapType();\n setter = function(keyValue, values) {\n object.set(keyValue, map(mapType, values, depth));\n };\n } else {\n object = {};\n setter = function(keyValue, values) {\n object[keyValue] = map(mapType, values, depth);\n };\n }\n valuesByKey.forEach(setter);\n return object;\n }\n function entries(map, depth) {\n if (depth >= keys.length) return map;\n var array = [], sortKey = sortKeys[depth++];\n map.forEach(function(key, keyMap) {\n array.push({\n key: key,\n values: entries(keyMap, depth)\n });\n });\n return sortKey ? array.sort(function(a, b) {\n return sortKey(a.key, b.key);\n }) : array;\n }\n nest.map = function(array, mapType) {\n return map(mapType, array, 0);\n };\n nest.entries = function(array) {\n return entries(map(d3.map, array, 0), 0);\n };\n nest.key = function(d) {\n keys.push(d);\n return nest;\n };\n nest.sortKeys = function(order) {\n sortKeys[keys.length - 1] = order;\n return nest;\n };\n nest.sortValues = function(order) {\n sortValues = order;\n return nest;\n };\n nest.rollup = function(f) {\n rollup = f;\n return nest;\n };\n return nest;\n };\n d3.set = function(array) {\n var set = new d3_Set();\n if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n return set;\n };\n function d3_Set() {\n this._ = Object.create(null);\n }\n d3_class(d3_Set, {\n has: d3_map_has,\n add: function(key) {\n this._[d3_map_escape(key += \"\")] = true;\n return key;\n },\n remove: d3_map_remove,\n values: d3_map_keys,\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key));\n }\n });\n d3.behavior = {};\n function d3_identity(d) {\n return d;\n }\n d3.rebind = function(target, source) {\n var i = 1, n = arguments.length, method;\n while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n return target;\n };\n function d3_rebind(target, source, method) {\n return function() {\n var value = method.apply(source, arguments);\n return value === source ? target : value;\n };\n }\n function d3_vendorSymbol(object, name) {\n if (name in object) return name;\n name = name.charAt(0).toUpperCase() + name.slice(1);\n for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n var prefixName = d3_vendorPrefixes[i] + name;\n if (prefixName in object) return prefixName;\n }\n }\n var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n function d3_noop() {}\n d3.dispatch = function() {\n var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n return dispatch;\n };\n function d3_dispatch() {}\n d3_dispatch.prototype.on = function(type, listener) {\n var i = type.indexOf(\".\"), name = \"\";\n if (i >= 0) {\n name = type.slice(i + 1);\n type = type.slice(0, i);\n }\n if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n if (arguments.length === 2) {\n if (listener == null) for (type in this) {\n if (this.hasOwnProperty(type)) this[type].on(name, null);\n }\n return this;\n }\n };\n function d3_dispatch_event(dispatch) {\n var listeners = [], listenerByName = new d3_Map();\n function event() {\n var z = listeners, i = -1, n = z.length, l;\n while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n return dispatch;\n }\n event.on = function(name, listener) {\n var l = listenerByName.get(name), i;\n if (arguments.length < 2) return l && l.on;\n if (l) {\n l.on = null;\n listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n listenerByName.remove(name);\n }\n if (listener) listeners.push(listenerByName.set(name, {\n on: listener\n }));\n return dispatch;\n };\n return event;\n }\n d3.event = null;\n function d3_eventPreventDefault() {\n d3.event.preventDefault();\n }\n function d3_eventSource() {\n var e = d3.event, s;\n while (s = e.sourceEvent) e = s;\n return e;\n }\n function d3_eventDispatch(target) {\n var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n dispatch.of = function(thiz, argumentz) {\n return function(e1) {\n try {\n var e0 = e1.sourceEvent = d3.event;\n e1.target = target;\n d3.event = e1;\n dispatch[e1.type].apply(thiz, argumentz);\n } finally {\n d3.event = e0;\n }\n };\n };\n return dispatch;\n }\n d3.requote = function(s) {\n return s.replace(d3_requote_re, \"\\\\$&\");\n };\n var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n var d3_subclass = {}.__proto__ ? function(object, prototype) {\n object.__proto__ = prototype;\n } : function(object, prototype) {\n for (var property in prototype) object[property] = prototype[property];\n };\n function d3_selection(groups) {\n d3_subclass(groups, d3_selectionPrototype);\n return groups;\n }\n var d3_select = function(s, n) {\n return n.querySelector(s);\n }, d3_selectAll = function(s, n) {\n return n.querySelectorAll(s);\n }, d3_selectMatches = function(n, s) {\n var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n d3_selectMatches = function(n, s) {\n return d3_selectMatcher.call(n, s);\n };\n return d3_selectMatches(n, s);\n };\n if (typeof Sizzle === \"function\") {\n d3_select = function(s, n) {\n return Sizzle(s, n)[0] || null;\n };\n d3_selectAll = Sizzle;\n d3_selectMatches = Sizzle.matchesSelector;\n }\n d3.selection = function() {\n return d3.select(d3_document.documentElement);\n };\n var d3_selectionPrototype = d3.selection.prototype = [];\n d3_selectionPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, group, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selector(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_select(selector, this);\n };\n }\n d3_selectionPrototype.selectAll = function(selector) {\n var subgroups = [], subgroup, node;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n subgroup.parentNode = node;\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selectorAll(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_selectAll(selector, this);\n };\n }\n var d3_nsPrefix = {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: \"http://www.w3.org/1999/xhtml\",\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n };\n d3.ns = {\n prefix: d3_nsPrefix,\n qualify: function(name) {\n var i = name.indexOf(\":\"), prefix = name;\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return d3_nsPrefix.hasOwnProperty(prefix) ? {\n space: d3_nsPrefix[prefix],\n local: name\n } : name;\n }\n };\n d3_selectionPrototype.attr = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node();\n name = d3.ns.qualify(name);\n return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n }\n for (value in name) this.each(d3_selection_attr(value, name[value]));\n return this;\n }\n return this.each(d3_selection_attr(name, value));\n };\n function d3_selection_attr(name, value) {\n name = d3.ns.qualify(name);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrConstant() {\n this.setAttribute(name, value);\n }\n function attrConstantNS() {\n this.setAttributeNS(name.space, name.local, value);\n }\n function attrFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n }\n function attrFunctionNS() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n }\n return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n }\n function d3_collapse(s) {\n return s.trim().replace(/\\s+/g, \" \");\n }\n d3_selectionPrototype.classed = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n if (value = node.classList) {\n while (++i < n) if (!value.contains(name[i])) return false;\n } else {\n value = node.getAttribute(\"class\");\n while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n }\n return true;\n }\n for (value in name) this.each(d3_selection_classed(value, name[value]));\n return this;\n }\n return this.each(d3_selection_classed(name, value));\n };\n function d3_selection_classedRe(name) {\n return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n }\n function d3_selection_classes(name) {\n return (name + \"\").trim().split(/^|\\s+/);\n }\n function d3_selection_classed(name, value) {\n name = d3_selection_classes(name).map(d3_selection_classedName);\n var n = name.length;\n function classedConstant() {\n var i = -1;\n while (++i < n) name[i](this, value);\n }\n function classedFunction() {\n var i = -1, x = value.apply(this, arguments);\n while (++i < n) name[i](this, x);\n }\n return typeof value === \"function\" ? classedFunction : classedConstant;\n }\n function d3_selection_classedName(name) {\n var re = d3_selection_classedRe(name);\n return function(node, value) {\n if (c = node.classList) return value ? c.add(name) : c.remove(name);\n var c = node.getAttribute(\"class\") || \"\";\n if (value) {\n re.lastIndex = 0;\n if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n } else {\n node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n }\n };\n }\n d3_selectionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n return this;\n }\n if (n < 2) {\n var node = this.node();\n return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n }\n priority = \"\";\n }\n return this.each(d3_selection_style(name, value, priority));\n };\n function d3_selection_style(name, value, priority) {\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleConstant() {\n this.style.setProperty(name, value, priority);\n }\n function styleFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n }\n return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n }\n d3_selectionPrototype.property = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") return this.node()[name];\n for (value in name) this.each(d3_selection_property(value, name[value]));\n return this;\n }\n return this.each(d3_selection_property(name, value));\n };\n function d3_selection_property(name, value) {\n function propertyNull() {\n delete this[name];\n }\n function propertyConstant() {\n this[name] = value;\n }\n function propertyFunction() {\n var x = value.apply(this, arguments);\n if (x == null) delete this[name]; else this[name] = x;\n }\n return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n }\n d3_selectionPrototype.text = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n } : value == null ? function() {\n this.textContent = \"\";\n } : function() {\n this.textContent = value;\n }) : this.node().textContent;\n };\n d3_selectionPrototype.html = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n } : value == null ? function() {\n this.innerHTML = \"\";\n } : function() {\n this.innerHTML = value;\n }) : this.node().innerHTML;\n };\n d3_selectionPrototype.append = function(name) {\n name = d3_selection_creator(name);\n return this.select(function() {\n return this.appendChild(name.apply(this, arguments));\n });\n };\n function d3_selection_creator(name) {\n function create() {\n var document = this.ownerDocument, namespace = this.namespaceURI;\n return namespace ? document.createElementNS(namespace, name) : document.createElement(name);\n }\n function createNS() {\n return this.ownerDocument.createElementNS(name.space, name.local);\n }\n return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n }\n d3_selectionPrototype.insert = function(name, before) {\n name = d3_selection_creator(name);\n before = d3_selection_selector(before);\n return this.select(function() {\n return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n });\n };\n d3_selectionPrototype.remove = function() {\n return this.each(d3_selectionRemove);\n };\n function d3_selectionRemove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n }\n d3_selectionPrototype.data = function(value, key) {\n var i = -1, n = this.length, group, node;\n if (!arguments.length) {\n value = new Array(n = (group = this[0]).length);\n while (++i < n) {\n if (node = group[i]) {\n value[i] = node.__data__;\n }\n }\n return value;\n }\n function bind(group, groupData) {\n var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n if (key) {\n var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n for (i = -1; ++i < n; ) {\n if (node = group[i]) {\n if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n exitNodes[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n keyValues[i] = keyValue;\n }\n }\n for (i = -1; ++i < m; ) {\n if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n } else if (node !== true) {\n updateNodes[i] = node;\n node.__data__ = nodeData;\n }\n nodeByKeyValue.set(keyValue, true);\n }\n for (i = -1; ++i < n; ) {\n if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n exitNodes[i] = group[i];\n }\n }\n } else {\n for (i = -1; ++i < n0; ) {\n node = group[i];\n nodeData = groupData[i];\n if (node) {\n node.__data__ = nodeData;\n updateNodes[i] = node;\n } else {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n }\n }\n for (;i < m; ++i) {\n enterNodes[i] = d3_selection_dataNode(groupData[i]);\n }\n for (;i < n; ++i) {\n exitNodes[i] = group[i];\n }\n }\n enterNodes.update = updateNodes;\n enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n enter.push(enterNodes);\n update.push(updateNodes);\n exit.push(exitNodes);\n }\n var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n if (typeof value === \"function\") {\n while (++i < n) {\n bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n }\n } else {\n while (++i < n) {\n bind(group = this[i], value);\n }\n }\n update.enter = function() {\n return enter;\n };\n update.exit = function() {\n return exit;\n };\n return update;\n };\n function d3_selection_dataNode(data) {\n return {\n __data__: data\n };\n }\n d3_selectionPrototype.datum = function(value) {\n return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n };\n d3_selectionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_filter(selector) {\n return function() {\n return d3_selectMatches(this, selector);\n };\n }\n d3_selectionPrototype.order = function() {\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n return this;\n };\n d3_selectionPrototype.sort = function(comparator) {\n comparator = d3_selection_sortComparator.apply(this, arguments);\n for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n return this.order();\n };\n function d3_selection_sortComparator(comparator) {\n if (!arguments.length) comparator = d3_ascending;\n return function(a, b) {\n return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n };\n }\n d3_selectionPrototype.each = function(callback) {\n return d3_selection_each(this, function(node, i, j) {\n callback.call(node, node.__data__, i, j);\n });\n };\n function d3_selection_each(groups, callback) {\n for (var j = 0, m = groups.length; j < m; j++) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n if (node = group[i]) callback(node, i, j);\n }\n }\n return groups;\n }\n d3_selectionPrototype.call = function(callback) {\n var args = d3_array(arguments);\n callback.apply(args[0] = this, args);\n return this;\n };\n d3_selectionPrototype.empty = function() {\n return !this.node();\n };\n d3_selectionPrototype.node = function() {\n for (var j = 0, m = this.length; j < m; j++) {\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n var node = group[i];\n if (node) return node;\n }\n }\n return null;\n };\n d3_selectionPrototype.size = function() {\n var n = 0;\n d3_selection_each(this, function() {\n ++n;\n });\n return n;\n };\n function d3_selection_enter(selection) {\n d3_subclass(selection, d3_selection_enterPrototype);\n return selection;\n }\n var d3_selection_enterPrototype = [];\n d3.selection.enter = d3_selection_enter;\n d3.selection.enter.prototype = d3_selection_enterPrototype;\n d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n d3_selection_enterPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, upgroup, group, node;\n for (var j = -1, m = this.length; ++j < m; ) {\n upgroup = (group = this[j]).update;\n subgroups.push(subgroup = []);\n subgroup.parentNode = group.parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n d3_selection_enterPrototype.insert = function(name, before) {\n if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n return d3_selectionPrototype.insert.call(this, name, before);\n };\n function d3_selection_enterInsertBefore(enter) {\n var i0, j0;\n return function(d, i, j) {\n var group = enter[j].update, n = group.length, node;\n if (j != j0) j0 = j, i0 = 0;\n if (i >= i0) i0 = i + 1;\n while (!(node = group[i0]) && ++i0 < n) ;\n return node;\n };\n }\n d3.select = function(node) {\n var group;\n if (typeof node === \"string\") {\n group = [ d3_select(node, d3_document) ];\n group.parentNode = d3_document.documentElement;\n } else {\n group = [ node ];\n group.parentNode = d3_documentElement(node);\n }\n return d3_selection([ group ]);\n };\n d3.selectAll = function(nodes) {\n var group;\n if (typeof nodes === \"string\") {\n group = d3_array(d3_selectAll(nodes, d3_document));\n group.parentNode = d3_document.documentElement;\n } else {\n group = d3_array(nodes);\n group.parentNode = null;\n }\n return d3_selection([ group ]);\n };\n d3_selectionPrototype.on = function(type, listener, capture) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof type !== \"string\") {\n if (n < 2) listener = false;\n for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n return this;\n }\n if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n capture = false;\n }\n return this.each(d3_selection_on(type, listener, capture));\n };\n function d3_selection_on(type, listener, capture) {\n var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n if (i > 0) type = type.slice(0, i);\n var filter = d3_selection_onFilters.get(type);\n if (filter) type = filter, wrap = d3_selection_onFilter;\n function onRemove() {\n var l = this[name];\n if (l) {\n this.removeEventListener(type, l, l.$);\n delete this[name];\n }\n }\n function onAdd() {\n var l = wrap(listener, d3_array(arguments));\n onRemove.call(this);\n this.addEventListener(type, this[name] = l, l.$ = capture);\n l._ = listener;\n }\n function removeAll() {\n var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n for (var name in this) {\n if (match = name.match(re)) {\n var l = this[name];\n this.removeEventListener(match[1], l, l.$);\n delete this[name];\n }\n }\n }\n return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n }\n var d3_selection_onFilters = d3.map({\n mouseenter: \"mouseover\",\n mouseleave: \"mouseout\"\n });\n if (d3_document) {\n d3_selection_onFilters.forEach(function(k) {\n if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n });\n }\n function d3_selection_onListener(listener, argumentz) {\n return function(e) {\n var o = d3.event;\n d3.event = e;\n argumentz[0] = this.__data__;\n try {\n listener.apply(this, argumentz);\n } finally {\n d3.event = o;\n }\n };\n }\n function d3_selection_onFilter(listener, argumentz) {\n var l = d3_selection_onListener(listener, argumentz);\n return function(e) {\n var target = this, related = e.relatedTarget;\n if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n l.call(target, e);\n }\n };\n }\n var d3_event_dragSelect, d3_event_dragId = 0;\n function d3_event_dragSuppress(node) {\n var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n if (d3_event_dragSelect == null) {\n d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n }\n if (d3_event_dragSelect) {\n var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n style[d3_event_dragSelect] = \"none\";\n }\n return function(suppressClick) {\n w.on(name, null);\n if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n if (suppressClick) {\n var off = function() {\n w.on(click, null);\n };\n w.on(click, function() {\n d3_eventPreventDefault();\n off();\n }, true);\n setTimeout(off, 0);\n }\n };\n }\n d3.mouse = function(container) {\n return d3_mousePoint(container, d3_eventSource());\n };\n var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n function d3_mousePoint(container, e) {\n if (e.changedTouches) e = e.changedTouches[0];\n var svg = container.ownerSVGElement || container;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n if (d3_mouse_bug44083 < 0) {\n var window = d3_window(container);\n if (window.scrollX || window.scrollY) {\n svg = d3.select(\"body\").append(\"svg\").style({\n position: \"absolute\",\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n border: \"none\"\n }, \"important\");\n var ctm = svg[0][0].getScreenCTM();\n d3_mouse_bug44083 = !(ctm.f || ctm.e);\n svg.remove();\n }\n }\n if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n point.y = e.clientY;\n point = point.matrixTransform(container.getScreenCTM().inverse());\n return [ point.x, point.y ];\n }\n var rect = container.getBoundingClientRect();\n return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n }\n d3.touch = function(container, touches, identifier) {\n if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n if ((touch = touches[i]).identifier === identifier) {\n return d3_mousePoint(container, touch);\n }\n }\n };\n d3.behavior.drag = function() {\n var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n function drag() {\n this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n }\n function dragstart(id, position, subject, move, end) {\n return function() {\n var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n if (origin) {\n dragOffset = origin.apply(that, arguments);\n dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n } else {\n dragOffset = [ 0, 0 ];\n }\n dispatch({\n type: \"dragstart\"\n });\n function moved() {\n var position1 = position(parent, dragId), dx, dy;\n if (!position1) return;\n dx = position1[0] - position0[0];\n dy = position1[1] - position0[1];\n dragged |= dx | dy;\n position0 = position1;\n dispatch({\n type: \"drag\",\n x: position1[0] + dragOffset[0],\n y: position1[1] + dragOffset[1],\n dx: dx,\n dy: dy\n });\n }\n function ended() {\n if (!position(parent, dragId)) return;\n dragSubject.on(move + dragName, null).on(end + dragName, null);\n dragRestore(dragged);\n dispatch({\n type: \"dragend\"\n });\n }\n };\n }\n drag.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return drag;\n };\n return d3.rebind(drag, event, \"on\");\n };\n function d3_behavior_dragTouchId() {\n return d3.event.changedTouches[0].identifier;\n }\n d3.touches = function(container, touches) {\n if (arguments.length < 2) touches = d3_eventSource().touches;\n return touches ? d3_array(touches).map(function(touch) {\n var point = d3_mousePoint(container, touch);\n point.identifier = touch.identifier;\n return point;\n }) : [];\n };\n var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n function d3_sgn(x) {\n return x > 0 ? 1 : x < 0 ? -1 : 0;\n }\n function d3_cross2d(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n }\n function d3_acos(x) {\n return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n }\n function d3_asin(x) {\n return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n }\n function d3_sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n }\n function d3_cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n }\n function d3_tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n }\n function d3_haversin(x) {\n return (x = Math.sin(x / 2)) * x;\n }\n var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n d3.interpolateZoom = function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n if (d2 < ε2) {\n S = Math.log(w1 / w0) / ρ;\n i = function(t) {\n return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n };\n } else {\n var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / ρ;\n i = function(t) {\n var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n };\n }\n i.duration = S * 1e3;\n return i;\n };\n d3.behavior.zoom = function() {\n var view = {\n x: 0,\n y: 0,\n k: 1\n }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n if (!d3_behavior_zoomWheel) {\n d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return d3.event.wheelDelta;\n }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n return -d3.event.detail;\n }, \"MozMousePixelScroll\");\n }\n function zoom(g) {\n g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n }\n zoom.event = function(g) {\n g.each(function() {\n var dispatch = event.of(this, arguments), view1 = view;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.zoom\", function() {\n view = this.__chart__ || {\n x: 0,\n y: 0,\n k: 1\n };\n zoomstarted(dispatch);\n }).tween(\"zoom:zoom\", function() {\n var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n return function(t) {\n var l = i(t), k = dx / l[2];\n this.__chart__ = view = {\n x: cx - l[0] * k,\n y: cy - l[1] * k,\n k: k\n };\n zoomed(dispatch);\n };\n }).each(\"interrupt.zoom\", function() {\n zoomended(dispatch);\n }).each(\"end.zoom\", function() {\n zoomended(dispatch);\n });\n } else {\n this.__chart__ = view;\n zoomstarted(dispatch);\n zoomed(dispatch);\n zoomended(dispatch);\n }\n });\n };\n zoom.translate = function(_) {\n if (!arguments.length) return [ view.x, view.y ];\n view = {\n x: +_[0],\n y: +_[1],\n k: view.k\n };\n rescale();\n return zoom;\n };\n zoom.scale = function(_) {\n if (!arguments.length) return view.k;\n view = {\n x: view.x,\n y: view.y,\n k: null\n };\n scaleTo(+_);\n rescale();\n return zoom;\n };\n zoom.scaleExtent = function(_) {\n if (!arguments.length) return scaleExtent;\n scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.center = function(_) {\n if (!arguments.length) return center;\n center = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.size = function(_) {\n if (!arguments.length) return size;\n size = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.duration = function(_) {\n if (!arguments.length) return duration;\n duration = +_;\n return zoom;\n };\n zoom.x = function(z) {\n if (!arguments.length) return x1;\n x1 = z;\n x0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n zoom.y = function(z) {\n if (!arguments.length) return y1;\n y1 = z;\n y0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n function location(p) {\n return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n }\n function point(l) {\n return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n }\n function scaleTo(s) {\n view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n }\n function translateTo(p, l) {\n l = point(l);\n view.x += p[0] - l[0];\n view.y += p[1] - l[1];\n }\n function zoomTo(that, p, l, k) {\n that.__chart__ = {\n x: view.x,\n y: view.y,\n k: view.k\n };\n scaleTo(Math.pow(2, k));\n translateTo(center0 = p, l);\n that = d3.select(that);\n if (duration > 0) that = that.transition().duration(duration);\n that.call(zoom.event);\n }\n function rescale() {\n if (x1) x1.domain(x0.range().map(function(x) {\n return (x - view.x) / view.k;\n }).map(x0.invert));\n if (y1) y1.domain(y0.range().map(function(y) {\n return (y - view.y) / view.k;\n }).map(y0.invert));\n }\n function zoomstarted(dispatch) {\n if (!zooming++) dispatch({\n type: \"zoomstart\"\n });\n }\n function zoomed(dispatch) {\n rescale();\n dispatch({\n type: \"zoom\",\n scale: view.k,\n translate: [ view.x, view.y ]\n });\n }\n function zoomended(dispatch) {\n if (!--zooming) dispatch({\n type: \"zoomend\"\n }), center0 = null;\n }\n function mousedowned() {\n var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n d3_selection_interrupt.call(that);\n zoomstarted(dispatch);\n function moved() {\n dragged = 1;\n translateTo(d3.mouse(that), location0);\n zoomed(dispatch);\n }\n function ended() {\n subject.on(mousemove, null).on(mouseup, null);\n dragRestore(dragged);\n zoomended(dispatch);\n }\n }\n function touchstarted() {\n var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n started();\n zoomstarted(dispatch);\n subject.on(mousedown, null).on(touchstart, started);\n function relocate() {\n var touches = d3.touches(that);\n scale0 = view.k;\n touches.forEach(function(t) {\n if (t.identifier in locations0) locations0[t.identifier] = location(t);\n });\n return touches;\n }\n function started() {\n var target = d3.event.target;\n d3.select(target).on(touchmove, moved).on(touchend, ended);\n targets.push(target);\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n locations0[changed[i].identifier] = null;\n }\n var touches = relocate(), now = Date.now();\n if (touches.length === 1) {\n if (now - touchtime < 500) {\n var p = touches[0];\n zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n d3_eventPreventDefault();\n }\n touchtime = now;\n } else if (touches.length > 1) {\n var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n distance0 = dx * dx + dy * dy;\n }\n }\n function moved() {\n var touches = d3.touches(that), p0, l0, p1, l1;\n d3_selection_interrupt.call(that);\n for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n p1 = touches[i];\n if (l1 = locations0[p1.identifier]) {\n if (l0) break;\n p0 = p1, l0 = l1;\n }\n }\n if (l1) {\n var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n scaleTo(scale1 * scale0);\n }\n touchtime = null;\n translateTo(p0, l0);\n zoomed(dispatch);\n }\n function ended() {\n if (d3.event.touches.length) {\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n delete locations0[changed[i].identifier];\n }\n for (var identifier in locations0) {\n return void relocate();\n }\n }\n d3.selectAll(targets).on(zoomName, null);\n subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n dragRestore();\n zoomended(dispatch);\n }\n }\n function mousewheeled() {\n var dispatch = event.of(this, arguments);\n if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n mousewheelTimer = setTimeout(function() {\n mousewheelTimer = null;\n zoomended(dispatch);\n }, 50);\n d3_eventPreventDefault();\n scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n translateTo(center0, translate0);\n zoomed(dispatch);\n }\n function dblclicked() {\n var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n }\n return d3.rebind(zoom, event, \"on\");\n };\n var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n d3.color = d3_color;\n function d3_color() {}\n d3_color.prototype.toString = function() {\n return this.rgb() + \"\";\n };\n d3.hsl = d3_hsl;\n function d3_hsl(h, s, l) {\n return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n }\n var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n d3_hslPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, this.l / k);\n };\n d3_hslPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, k * this.l);\n };\n d3_hslPrototype.rgb = function() {\n return d3_hsl_rgb(this.h, this.s, this.l);\n };\n function d3_hsl_rgb(h, s, l) {\n var m1, m2;\n h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n l = l < 0 ? 0 : l > 1 ? 1 : l;\n m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n m1 = 2 * l - m2;\n function v(h) {\n if (h > 360) h -= 360; else if (h < 0) h += 360;\n if (h < 60) return m1 + (m2 - m1) * h / 60;\n if (h < 180) return m2;\n if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n return m1;\n }\n function vv(h) {\n return Math.round(v(h) * 255);\n }\n return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n }\n d3.hcl = d3_hcl;\n function d3_hcl(h, c, l) {\n return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n }\n var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n d3_hclPrototype.brighter = function(k) {\n return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.darker = function(k) {\n return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.rgb = function() {\n return d3_hcl_lab(this.h, this.c, this.l).rgb();\n };\n function d3_hcl_lab(h, c, l) {\n if (isNaN(h)) h = 0;\n if (isNaN(c)) c = 0;\n return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n }\n d3.lab = d3_lab;\n function d3_lab(l, a, b) {\n return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n }\n var d3_lab_K = 18;\n var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n var d3_labPrototype = d3_lab.prototype = new d3_color();\n d3_labPrototype.brighter = function(k) {\n return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.darker = function(k) {\n return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.rgb = function() {\n return d3_lab_rgb(this.l, this.a, this.b);\n };\n function d3_lab_rgb(l, a, b) {\n var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n x = d3_lab_xyz(x) * d3_lab_X;\n y = d3_lab_xyz(y) * d3_lab_Y;\n z = d3_lab_xyz(z) * d3_lab_Z;\n return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n }\n function d3_lab_hcl(l, a, b) {\n return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n }\n function d3_lab_xyz(x) {\n return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n }\n function d3_xyz_lab(x) {\n return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n }\n function d3_xyz_rgb(r) {\n return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n }\n d3.rgb = d3_rgb;\n function d3_rgb(r, g, b) {\n return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n }\n function d3_rgbNumber(value) {\n return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n }\n function d3_rgbString(value) {\n return d3_rgbNumber(value) + \"\";\n }\n var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n d3_rgbPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n var r = this.r, g = this.g, b = this.b, i = 30;\n if (!r && !g && !b) return new d3_rgb(i, i, i);\n if (r && r < i) r = i;\n if (g && g < i) g = i;\n if (b && b < i) b = i;\n return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n };\n d3_rgbPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_rgb(k * this.r, k * this.g, k * this.b);\n };\n d3_rgbPrototype.hsl = function() {\n return d3_rgb_hsl(this.r, this.g, this.b);\n };\n d3_rgbPrototype.toString = function() {\n return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n };\n function d3_rgb_hex(v) {\n return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n }\n function d3_rgb_parse(format, rgb, hsl) {\n var r = 0, g = 0, b = 0, m1, m2, color;\n m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n if (m1) {\n m2 = m1[2].split(\",\");\n switch (m1[1]) {\n case \"hsl\":\n {\n return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n }\n\n case \"rgb\":\n {\n return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n }\n }\n }\n if (color = d3_rgb_names.get(format)) {\n return rgb(color.r, color.g, color.b);\n }\n if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n if (format.length === 4) {\n r = (color & 3840) >> 4;\n r = r >> 4 | r;\n g = color & 240;\n g = g >> 4 | g;\n b = color & 15;\n b = b << 4 | b;\n } else if (format.length === 7) {\n r = (color & 16711680) >> 16;\n g = (color & 65280) >> 8;\n b = color & 255;\n }\n }\n return rgb(r, g, b);\n }\n function d3_rgb_hsl(r, g, b) {\n var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n if (d) {\n s = l < .5 ? d / (max + min) : d / (2 - max - min);\n if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n h *= 60;\n } else {\n h = NaN;\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new d3_hsl(h, s, l);\n }\n function d3_rgb_lab(r, g, b) {\n r = d3_rgb_xyz(r);\n g = d3_rgb_xyz(g);\n b = d3_rgb_xyz(b);\n var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n }\n function d3_rgb_xyz(r) {\n return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n }\n function d3_rgb_parseNumber(c) {\n var f = parseFloat(c);\n return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n }\n var d3_rgb_names = d3.map({\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n });\n d3_rgb_names.forEach(function(key, value) {\n d3_rgb_names.set(key, d3_rgbNumber(value));\n });\n function d3_functor(v) {\n return typeof v === \"function\" ? v : function() {\n return v;\n };\n }\n d3.functor = d3_functor;\n d3.xhr = d3_xhrType(d3_identity);\n function d3_xhrType(response) {\n return function(url, mimeType, callback) {\n if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n mimeType = null;\n return d3_xhr(url, mimeType, response, callback);\n };\n }\n function d3_xhr(url, mimeType, response, callback) {\n var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n request.readyState > 3 && respond();\n };\n function respond() {\n var status = request.status, result;\n if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n try {\n result = response.call(xhr, request);\n } catch (e) {\n dispatch.error.call(xhr, e);\n return;\n }\n dispatch.load.call(xhr, result);\n } else {\n dispatch.error.call(xhr, request);\n }\n }\n request.onprogress = function(event) {\n var o = d3.event;\n d3.event = event;\n try {\n dispatch.progress.call(xhr, request);\n } finally {\n d3.event = o;\n }\n };\n xhr.header = function(name, value) {\n name = (name + \"\").toLowerCase();\n if (arguments.length < 2) return headers[name];\n if (value == null) delete headers[name]; else headers[name] = value + \"\";\n return xhr;\n };\n xhr.mimeType = function(value) {\n if (!arguments.length) return mimeType;\n mimeType = value == null ? null : value + \"\";\n return xhr;\n };\n xhr.responseType = function(value) {\n if (!arguments.length) return responseType;\n responseType = value;\n return xhr;\n };\n xhr.response = function(value) {\n response = value;\n return xhr;\n };\n [ \"get\", \"post\" ].forEach(function(method) {\n xhr[method] = function() {\n return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n };\n });\n xhr.send = function(method, data, callback) {\n if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n request.open(method, url, true);\n if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n if (responseType != null) request.responseType = responseType;\n if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n callback(null, request);\n });\n dispatch.beforesend.call(xhr, request);\n request.send(data == null ? null : data);\n return xhr;\n };\n xhr.abort = function() {\n request.abort();\n return xhr;\n };\n d3.rebind(xhr, dispatch, \"on\");\n return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n }\n function d3_xhr_fixCallback(callback) {\n return callback.length === 1 ? function(error, request) {\n callback(error == null ? request : null);\n } : callback;\n }\n function d3_xhrHasResponse(request) {\n var type = request.responseType;\n return type && type !== \"text\" ? request.response : request.responseText;\n }\n d3.dsv = function(delimiter, mimeType) {\n var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n function dsv(url, row, callback) {\n if (arguments.length < 3) callback = row, row = null;\n var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n xhr.row = function(_) {\n return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n };\n return xhr;\n }\n function response(request) {\n return dsv.parse(request.responseText);\n }\n function typedResponse(f) {\n return function(request) {\n return dsv.parse(request.responseText, f);\n };\n }\n dsv.parse = function(text, f) {\n var o;\n return dsv.parseRows(text, function(row, i) {\n if (o) return o(row, i - 1);\n var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n o = f ? function(row, i) {\n return f(a(row), i);\n } : a;\n });\n };\n dsv.parseRows = function(text, f) {\n var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n function token() {\n if (I >= N) return EOF;\n if (eol) return eol = false, EOL;\n var j = I;\n if (text.charCodeAt(j) === 34) {\n var i = j;\n while (i++ < N) {\n if (text.charCodeAt(i) === 34) {\n if (text.charCodeAt(i + 1) !== 34) break;\n ++i;\n }\n }\n I = i + 2;\n var c = text.charCodeAt(i + 1);\n if (c === 13) {\n eol = true;\n if (text.charCodeAt(i + 2) === 10) ++I;\n } else if (c === 10) {\n eol = true;\n }\n return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n }\n while (I < N) {\n var c = text.charCodeAt(I++), k = 1;\n if (c === 10) eol = true; else if (c === 13) {\n eol = true;\n if (text.charCodeAt(I) === 10) ++I, ++k;\n } else if (c !== delimiterCode) continue;\n return text.slice(j, I - k);\n }\n return text.slice(j);\n }\n while ((t = token()) !== EOF) {\n var a = [];\n while (t !== EOL && t !== EOF) {\n a.push(t);\n t = token();\n }\n if (f && (a = f(a, n++)) == null) continue;\n rows.push(a);\n }\n return rows;\n };\n dsv.format = function(rows) {\n if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n var fieldSet = new d3_Set(), fields = [];\n rows.forEach(function(row) {\n for (var field in row) {\n if (!fieldSet.has(field)) {\n fields.push(fieldSet.add(field));\n }\n }\n });\n return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n return fields.map(function(field) {\n return formatValue(row[field]);\n }).join(delimiter);\n })).join(\"\\n\");\n };\n dsv.formatRows = function(rows) {\n return rows.map(formatRow).join(\"\\n\");\n };\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n function formatValue(text) {\n return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n }\n return dsv;\n };\n d3.csv = d3.dsv(\",\", \"text/csv\");\n d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n setTimeout(callback, 17);\n };\n d3.timer = function() {\n d3_timer.apply(this, arguments);\n };\n function d3_timer(callback, delay, then) {\n var n = arguments.length;\n if (n < 2) delay = 0;\n if (n < 3) then = Date.now();\n var time = then + delay, timer = {\n c: callback,\n t: time,\n n: null\n };\n if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n d3_timer_queueTail = timer;\n if (!d3_timer_interval) {\n d3_timer_timeout = clearTimeout(d3_timer_timeout);\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n return timer;\n }\n function d3_timer_step() {\n var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n if (delay > 24) {\n if (isFinite(delay)) {\n clearTimeout(d3_timer_timeout);\n d3_timer_timeout = setTimeout(d3_timer_step, delay);\n }\n d3_timer_interval = 0;\n } else {\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n }\n d3.timer.flush = function() {\n d3_timer_mark();\n d3_timer_sweep();\n };\n function d3_timer_mark() {\n var now = Date.now(), timer = d3_timer_queueHead;\n while (timer) {\n if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n timer = timer.n;\n }\n return now;\n }\n function d3_timer_sweep() {\n var t0, t1 = d3_timer_queueHead, time = Infinity;\n while (t1) {\n if (t1.c) {\n if (t1.t < time) time = t1.t;\n t1 = (t0 = t1).n;\n } else {\n t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n }\n }\n d3_timer_queueTail = t0;\n return time;\n }\n function d3_format_precision(x, p) {\n return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n }\n d3.round = function(x, n) {\n return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n };\n var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n d3.formatPrefix = function(value, precision) {\n var i = 0;\n if (value = +value) {\n if (value < 0) value *= -1;\n if (precision) value = d3.round(value, d3_format_precision(value, precision));\n i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n }\n return d3_formatPrefixes[8 + i / 3];\n };\n function d3_formatPrefix(d, i) {\n var k = Math.pow(10, abs(8 - i) * 3);\n return {\n scale: i > 8 ? function(d) {\n return d / k;\n } : function(d) {\n return d * k;\n },\n symbol: d\n };\n }\n function d3_locale_numberFormat(locale) {\n var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = locale_grouping[j = (j + 1) % locale_grouping.length];\n }\n return t.reverse().join(locale_thousands);\n } : d3_identity;\n return function(specifier) {\n var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n if (precision) precision = +precision.substring(1);\n if (zfill || fill === \"0\" && align === \"=\") {\n zfill = fill = \"0\";\n align = \"=\";\n }\n switch (type) {\n case \"n\":\n comma = true;\n type = \"g\";\n break;\n\n case \"%\":\n scale = 100;\n suffix = \"%\";\n type = \"f\";\n break;\n\n case \"p\":\n scale = 100;\n suffix = \"%\";\n type = \"r\";\n break;\n\n case \"b\":\n case \"o\":\n case \"x\":\n case \"X\":\n if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n case \"c\":\n exponent = false;\n\n case \"d\":\n integer = true;\n precision = 0;\n break;\n\n case \"s\":\n scale = -1;\n type = \"r\";\n break;\n }\n if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n if (type == \"r\" && !precision) type = \"g\";\n if (precision != null) {\n if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n }\n type = d3_format_types.get(type) || d3_format_typeDefault;\n var zcomma = zfill && comma;\n return function(value) {\n var fullSuffix = suffix;\n if (integer && value % 1) return \"\";\n var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n if (scale < 0) {\n var unit = d3.formatPrefix(value, precision);\n value = unit.scale(value);\n fullSuffix = unit.symbol + suffix;\n } else {\n value *= scale;\n }\n value = type(value, precision);\n var i = value.lastIndexOf(\".\"), before, after;\n if (i < 0) {\n var j = exponent ? value.lastIndexOf(\"e\") : -1;\n if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n } else {\n before = value.substring(0, i);\n after = locale_decimal + value.substring(i + 1);\n }\n if (!zfill && comma) before = formatGroup(before, Infinity);\n var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n negative += prefix;\n value = before + after;\n return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n };\n };\n }\n var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n var d3_format_types = d3.map({\n b: function(x) {\n return x.toString(2);\n },\n c: function(x) {\n return String.fromCharCode(x);\n },\n o: function(x) {\n return x.toString(8);\n },\n x: function(x) {\n return x.toString(16);\n },\n X: function(x) {\n return x.toString(16).toUpperCase();\n },\n g: function(x, p) {\n return x.toPrecision(p);\n },\n e: function(x, p) {\n return x.toExponential(p);\n },\n f: function(x, p) {\n return x.toFixed(p);\n },\n r: function(x, p) {\n return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n }\n });\n function d3_format_typeDefault(x) {\n return x + \"\";\n }\n var d3_time = d3.time = {}, d3_date = Date;\n function d3_date_utc() {\n this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n }\n d3_date_utc.prototype = {\n getDate: function() {\n return this._.getUTCDate();\n },\n getDay: function() {\n return this._.getUTCDay();\n },\n getFullYear: function() {\n return this._.getUTCFullYear();\n },\n getHours: function() {\n return this._.getUTCHours();\n },\n getMilliseconds: function() {\n return this._.getUTCMilliseconds();\n },\n getMinutes: function() {\n return this._.getUTCMinutes();\n },\n getMonth: function() {\n return this._.getUTCMonth();\n },\n getSeconds: function() {\n return this._.getUTCSeconds();\n },\n getTime: function() {\n return this._.getTime();\n },\n getTimezoneOffset: function() {\n return 0;\n },\n valueOf: function() {\n return this._.valueOf();\n },\n setDate: function() {\n d3_time_prototype.setUTCDate.apply(this._, arguments);\n },\n setDay: function() {\n d3_time_prototype.setUTCDay.apply(this._, arguments);\n },\n setFullYear: function() {\n d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n },\n setHours: function() {\n d3_time_prototype.setUTCHours.apply(this._, arguments);\n },\n setMilliseconds: function() {\n d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n },\n setMinutes: function() {\n d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n },\n setMonth: function() {\n d3_time_prototype.setUTCMonth.apply(this._, arguments);\n },\n setSeconds: function() {\n d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n },\n setTime: function() {\n d3_time_prototype.setTime.apply(this._, arguments);\n }\n };\n var d3_time_prototype = Date.prototype;\n function d3_time_interval(local, step, number) {\n function round(date) {\n var d0 = local(date), d1 = offset(d0, 1);\n return date - d0 < d1 - date ? d0 : d1;\n }\n function ceil(date) {\n step(date = local(new d3_date(date - 1)), 1);\n return date;\n }\n function offset(date, k) {\n step(date = new d3_date(+date), k);\n return date;\n }\n function range(t0, t1, dt) {\n var time = ceil(t0), times = [];\n if (dt > 1) {\n while (time < t1) {\n if (!(number(time) % dt)) times.push(new Date(+time));\n step(time, 1);\n }\n } else {\n while (time < t1) times.push(new Date(+time)), step(time, 1);\n }\n return times;\n }\n function range_utc(t0, t1, dt) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = t0;\n return range(utc, t1, dt);\n } finally {\n d3_date = Date;\n }\n }\n local.floor = local;\n local.round = round;\n local.ceil = ceil;\n local.offset = offset;\n local.range = range;\n var utc = local.utc = d3_time_interval_utc(local);\n utc.floor = utc;\n utc.round = d3_time_interval_utc(round);\n utc.ceil = d3_time_interval_utc(ceil);\n utc.offset = d3_time_interval_utc(offset);\n utc.range = range_utc;\n return local;\n }\n function d3_time_interval_utc(method) {\n return function(date, k) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = date;\n return method(utc, k)._;\n } finally {\n d3_date = Date;\n }\n };\n }\n d3_time.year = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setMonth(0, 1);\n return date;\n }, function(date, offset) {\n date.setFullYear(date.getFullYear() + offset);\n }, function(date) {\n return date.getFullYear();\n });\n d3_time.years = d3_time.year.range;\n d3_time.years.utc = d3_time.year.utc.range;\n d3_time.day = d3_time_interval(function(date) {\n var day = new d3_date(2e3, 0);\n day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n return day;\n }, function(date, offset) {\n date.setDate(date.getDate() + offset);\n }, function(date) {\n return date.getDate() - 1;\n });\n d3_time.days = d3_time.day.range;\n d3_time.days.utc = d3_time.day.utc.range;\n d3_time.dayOfYear = function(date) {\n var year = d3_time.year(date);\n return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n };\n [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n i = 7 - i;\n var interval = d3_time[day] = d3_time_interval(function(date) {\n (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n return date;\n }, function(date, offset) {\n date.setDate(date.getDate() + Math.floor(offset) * 7);\n }, function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n });\n d3_time[day + \"s\"] = interval.range;\n d3_time[day + \"s\"].utc = interval.utc.range;\n d3_time[day + \"OfYear\"] = function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n };\n });\n d3_time.week = d3_time.sunday;\n d3_time.weeks = d3_time.sunday.range;\n d3_time.weeks.utc = d3_time.sunday.utc.range;\n d3_time.weekOfYear = d3_time.sundayOfYear;\n function d3_locale_timeFormat(locale) {\n var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n function d3_time_format(template) {\n var n = template.length;\n function format(date) {\n var string = [], i = -1, j = 0, c, p, f;\n while (++i < n) {\n if (template.charCodeAt(i) === 37) {\n string.push(template.slice(j, i));\n if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n string.push(c);\n j = i + 1;\n }\n }\n string.push(template.slice(j, i));\n return string.join(\"\");\n }\n format.parse = function(string) {\n var d = {\n y: 1900,\n m: 0,\n d: 1,\n H: 0,\n M: 0,\n S: 0,\n L: 0,\n Z: null\n }, i = d3_time_parse(d, template, string, 0);\n if (i != string.length) return null;\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n date.setFullYear(d.y, 0, 1);\n date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n } else date.setFullYear(d.y, d.m, d.d);\n date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n return localZ ? date._ : date;\n };\n format.toString = function() {\n return template;\n };\n return format;\n }\n function d3_time_parse(date, template, string, j) {\n var c, p, t, i = 0, n = template.length, m = string.length;\n while (i < n) {\n if (j >= m) return -1;\n c = template.charCodeAt(i++);\n if (c === 37) {\n t = template.charAt(i++);\n p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n if (!p || (j = p(date, string, j)) < 0) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n return j;\n }\n d3_time_format.utc = function(template) {\n var local = d3_time_format(template);\n function format(date) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date();\n utc._ = date;\n return local(utc);\n } finally {\n d3_date = Date;\n }\n }\n format.parse = function(string) {\n try {\n d3_date = d3_date_utc;\n var date = local.parse(string);\n return date && date._;\n } finally {\n d3_date = Date;\n }\n };\n format.toString = local.toString;\n return format;\n };\n d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n locale_periods.forEach(function(p, i) {\n d3_time_periodLookup.set(p.toLowerCase(), i);\n });\n var d3_time_formats = {\n a: function(d) {\n return locale_shortDays[d.getDay()];\n },\n A: function(d) {\n return locale_days[d.getDay()];\n },\n b: function(d) {\n return locale_shortMonths[d.getMonth()];\n },\n B: function(d) {\n return locale_months[d.getMonth()];\n },\n c: d3_time_format(locale_dateTime),\n d: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n e: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n H: function(d, p) {\n return d3_time_formatPad(d.getHours(), p, 2);\n },\n I: function(d, p) {\n return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n },\n j: function(d, p) {\n return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n },\n L: function(d, p) {\n return d3_time_formatPad(d.getMilliseconds(), p, 3);\n },\n m: function(d, p) {\n return d3_time_formatPad(d.getMonth() + 1, p, 2);\n },\n M: function(d, p) {\n return d3_time_formatPad(d.getMinutes(), p, 2);\n },\n p: function(d) {\n return locale_periods[+(d.getHours() >= 12)];\n },\n S: function(d, p) {\n return d3_time_formatPad(d.getSeconds(), p, 2);\n },\n U: function(d, p) {\n return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n },\n w: function(d) {\n return d.getDay();\n },\n W: function(d, p) {\n return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n },\n x: d3_time_format(locale_date),\n X: d3_time_format(locale_time),\n y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n },\n Y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n },\n Z: d3_time_zone,\n \"%\": function() {\n return \"%\";\n }\n };\n var d3_time_parsers = {\n a: d3_time_parseWeekdayAbbrev,\n A: d3_time_parseWeekday,\n b: d3_time_parseMonthAbbrev,\n B: d3_time_parseMonth,\n c: d3_time_parseLocaleFull,\n d: d3_time_parseDay,\n e: d3_time_parseDay,\n H: d3_time_parseHour24,\n I: d3_time_parseHour24,\n j: d3_time_parseDayOfYear,\n L: d3_time_parseMilliseconds,\n m: d3_time_parseMonthNumber,\n M: d3_time_parseMinutes,\n p: d3_time_parseAmPm,\n S: d3_time_parseSeconds,\n U: d3_time_parseWeekNumberSunday,\n w: d3_time_parseWeekdayNumber,\n W: d3_time_parseWeekNumberMonday,\n x: d3_time_parseLocaleDate,\n X: d3_time_parseLocaleTime,\n y: d3_time_parseYear,\n Y: d3_time_parseFullYear,\n Z: d3_time_parseZone,\n \"%\": d3_time_parseLiteralPercent\n };\n function d3_time_parseWeekdayAbbrev(date, string, i) {\n d3_time_dayAbbrevRe.lastIndex = 0;\n var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseWeekday(date, string, i) {\n d3_time_dayRe.lastIndex = 0;\n var n = d3_time_dayRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonthAbbrev(date, string, i) {\n d3_time_monthAbbrevRe.lastIndex = 0;\n var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonth(date, string, i) {\n d3_time_monthRe.lastIndex = 0;\n var n = d3_time_monthRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseLocaleFull(date, string, i) {\n return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n }\n function d3_time_parseLocaleDate(date, string, i) {\n return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n }\n function d3_time_parseLocaleTime(date, string, i) {\n return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n }\n function d3_time_parseAmPm(date, string, i) {\n var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n return n == null ? -1 : (date.p = n, i);\n }\n return d3_time_format;\n }\n var d3_time_formatPads = {\n \"-\": \"\",\n _: \" \",\n \"0\": \"0\"\n }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n function d3_time_formatPad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n }\n function d3_time_formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n }\n function d3_time_formatLookup(names) {\n var map = new d3_Map(), i = -1, n = names.length;\n while (++i < n) map.set(names[i].toLowerCase(), i);\n return map;\n }\n function d3_time_parseWeekdayNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n return n ? (date.w = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberSunday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.U = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberMonday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.W = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseFullYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n return n ? (date.y = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n }\n function d3_time_parseZone(date, string, i) {\n return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n i + 5) : -1;\n }\n function d3_time_expandYear(d) {\n return d + (d > 68 ? 1900 : 2e3);\n }\n function d3_time_parseMonthNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n }\n function d3_time_parseDay(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.d = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseDayOfYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.j = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseHour24(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.H = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMinutes(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.M = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseSeconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.S = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMilliseconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.L = +n[0], i + n[0].length) : -1;\n }\n function d3_time_zone(d) {\n var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n }\n function d3_time_parseLiteralPercent(date, string, i) {\n d3_time_percentRe.lastIndex = 0;\n var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n }\n function d3_time_formatMulti(formats) {\n var n = formats.length, i = -1;\n while (++i < n) formats[i][0] = this(formats[i][0]);\n return function(date) {\n var i = 0, f = formats[i];\n while (!f[1](date)) f = formats[++i];\n return f[0](date);\n };\n }\n d3.locale = function(locale) {\n return {\n numberFormat: d3_locale_numberFormat(locale),\n timeFormat: d3_locale_timeFormat(locale)\n };\n };\n var d3_locale_enUS = d3.locale({\n decimal: \".\",\n thousands: \",\",\n grouping: [ 3 ],\n currency: [ \"$\", \"\" ],\n dateTime: \"%a %b %e %X %Y\",\n date: \"%m/%d/%Y\",\n time: \"%H:%M:%S\",\n periods: [ \"AM\", \"PM\" ],\n days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n });\n d3.format = d3_locale_enUS.numberFormat;\n d3.geo = {};\n function d3_adder() {}\n d3_adder.prototype = {\n s: 0,\n t: 0,\n add: function(y) {\n d3_adderSum(y, this.t, d3_adderTemp);\n d3_adderSum(d3_adderTemp.s, this.s, this);\n if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n },\n reset: function() {\n this.s = this.t = 0;\n },\n valueOf: function() {\n return this.s;\n }\n };\n var d3_adderTemp = new d3_adder();\n function d3_adderSum(a, b, o) {\n var x = o.s = a + b, bv = x - a, av = x - bv;\n o.t = a - av + (b - bv);\n }\n d3.geo.stream = function(object, listener) {\n if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n d3_geo_streamObjectType[object.type](object, listener);\n } else {\n d3_geo_streamGeometry(object, listener);\n }\n };\n function d3_geo_streamGeometry(geometry, listener) {\n if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n d3_geo_streamGeometryType[geometry.type](geometry, listener);\n }\n }\n var d3_geo_streamObjectType = {\n Feature: function(feature, listener) {\n d3_geo_streamGeometry(feature.geometry, listener);\n },\n FeatureCollection: function(object, listener) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n }\n };\n var d3_geo_streamGeometryType = {\n Sphere: function(object, listener) {\n listener.sphere();\n },\n Point: function(object, listener) {\n object = object.coordinates;\n listener.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n },\n LineString: function(object, listener) {\n d3_geo_streamLine(object.coordinates, listener, 0);\n },\n MultiLineString: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n },\n Polygon: function(object, listener) {\n d3_geo_streamPolygon(object.coordinates, listener);\n },\n MultiPolygon: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n },\n GeometryCollection: function(object, listener) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n }\n };\n function d3_geo_streamLine(coordinates, listener, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n listener.lineStart();\n while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n listener.lineEnd();\n }\n function d3_geo_streamPolygon(coordinates, listener) {\n var i = -1, n = coordinates.length;\n listener.polygonStart();\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n listener.polygonEnd();\n }\n d3.geo.area = function(object) {\n d3_geo_areaSum = 0;\n d3.geo.stream(object, d3_geo_area);\n return d3_geo_areaSum;\n };\n var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n var d3_geo_area = {\n sphere: function() {\n d3_geo_areaSum += 4 * π;\n },\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_areaRingSum.reset();\n d3_geo_area.lineStart = d3_geo_areaRingStart;\n },\n polygonEnd: function() {\n var area = 2 * d3_geo_areaRingSum;\n d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n }\n };\n function d3_geo_areaRingStart() {\n var λ00, φ00, λ0, cosφ0, sinφ0;\n d3_geo_area.point = function(λ, φ) {\n d3_geo_area.point = nextPoint;\n λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n sinφ0 = Math.sin(φ);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n φ = φ * d3_radians / 2 + π / 4;\n var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n d3_geo_areaRingSum.add(Math.atan2(v, u));\n λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n }\n d3_geo_area.lineEnd = function() {\n nextPoint(λ00, φ00);\n };\n }\n function d3_geo_cartesian(spherical) {\n var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n }\n function d3_geo_cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n }\n function d3_geo_cartesianCross(a, b) {\n return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n }\n function d3_geo_cartesianAdd(a, b) {\n a[0] += b[0];\n a[1] += b[1];\n a[2] += b[2];\n }\n function d3_geo_cartesianScale(vector, k) {\n return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n }\n function d3_geo_cartesianNormalize(d) {\n var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l;\n d[1] /= l;\n d[2] /= l;\n }\n function d3_geo_spherical(cartesian) {\n return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n }\n function d3_geo_sphericalEqual(a, b) {\n return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n }\n d3.geo.bounds = function() {\n var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n var bound = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n bound.point = ringPoint;\n bound.lineStart = ringStart;\n bound.lineEnd = ringEnd;\n dλSum = 0;\n d3_geo_area.polygonStart();\n },\n polygonEnd: function() {\n d3_geo_area.polygonEnd();\n bound.point = point;\n bound.lineStart = lineStart;\n bound.lineEnd = lineEnd;\n if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n range[0] = λ0, range[1] = λ1;\n }\n };\n function point(λ, φ) {\n ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n function linePoint(λ, φ) {\n var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n if (p0) {\n var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n d3_geo_cartesianNormalize(inflection);\n inflection = d3_geo_spherical(inflection);\n var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = inflection[1] * d3_degrees;\n if (φi > φ1) φ1 = φi;\n } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = -inflection[1] * d3_degrees;\n if (φi < φ0) φ0 = φi;\n } else {\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n if (antimeridian) {\n if (λ < λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n } else {\n if (λ1 >= λ0) {\n if (λ < λ0) λ0 = λ;\n if (λ > λ1) λ1 = λ;\n } else {\n if (λ > λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n }\n }\n } else {\n point(λ, φ);\n }\n p0 = p, λ_ = λ;\n }\n function lineStart() {\n bound.point = linePoint;\n }\n function lineEnd() {\n range[0] = λ0, range[1] = λ1;\n bound.point = point;\n p0 = null;\n }\n function ringPoint(λ, φ) {\n if (p0) {\n var dλ = λ - λ_;\n dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n } else λ__ = λ, φ__ = φ;\n d3_geo_area.point(λ, φ);\n linePoint(λ, φ);\n }\n function ringStart() {\n d3_geo_area.lineStart();\n }\n function ringEnd() {\n ringPoint(λ__, φ__);\n d3_geo_area.lineEnd();\n if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n range[0] = λ0, range[1] = λ1;\n p0 = null;\n }\n function angle(λ0, λ1) {\n return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n }\n function compareRanges(a, b) {\n return a[0] - b[0];\n }\n function withinRange(x, range) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n }\n return function(feature) {\n φ1 = λ1 = -(λ0 = φ0 = Infinity);\n ranges = [];\n d3.geo.stream(feature, bound);\n var n = ranges.length;\n if (n) {\n ranges.sort(compareRanges);\n for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n b = ranges[i];\n if (withinRange(b[0], a) || withinRange(b[1], a)) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n var best = -Infinity, dλ;\n for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n b = merged[i];\n if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n }\n }\n ranges = range = null;\n return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n };\n }();\n d3.geo.centroid = function(object) {\n d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, d3_geo_centroid);\n var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n if (m < ε2) {\n x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n m = x * x + y * y + z * z;\n if (m < ε2) return [ NaN, NaN ];\n }\n return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n };\n var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n var d3_geo_centroid = {\n sphere: d3_noop,\n point: d3_geo_centroidPoint,\n lineStart: d3_geo_centroidLineStart,\n lineEnd: d3_geo_centroidLineEnd,\n polygonStart: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n }\n };\n function d3_geo_centroidPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n }\n function d3_geo_centroidPointXYZ(x, y, z) {\n ++d3_geo_centroidW0;\n d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n }\n function d3_geo_centroidLineStart() {\n var x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroid.point = nextPoint;\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_centroidLineEnd() {\n d3_geo_centroid.point = d3_geo_centroidPoint;\n }\n function d3_geo_centroidRingStart() {\n var λ00, φ00, x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ00 = λ, φ00 = φ;\n d3_geo_centroid.point = nextPoint;\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n d3_geo_centroid.lineEnd = function() {\n nextPoint(λ00, φ00);\n d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n d3_geo_centroid.point = d3_geo_centroidPoint;\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n d3_geo_centroidX2 += v * cx;\n d3_geo_centroidY2 += v * cy;\n d3_geo_centroidZ2 += v * cz;\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_compose(a, b) {\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n return compose;\n }\n function d3_true() {\n return true;\n }\n function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n var subject = [], clip = [];\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n];\n if (d3_geo_sphericalEqual(p0, p1)) {\n listener.lineStart();\n for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n listener.lineEnd();\n return;\n }\n var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n a.o = b;\n subject.push(a);\n clip.push(b);\n a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n a.o = b;\n subject.push(a);\n clip.push(b);\n });\n clip.sort(compare);\n d3_geo_clipPolygonLinkCircular(subject);\n d3_geo_clipPolygonLinkCircular(clip);\n if (!subject.length) return;\n for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n clip[i].e = entry = !entry;\n }\n var start = subject[0], points, point;\n while (1) {\n var current = start, isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n listener.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, listener);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, listener);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n listener.lineEnd();\n }\n }\n function d3_geo_clipPolygonLinkCircular(array) {\n if (!(n = array.length)) return;\n var n, i = 0, a = array[0], b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n }\n function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other;\n this.e = entry;\n this.v = false;\n this.n = this.p = null;\n }\n function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n return function(rotate, listener) {\n var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = d3.merge(segments);\n var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n if (segments.length) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n } else if (clipStartInside) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n listener.polygonStart();\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n listener.polygonEnd();\n }\n };\n function point(λ, φ) {\n var point = rotate(λ, φ);\n if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n }\n function pointLine(λ, φ) {\n var point = rotate(λ, φ);\n line.point(point[0], point[1]);\n }\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n var segments;\n var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n function pointRing(λ, φ) {\n ring.push([ λ, φ ]);\n var point = rotate(λ, φ);\n ringListener.point(point[0], point[1]);\n }\n function ringStart() {\n ringListener.lineStart();\n ring = [];\n }\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringListener.lineEnd();\n var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n ring.pop();\n polygon.push(ring);\n ring = null;\n if (!n) return;\n if (clean & 1) {\n segment = ringSegments[0];\n var n = segment.length - 1, i = -1, point;\n if (n > 0) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n while (++i < n) listener.point((point = segment[i])[0], point[1]);\n listener.lineEnd();\n }\n return;\n }\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n }\n return clip;\n };\n }\n function d3_geo_clipSegmentLength1(segment) {\n return segment.length > 1;\n }\n function d3_geo_clipBufferListener() {\n var lines = [], line;\n return {\n lineStart: function() {\n lines.push(line = []);\n },\n point: function(λ, φ) {\n line.push([ λ, φ ]);\n },\n lineEnd: d3_noop,\n buffer: function() {\n var buffer = lines;\n lines = [];\n line = null;\n return buffer;\n },\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n }\n };\n }\n function d3_geo_clipSort(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n }\n var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n function d3_geo_clipAntimeridianLine(listener) {\n var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n return {\n lineStart: function() {\n listener.lineStart();\n clean = 1;\n },\n point: function(λ1, φ1) {\n var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n if (abs(dλ - π) < ε) {\n listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n listener.point(λ1, φ0);\n clean = 0;\n } else if (sλ0 !== sλ1 && dλ >= π) {\n if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n clean = 0;\n }\n listener.point(λ0 = λ1, φ0 = φ1);\n sλ0 = sλ1;\n },\n lineEnd: function() {\n listener.lineEnd();\n λ0 = φ0 = NaN;\n },\n clean: function() {\n return 2 - clean;\n }\n };\n }\n function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n }\n function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n var φ;\n if (from == null) {\n φ = direction * halfπ;\n listener.point(-π, φ);\n listener.point(0, φ);\n listener.point(π, φ);\n listener.point(π, 0);\n listener.point(π, -φ);\n listener.point(0, -φ);\n listener.point(-π, -φ);\n listener.point(-π, 0);\n listener.point(-π, φ);\n } else if (abs(from[0] - to[0]) > ε) {\n var s = from[0] < to[0] ? π : -π;\n φ = direction * s / 2;\n listener.point(-s, φ);\n listener.point(0, φ);\n listener.point(s, φ);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function d3_geo_pointInPolygon(point, polygon) {\n var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n d3_geo_areaRingSum.reset();\n for (var i = 0, n = polygon.length; i < n; ++i) {\n var ring = polygon[i], m = ring.length;\n if (!m) continue;\n var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n while (true) {\n if (j === m) j = 0;\n point = ring[j];\n var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n d3_geo_cartesianNormalize(arc);\n var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n d3_geo_cartesianNormalize(intersection);\n var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n }\n }\n if (!j++) break;\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n }\n }\n return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;\n }\n function d3_geo_clipCircle(radius) {\n var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n function visible(λ, φ) {\n return Math.cos(λ) * Math.cos(φ) > cr;\n }\n function clipLine(listener) {\n var point0, c0, v0, v00, clean;\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(λ, φ) {\n var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n if (!point0 && (v00 = v0 = v)) listener.lineStart();\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n point1[0] += ε;\n point1[1] += ε;\n v = visible(point1[0], point1[1]);\n }\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n listener.lineStart();\n point2 = intersect(point1, point0);\n listener.point(point2[0], point2[1]);\n } else {\n point2 = intersect(point0, point1);\n listener.point(point2[0], point2[1]);\n listener.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n } else {\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n }\n }\n }\n if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n listener.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) listener.lineEnd();\n point0 = null;\n },\n clean: function() {\n return clean | (v00 && v0) << 1;\n }\n };\n }\n function intersect(a, b, two) {\n var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n if (!determinant) return !two && a;\n var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n d3_geo_cartesianAdd(A, B);\n var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n if (t2 < 0) return;\n var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n d3_geo_cartesianAdd(q, A);\n q = d3_geo_spherical(q);\n if (!two) return q;\n var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n d3_geo_cartesianAdd(q1, A);\n return [ q, d3_geo_spherical(q1) ];\n }\n }\n function code(λ, φ) {\n var r = smallRadius ? radius : π - radius, code = 0;\n if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n return code;\n }\n }\n function d3_geom_clipLine(x0, y0, x1, y1) {\n return function(line) {\n var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n if (t0 > 0) line.a = {\n x: ax + t0 * dx,\n y: ay + t0 * dy\n };\n if (t1 < 1) line.b = {\n x: ax + t1 * dx,\n y: ay + t1 * dy\n };\n return line;\n };\n }\n var d3_geo_clipExtentMAX = 1e9;\n d3.geo.clipExtent = function() {\n var x0, y0, x1, y1, stream, clip, clipExtent = {\n stream: function(output) {\n if (stream) stream.valid = false;\n stream = clip(output);\n stream.valid = true;\n return stream;\n },\n extent: function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n if (stream) stream.valid = false, stream = null;\n return clipExtent;\n }\n };\n return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n };\n function d3_geo_clipExtent(x0, y0, x1, y1) {\n return function(listener) {\n var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n listener = bufferListener;\n segments = [];\n polygon = [];\n clean = true;\n },\n polygonEnd: function() {\n listener = listener_;\n segments = d3.merge(segments);\n var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n if (inside || visible) {\n listener.polygonStart();\n if (inside) {\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (visible) {\n d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n }\n listener.polygonEnd();\n }\n segments = polygon = ring = null;\n }\n };\n function insidePolygon(p) {\n var wn = 0, n = polygon.length, y = p[1];\n for (var i = 0; i < n; ++i) {\n for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n b = v[j];\n if (a[1] <= y) {\n if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n } else {\n if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n }\n a = b;\n }\n }\n return wn !== 0;\n }\n function interpolate(from, to, direction, listener) {\n var a = 0, a1 = 0;\n if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n do {\n listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n } while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function pointVisible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n function point(x, y) {\n if (pointVisible(x, y)) listener.point(x, y);\n }\n var x__, y__, v__, x_, y_, v_, first, clean;\n function lineStart() {\n clip.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferListener.rejoin();\n segments.push(bufferListener.buffer());\n }\n clip.point = point;\n if (v_) listener.lineEnd();\n }\n function linePoint(x, y) {\n x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n var v = pointVisible(x, y);\n if (polygon) ring.push([ x, y ]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n listener.lineStart();\n listener.point(x, y);\n }\n } else {\n if (v && v_) listener.point(x, y); else {\n var l = {\n a: {\n x: x_,\n y: y_\n },\n b: {\n x: x,\n y: y\n }\n };\n if (clipLine(l)) {\n if (!v_) {\n listener.lineStart();\n listener.point(l.a.x, l.a.y);\n }\n listener.point(l.b.x, l.b.y);\n if (!v) listener.lineEnd();\n clean = false;\n } else if (v) {\n listener.lineStart();\n listener.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n return clip;\n };\n function corner(p, direction) {\n return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n }\n function compare(a, b) {\n return comparePoints(a.x, b.x);\n }\n function comparePoints(a, b) {\n var ca = corner(a, 1), cb = corner(b, 1);\n return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n }\n }\n function d3_geo_conic(projectAt) {\n var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n p.parallels = function(_) {\n if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n };\n return p;\n }\n function d3_geo_conicEqualArea(φ0, φ1) {\n var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n function forward(λ, φ) {\n var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = ρ0 - y;\n return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n };\n return forward;\n }\n (d3.geo.conicEqualArea = function() {\n return d3_geo_conic(d3_geo_conicEqualArea);\n }).raw = d3_geo_conicEqualArea;\n d3.geo.albers = function() {\n return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n };\n d3.geo.albersUsa = function() {\n var lower48 = d3.geo.albers();\n var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n var point, pointStream = {\n point: function(x, y) {\n point = [ x, y ];\n }\n }, lower48Point, alaskaPoint, hawaiiPoint;\n function albersUsa(coordinates) {\n var x = coordinates[0], y = coordinates[1];\n point = null;\n (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n return point;\n }\n albersUsa.invert = function(coordinates) {\n var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n };\n albersUsa.stream = function(stream) {\n var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n return {\n point: function(x, y) {\n lower48Stream.point(x, y);\n alaskaStream.point(x, y);\n hawaiiStream.point(x, y);\n },\n sphere: function() {\n lower48Stream.sphere();\n alaskaStream.sphere();\n hawaiiStream.sphere();\n },\n lineStart: function() {\n lower48Stream.lineStart();\n alaskaStream.lineStart();\n hawaiiStream.lineStart();\n },\n lineEnd: function() {\n lower48Stream.lineEnd();\n alaskaStream.lineEnd();\n hawaiiStream.lineEnd();\n },\n polygonStart: function() {\n lower48Stream.polygonStart();\n alaskaStream.polygonStart();\n hawaiiStream.polygonStart();\n },\n polygonEnd: function() {\n lower48Stream.polygonEnd();\n alaskaStream.polygonEnd();\n hawaiiStream.polygonEnd();\n }\n };\n };\n albersUsa.precision = function(_) {\n if (!arguments.length) return lower48.precision();\n lower48.precision(_);\n alaska.precision(_);\n hawaii.precision(_);\n return albersUsa;\n };\n albersUsa.scale = function(_) {\n if (!arguments.length) return lower48.scale();\n lower48.scale(_);\n alaska.scale(_ * .35);\n hawaii.scale(_);\n return albersUsa.translate(lower48.translate());\n };\n albersUsa.translate = function(_) {\n if (!arguments.length) return lower48.translate();\n var k = lower48.scale(), x = +_[0], y = +_[1];\n lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n return albersUsa;\n };\n return albersUsa.scale(1070);\n };\n var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_pathAreaPolygon = 0;\n d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n }\n };\n function d3_geo_pathAreaRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathArea.point = function(x, y) {\n d3_geo_pathArea.point = nextPoint;\n x00 = x0 = x, y00 = y0 = y;\n };\n function nextPoint(x, y) {\n d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n x0 = x, y0 = y;\n }\n d3_geo_pathArea.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n var d3_geo_pathBounds = {\n point: d3_geo_pathBoundsPoint,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_pathBoundsPoint(x, y) {\n if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n }\n function d3_geo_pathBuffer() {\n var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointCircle = d3_geo_pathBufferCircle(_);\n return stream;\n },\n result: function() {\n if (buffer.length) {\n var result = buffer.join(\"\");\n buffer = [];\n return result;\n }\n }\n };\n function point(x, y) {\n buffer.push(\"M\", x, \",\", y, pointCircle);\n }\n function pointLineStart(x, y) {\n buffer.push(\"M\", x, \",\", y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n buffer.push(\"L\", x, \",\", y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n buffer.push(\"Z\");\n }\n return stream;\n }\n function d3_geo_pathBufferCircle(radius) {\n return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n }\n var d3_geo_pathCentroid = {\n point: d3_geo_pathCentroidPoint,\n lineStart: d3_geo_pathCentroidLineStart,\n lineEnd: d3_geo_pathCentroidLineEnd,\n polygonStart: function() {\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n }\n };\n function d3_geo_pathCentroidPoint(x, y) {\n d3_geo_centroidX0 += x;\n d3_geo_centroidY0 += y;\n ++d3_geo_centroidZ0;\n }\n function d3_geo_pathCentroidLineStart() {\n var x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n }\n function d3_geo_pathCentroidLineEnd() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n }\n function d3_geo_pathCentroidRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n z = y0 * x - x0 * y;\n d3_geo_centroidX2 += z * (x0 + x);\n d3_geo_centroidY2 += z * (y0 + y);\n d3_geo_centroidZ2 += z * 3;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n d3_geo_pathCentroid.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n function d3_geo_pathContext(context) {\n var pointRadius = 4.5;\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointRadius = _;\n return stream;\n },\n result: d3_noop\n };\n function point(x, y) {\n context.moveTo(x + pointRadius, y);\n context.arc(x, y, pointRadius, 0, τ);\n }\n function pointLineStart(x, y) {\n context.moveTo(x, y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n context.lineTo(x, y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n context.closePath();\n }\n return stream;\n }\n function d3_geo_resample(project) {\n var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n function resample(stream) {\n return (maxDepth ? resampleRecursive : resampleNone)(stream);\n }\n function resampleNone(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n });\n }\n function resampleRecursive(stream) {\n var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n var resample = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.polygonStart();\n resample.lineStart = ringStart;\n },\n polygonEnd: function() {\n stream.polygonEnd();\n resample.lineStart = lineStart;\n }\n };\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n function lineStart() {\n x0 = NaN;\n resample.point = linePoint;\n stream.lineStart();\n }\n function linePoint(λ, φ) {\n var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n function lineEnd() {\n resample.point = point;\n stream.lineEnd();\n }\n function ringStart() {\n lineStart();\n resample.point = ringPoint;\n resample.lineEnd = ringEnd;\n }\n function ringPoint(λ, φ) {\n linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resample.point = linePoint;\n }\n function ringEnd() {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n resample.lineEnd = lineEnd;\n lineEnd();\n }\n return resample;\n }\n function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n if (d2 > 4 * δ2 && depth--) {\n var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n }\n }\n }\n resample.precision = function(_) {\n if (!arguments.length) return Math.sqrt(δ2);\n maxDepth = (δ2 = _ * _) > 0 && 16;\n return resample;\n };\n return resample;\n }\n d3.geo.path = function() {\n var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n d3.geo.stream(object, cacheStream);\n }\n return contextStream.result();\n }\n path.area = function(object) {\n d3_geo_pathAreaSum = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathArea));\n return d3_geo_pathAreaSum;\n };\n path.centroid = function(object) {\n d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n };\n path.bounds = function(object) {\n d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n };\n path.projection = function(_) {\n if (!arguments.length) return projection;\n projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n return reset();\n };\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return reset();\n };\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n function reset() {\n cacheStream = null;\n return path;\n }\n return path.projection(d3.geo.albersUsa()).context(null);\n };\n function d3_geo_pathProjectStream(project) {\n var resample = d3_geo_resample(function(x, y) {\n return project([ x * d3_degrees, y * d3_degrees ]);\n });\n return function(stream) {\n return d3_geo_projectionRadians(resample(stream));\n };\n }\n d3.geo.transform = function(methods) {\n return {\n stream: function(stream) {\n var transform = new d3_geo_transform(stream);\n for (var k in methods) transform[k] = methods[k];\n return transform;\n }\n };\n };\n function d3_geo_transform(stream) {\n this.stream = stream;\n }\n d3_geo_transform.prototype = {\n point: function(x, y) {\n this.stream.point(x, y);\n },\n sphere: function() {\n this.stream.sphere();\n },\n lineStart: function() {\n this.stream.lineStart();\n },\n lineEnd: function() {\n this.stream.lineEnd();\n },\n polygonStart: function() {\n this.stream.polygonStart();\n },\n polygonEnd: function() {\n this.stream.polygonEnd();\n }\n };\n function d3_geo_transformPoint(stream, point) {\n return {\n point: point,\n sphere: function() {\n stream.sphere();\n },\n lineStart: function() {\n stream.lineStart();\n },\n lineEnd: function() {\n stream.lineEnd();\n },\n polygonStart: function() {\n stream.polygonStart();\n },\n polygonEnd: function() {\n stream.polygonEnd();\n }\n };\n }\n d3.geo.projection = d3_geo_projection;\n d3.geo.projectionMutator = d3_geo_projectionMutator;\n function d3_geo_projection(project) {\n return d3_geo_projectionMutator(function() {\n return project;\n })();\n }\n function d3_geo_projectionMutator(projectAt) {\n var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n x = project(x, y);\n return [ x[0] * k + δx, δy - x[1] * k ];\n }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n function projection(point) {\n point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n return [ point[0] * k + δx, δy - point[1] * k ];\n }\n function invert(point) {\n point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n }\n projection.stream = function(output) {\n if (stream) stream.valid = false;\n stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n stream.valid = true;\n return stream;\n };\n projection.clipAngle = function(_) {\n if (!arguments.length) return clipAngle;\n preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n return invalidate();\n };\n projection.clipExtent = function(_) {\n if (!arguments.length) return clipExtent;\n clipExtent = _;\n postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n return invalidate();\n };\n projection.scale = function(_) {\n if (!arguments.length) return k;\n k = +_;\n return reset();\n };\n projection.translate = function(_) {\n if (!arguments.length) return [ x, y ];\n x = +_[0];\n y = +_[1];\n return reset();\n };\n projection.center = function(_) {\n if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n λ = _[0] % 360 * d3_radians;\n φ = _[1] % 360 * d3_radians;\n return reset();\n };\n projection.rotate = function(_) {\n if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n δλ = _[0] % 360 * d3_radians;\n δφ = _[1] % 360 * d3_radians;\n δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n return reset();\n };\n d3.rebind(projection, projectResample, \"precision\");\n function reset() {\n projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n var center = project(λ, φ);\n δx = x - center[0] * k;\n δy = y + center[1] * k;\n return invalidate();\n }\n function invalidate() {\n if (stream) stream.valid = false, stream = null;\n return projection;\n }\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return reset();\n };\n }\n function d3_geo_projectionRadians(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n stream.point(x * d3_radians, y * d3_radians);\n });\n }\n function d3_geo_equirectangular(λ, φ) {\n return [ λ, φ ];\n }\n (d3.geo.equirectangular = function() {\n return d3_geo_projection(d3_geo_equirectangular);\n }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n d3.geo.rotation = function(rotate) {\n rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n }\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n };\n return forward;\n };\n function d3_geo_identityRotation(λ, φ) {\n return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n }\n d3_geo_identityRotation.invert = d3_geo_equirectangular;\n function d3_geo_rotation(δλ, δφ, δγ) {\n return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n }\n function d3_geo_forwardRotationλ(δλ) {\n return function(λ, φ) {\n return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n };\n }\n function d3_geo_rotationλ(δλ) {\n var rotation = d3_geo_forwardRotationλ(δλ);\n rotation.invert = d3_geo_forwardRotationλ(-δλ);\n return rotation;\n }\n function d3_geo_rotationφγ(δφ, δγ) {\n var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n function rotation(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n }\n rotation.invert = function(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n };\n return rotation;\n }\n d3.geo.circle = function() {\n var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n function circle() {\n var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n interpolate(null, null, 1, {\n point: function(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= d3_degrees, x[1] *= d3_degrees;\n }\n });\n return {\n type: \"Polygon\",\n coordinates: [ ring ]\n };\n }\n circle.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return circle;\n };\n circle.angle = function(x) {\n if (!arguments.length) return angle;\n interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n return circle;\n };\n circle.precision = function(_) {\n if (!arguments.length) return precision;\n interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n return circle;\n };\n return circle.angle(90);\n };\n function d3_geo_circleInterpolate(radius, precision) {\n var cr = Math.cos(radius), sr = Math.sin(radius);\n return function(from, to, direction, listener) {\n var step = direction * precision;\n if (from != null) {\n from = d3_geo_circleAngle(cr, from);\n to = d3_geo_circleAngle(cr, to);\n if (direction > 0 ? from < to : from > to) from += direction * τ;\n } else {\n from = radius + direction * τ;\n to = radius - .5 * step;\n }\n for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n }\n };\n }\n function d3_geo_circleAngle(cr, point) {\n var a = d3_geo_cartesian(point);\n a[0] -= cr;\n d3_geo_cartesianNormalize(a);\n var angle = d3_acos(-a[1]);\n return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n }\n d3.geo.distance = function(a, b) {\n var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n };\n d3.geo.graticule = function() {\n var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n function graticule() {\n return {\n type: \"MultiLineString\",\n coordinates: lines()\n };\n }\n function lines() {\n return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n return abs(x % DX) > ε;\n }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n return abs(y % DY) > ε;\n }).map(y));\n }\n graticule.lines = function() {\n return lines().map(function(coordinates) {\n return {\n type: \"LineString\",\n coordinates: coordinates\n };\n });\n };\n graticule.outline = function() {\n return {\n type: \"Polygon\",\n coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n };\n };\n graticule.extent = function(_) {\n if (!arguments.length) return graticule.minorExtent();\n return graticule.majorExtent(_).minorExtent(_);\n };\n graticule.majorExtent = function(_) {\n if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n X0 = +_[0][0], X1 = +_[1][0];\n Y0 = +_[0][1], Y1 = +_[1][1];\n if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n return graticule.precision(precision);\n };\n graticule.minorExtent = function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n x0 = +_[0][0], x1 = +_[1][0];\n y0 = +_[0][1], y1 = +_[1][1];\n if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n return graticule.precision(precision);\n };\n graticule.step = function(_) {\n if (!arguments.length) return graticule.minorStep();\n return graticule.majorStep(_).minorStep(_);\n };\n graticule.majorStep = function(_) {\n if (!arguments.length) return [ DX, DY ];\n DX = +_[0], DY = +_[1];\n return graticule;\n };\n graticule.minorStep = function(_) {\n if (!arguments.length) return [ dx, dy ];\n dx = +_[0], dy = +_[1];\n return graticule;\n };\n graticule.precision = function(_) {\n if (!arguments.length) return precision;\n precision = +_;\n x = d3_geo_graticuleX(y0, y1, 90);\n y = d3_geo_graticuleY(x0, x1, precision);\n X = d3_geo_graticuleX(Y0, Y1, 90);\n Y = d3_geo_graticuleY(X0, X1, precision);\n return graticule;\n };\n return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n };\n function d3_geo_graticuleX(y0, y1, dy) {\n var y = d3.range(y0, y1 - ε, dy).concat(y1);\n return function(x) {\n return y.map(function(y) {\n return [ x, y ];\n });\n };\n }\n function d3_geo_graticuleY(x0, x1, dx) {\n var x = d3.range(x0, x1 - ε, dx).concat(x1);\n return function(y) {\n return x.map(function(x) {\n return [ x, y ];\n });\n };\n }\n function d3_source(d) {\n return d.source;\n }\n function d3_target(d) {\n return d.target;\n }\n d3.geo.greatArc = function() {\n var source = d3_source, source_, target = d3_target, target_;\n function greatArc() {\n return {\n type: \"LineString\",\n coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n };\n }\n greatArc.distance = function() {\n return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n };\n greatArc.source = function(_) {\n if (!arguments.length) return source;\n source = _, source_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.target = function(_) {\n if (!arguments.length) return target;\n target = _, target_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.precision = function() {\n return arguments.length ? greatArc : 0;\n };\n return greatArc;\n };\n d3.geo.interpolate = function(source, target) {\n return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n };\n function d3_geo_interpolate(x0, y0, x1, y1) {\n var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n var interpolate = d ? function(t) {\n var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n } : function() {\n return [ x0 * d3_degrees, y0 * d3_degrees ];\n };\n interpolate.distance = d;\n return interpolate;\n }\n d3.geo.length = function(object) {\n d3_geo_lengthSum = 0;\n d3.geo.stream(object, d3_geo_length);\n return d3_geo_lengthSum;\n };\n var d3_geo_lengthSum;\n var d3_geo_length = {\n sphere: d3_noop,\n point: d3_noop,\n lineStart: d3_geo_lengthLineStart,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_lengthLineStart() {\n var λ0, sinφ0, cosφ0;\n d3_geo_length.point = function(λ, φ) {\n λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n d3_geo_length.point = nextPoint;\n };\n d3_geo_length.lineEnd = function() {\n d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n };\n function nextPoint(λ, φ) {\n var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n }\n }\n function d3_geo_azimuthal(scale, angle) {\n function azimuthal(λ, φ) {\n var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n }\n azimuthal.invert = function(x, y) {\n var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n };\n return azimuthal;\n }\n var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n return Math.sqrt(2 / (1 + cosλcosφ));\n }, function(ρ) {\n return 2 * Math.asin(ρ / 2);\n });\n (d3.geo.azimuthalEqualArea = function() {\n return d3_geo_projection(d3_geo_azimuthalEqualArea);\n }).raw = d3_geo_azimuthalEqualArea;\n var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n var c = Math.acos(cosλcosφ);\n return c && c / Math.sin(c);\n }, d3_identity);\n (d3.geo.azimuthalEquidistant = function() {\n return d3_geo_projection(d3_geo_azimuthalEquidistant);\n }).raw = d3_geo_azimuthalEquidistant;\n function d3_geo_conicConformal(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), t = function(φ) {\n return Math.tan(π / 4 + φ / 2);\n }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n if (!n) return d3_geo_mercator;\n function forward(λ, φ) {\n if (F > 0) {\n if (φ < -halfπ + ε) φ = -halfπ + ε;\n } else {\n if (φ > halfπ - ε) φ = halfπ - ε;\n }\n var ρ = F / Math.pow(t(φ), n);\n return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n };\n return forward;\n }\n (d3.geo.conicConformal = function() {\n return d3_geo_conic(d3_geo_conicConformal);\n }).raw = d3_geo_conicConformal;\n function d3_geo_conicEquidistant(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n if (abs(n) < ε) return d3_geo_equirectangular;\n function forward(λ, φ) {\n var ρ = G - φ;\n return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = G - y;\n return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n };\n return forward;\n }\n (d3.geo.conicEquidistant = function() {\n return d3_geo_conic(d3_geo_conicEquidistant);\n }).raw = d3_geo_conicEquidistant;\n var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / cosλcosφ;\n }, Math.atan);\n (d3.geo.gnomonic = function() {\n return d3_geo_projection(d3_geo_gnomonic);\n }).raw = d3_geo_gnomonic;\n function d3_geo_mercator(λ, φ) {\n return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n }\n d3_geo_mercator.invert = function(x, y) {\n return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n };\n function d3_geo_mercatorProjection(project) {\n var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n m.scale = function() {\n var v = scale.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.translate = function() {\n var v = translate.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.clipExtent = function(_) {\n var v = clipExtent.apply(m, arguments);\n if (v === m) {\n if (clipAuto = _ == null) {\n var k = π * scale(), t = translate();\n clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n }\n } else if (clipAuto) {\n v = null;\n }\n return v;\n };\n return m.clipExtent(null);\n }\n (d3.geo.mercator = function() {\n return d3_geo_mercatorProjection(d3_geo_mercator);\n }).raw = d3_geo_mercator;\n var d3_geo_orthographic = d3_geo_azimuthal(function() {\n return 1;\n }, Math.asin);\n (d3.geo.orthographic = function() {\n return d3_geo_projection(d3_geo_orthographic);\n }).raw = d3_geo_orthographic;\n var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / (1 + cosλcosφ);\n }, function(ρ) {\n return 2 * Math.atan(ρ);\n });\n (d3.geo.stereographic = function() {\n return d3_geo_projection(d3_geo_stereographic);\n }).raw = d3_geo_stereographic;\n function d3_geo_transverseMercator(λ, φ) {\n return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n }\n d3_geo_transverseMercator.invert = function(x, y) {\n return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n };\n (d3.geo.transverseMercator = function() {\n var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n projection.center = function(_) {\n return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n };\n projection.rotate = function(_) {\n return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n [ _[0], _[1], _[2] - 90 ]);\n };\n return rotate([ 0, 0, 90 ]);\n }).raw = d3_geo_transverseMercator;\n d3.geom = {};\n function d3_geom_pointX(d) {\n return d[0];\n }\n function d3_geom_pointY(d) {\n return d[1];\n }\n d3.geom.hull = function(vertices) {\n var x = d3_geom_pointX, y = d3_geom_pointY;\n if (arguments.length) return hull(vertices);\n function hull(data) {\n if (data.length < 3) return [];\n var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n for (i = 0; i < n; i++) {\n points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n }\n points.sort(d3_geom_hullOrder);\n for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n return polygon;\n }\n hull.x = function(_) {\n return arguments.length ? (x = _, hull) : x;\n };\n hull.y = function(_) {\n return arguments.length ? (y = _, hull) : y;\n };\n return hull;\n };\n function d3_geom_hullUpper(points) {\n var n = points.length, hull = [ 0, 1 ], hs = 2;\n for (var i = 2; i < n; i++) {\n while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n hull[hs++] = i;\n }\n return hull.slice(0, hs);\n }\n function d3_geom_hullOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n }\n d3.geom.polygon = function(coordinates) {\n d3_subclass(coordinates, d3_geom_polygonPrototype);\n return coordinates;\n };\n var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n d3_geom_polygonPrototype.area = function() {\n var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n while (++i < n) {\n a = b;\n b = this[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n return area * .5;\n };\n d3_geom_polygonPrototype.centroid = function(k) {\n var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n if (!arguments.length) k = -1 / (6 * this.area());\n while (++i < n) {\n a = b;\n b = this[i];\n c = a[0] * b[1] - b[0] * a[1];\n x += (a[0] + b[0]) * c;\n y += (a[1] + b[1]) * c;\n }\n return [ x * k, y * k ];\n };\n d3_geom_polygonPrototype.clip = function(subject) {\n var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n while (++i < n) {\n input = subject.slice();\n subject.length = 0;\n b = this[i];\n c = input[(m = input.length - closed) - 1];\n j = -1;\n while (++j < m) {\n d = input[j];\n if (d3_geom_polygonInside(d, a, b)) {\n if (!d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n subject.push(d);\n } else if (d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n c = d;\n }\n if (closed) subject.push(subject[0]);\n a = b;\n }\n return subject;\n };\n function d3_geom_polygonInside(p, a, b) {\n return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n }\n function d3_geom_polygonIntersect(c, d, a, b) {\n var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n return [ x1 + ua * x21, y1 + ua * y21 ];\n }\n function d3_geom_polygonClosed(coordinates) {\n var a = coordinates[0], b = coordinates[coordinates.length - 1];\n return !(a[0] - b[0] || a[1] - b[1]);\n }\n var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n function d3_geom_voronoiBeach() {\n d3_geom_voronoiRedBlackNode(this);\n this.edge = this.site = this.circle = null;\n }\n function d3_geom_voronoiCreateBeach(site) {\n var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n beach.site = site;\n return beach;\n }\n function d3_geom_voronoiDetachBeach(beach) {\n d3_geom_voronoiDetachCircle(beach);\n d3_geom_voronoiBeaches.remove(beach);\n d3_geom_voronoiBeachPool.push(beach);\n d3_geom_voronoiRedBlackNode(beach);\n }\n function d3_geom_voronoiRemoveBeach(beach) {\n var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n x: x,\n y: y\n }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n d3_geom_voronoiDetachBeach(beach);\n var lArc = previous;\n while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachBeach(lArc);\n lArc = previous;\n }\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachCircle(lArc);\n var rArc = next;\n while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n next = rArc.N;\n disappearing.push(rArc);\n d3_geom_voronoiDetachBeach(rArc);\n rArc = next;\n }\n disappearing.push(rArc);\n d3_geom_voronoiDetachCircle(rArc);\n var nArcs = disappearing.length, iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiAddBeach(site) {\n var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n while (node) {\n dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n if (dxl > ε) node = node.L; else {\n dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n if (dxr > ε) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -ε) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -ε) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n var newArc = d3_geom_voronoiCreateBeach(site);\n d3_geom_voronoiBeaches.insert(lArc, newArc);\n if (!lArc && !rArc) return;\n if (lArc === rArc) {\n d3_geom_voronoiDetachCircle(lArc);\n rArc = d3_geom_voronoiCreateBeach(lArc.site);\n d3_geom_voronoiBeaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n return;\n }\n if (!rArc) {\n newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n return;\n }\n d3_geom_voronoiDetachCircle(lArc);\n d3_geom_voronoiDetachCircle(rArc);\n var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n x: (cy * hb - by * hc) / d + ax,\n y: (bx * hc - cx * hb) / d + ay\n };\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n if (!pby2) return rfocx;\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n site = lArc.site;\n var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n if (!plby2) return lfocx;\n var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n return (rfocx + lfocx) / 2;\n }\n function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site.y === directrix ? site.x : Infinity;\n }\n function d3_geom_voronoiCell(site) {\n this.site = site;\n this.edges = [];\n }\n d3_geom_voronoiCell.prototype.prepare = function() {\n var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n while (iHalfEdge--) {\n edge = halfEdges[iHalfEdge].edge;\n if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n }\n halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n return halfEdges.length;\n };\n function d3_geom_voronoiCloseCells(extent) {\n var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n while (iCell--) {\n cell = cells[iCell];\n if (!cell || !cell.prepare()) continue;\n halfEdges = cell.edges;\n nHalfEdges = halfEdges.length;\n iHalfEdge = 0;\n while (iHalfEdge < nHalfEdges) {\n end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n x: x0,\n y: abs(x2 - x0) < ε ? y2 : y1\n } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n x: abs(y2 - y1) < ε ? x2 : x1,\n y: y1\n } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n x: x1,\n y: abs(x2 - x1) < ε ? y2 : y0\n } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n x: abs(y2 - y0) < ε ? x2 : x0,\n y: y0\n } : null), cell.site, null));\n ++nHalfEdges;\n }\n }\n }\n }\n function d3_geom_voronoiHalfEdgeOrder(a, b) {\n return b.angle - a.angle;\n }\n function d3_geom_voronoiCircle() {\n d3_geom_voronoiRedBlackNode(this);\n this.x = this.y = this.arc = this.site = this.cy = null;\n }\n function d3_geom_voronoiAttachCircle(arc) {\n var lArc = arc.P, rArc = arc.N;\n if (!lArc || !rArc) return;\n var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n if (lSite === rSite) return;\n var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -ε2) return;\n var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = cy + Math.sqrt(x * x + y * y);\n circle.cy = cy;\n arc.circle = circle;\n var before = null, node = d3_geom_voronoiCircles._;\n while (node) {\n if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n if (node.L) node = node.L; else {\n before = node.P;\n break;\n }\n } else {\n if (node.R) node = node.R; else {\n before = node;\n break;\n }\n }\n }\n d3_geom_voronoiCircles.insert(before, circle);\n if (!before) d3_geom_voronoiFirstCircle = circle;\n }\n function d3_geom_voronoiDetachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n d3_geom_voronoiCircles.remove(circle);\n d3_geom_voronoiCirclePool.push(circle);\n d3_geom_voronoiRedBlackNode(circle);\n arc.circle = null;\n }\n }\n function d3_geom_voronoiClipEdges(extent) {\n var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n while (i--) {\n e = edges[i];\n if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n e.a = e.b = null;\n edges.splice(i, 1);\n }\n }\n }\n function d3_geom_voronoiConnectEdge(edge, extent) {\n var vb = edge.b;\n if (vb) return true;\n var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!va) va = {\n x: fx,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: fx,\n y: y1\n };\n } else {\n if (!va) va = {\n x: fx,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: fx,\n y: y0\n };\n }\n } else {\n fm = (lx - rx) / (ry - ly);\n fb = fy - fm * fx;\n if (fm < -1 || fm > 1) {\n if (lx > rx) {\n if (!va) va = {\n x: (y0 - fb) / fm,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: (y1 - fb) / fm,\n y: y1\n };\n } else {\n if (!va) va = {\n x: (y1 - fb) / fm,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: (y0 - fb) / fm,\n y: y0\n };\n }\n } else {\n if (ly < ry) {\n if (!va) va = {\n x: x0,\n y: fm * x0 + fb\n }; else if (va.x >= x1) return;\n vb = {\n x: x1,\n y: fm * x1 + fb\n };\n } else {\n if (!va) va = {\n x: x1,\n y: fm * x1 + fb\n }; else if (va.x < x0) return;\n vb = {\n x: x0,\n y: fm * x0 + fb\n };\n }\n }\n }\n edge.a = va;\n edge.b = vb;\n return true;\n }\n function d3_geom_voronoiEdge(lSite, rSite) {\n this.l = lSite;\n this.r = rSite;\n this.a = this.b = null;\n }\n function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, rSite);\n d3_geom_voronoiEdges.push(edge);\n if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n return edge;\n }\n function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, null);\n edge.a = va;\n edge.b = vb;\n d3_geom_voronoiEdges.push(edge);\n return edge;\n }\n function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n if (!edge.a && !edge.b) {\n edge.a = vertex;\n edge.l = lSite;\n edge.r = rSite;\n } else if (edge.l === rSite) {\n edge.b = vertex;\n } else {\n edge.a = vertex;\n }\n }\n function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n var va = edge.a, vb = edge.b;\n this.edge = edge;\n this.site = lSite;\n this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n }\n d3_geom_voronoiHalfEdge.prototype = {\n start: function() {\n return this.edge.l === this.site ? this.edge.a : this.edge.b;\n },\n end: function() {\n return this.edge.l === this.site ? this.edge.b : this.edge.a;\n }\n };\n function d3_geom_voronoiRedBlackTree() {\n this._ = null;\n }\n function d3_geom_voronoiRedBlackNode(node) {\n node.U = node.C = node.L = node.R = node.P = node.N = null;\n }\n d3_geom_voronoiRedBlackTree.prototype = {\n insert: function(after, node) {\n var parent, grandpa, uncle;\n if (after) {\n node.P = after;\n node.N = after.N;\n if (after.N) after.N.P = node;\n after.N = node;\n if (after.R) {\n after = after.R;\n while (after.L) after = after.L;\n after.L = node;\n } else {\n after.R = node;\n }\n parent = after;\n } else if (this._) {\n after = d3_geom_voronoiRedBlackFirst(this._);\n node.P = null;\n node.N = after;\n after.P = after.L = node;\n parent = after;\n } else {\n node.P = node.N = null;\n this._ = node;\n parent = null;\n }\n node.L = node.R = null;\n node.U = parent;\n node.C = true;\n after = node;\n while (parent && parent.C) {\n grandpa = parent.U;\n if (parent === grandpa.L) {\n uncle = grandpa.R;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.R) {\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n }\n } else {\n uncle = grandpa.L;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.L) {\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\n },\n remove: function(node) {\n if (node.N) node.N.P = node.P;\n if (node.P) node.P.N = node.N;\n node.N = node.P = null;\n var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n if (parent) {\n if (parent.L === node) parent.L = next; else parent.R = next;\n } else {\n this._ = next;\n }\n if (left && right) {\n red = next.C;\n next.C = node.C;\n next.L = left;\n left.U = next;\n if (next !== right) {\n parent = next.U;\n next.U = node.U;\n node = next.R;\n parent.L = node;\n next.R = right;\n right.U = next;\n } else {\n next.U = parent;\n parent = next;\n node = next.R;\n }\n } else {\n red = node.C;\n node = next;\n }\n if (node) node.U = parent;\n if (red) return;\n if (node && node.C) {\n node.C = false;\n return;\n }\n do {\n if (node === this._) break;\n if (node === parent.L) {\n sibling = parent.R;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n d3_geom_voronoiRedBlackRotateLeft(this, parent);\n node = this._;\n break;\n }\n } else {\n sibling = parent.L;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n d3_geom_voronoiRedBlackRotateRight(this, parent);\n node = this._;\n break;\n }\n }\n sibling.C = true;\n node = parent;\n parent = parent.U;\n } while (!node.C);\n if (node) node.C = false;\n }\n };\n function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n var p = node, q = node.R, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\n }\n q.U = parent;\n p.U = q;\n p.R = q.L;\n if (p.R) p.R.U = p;\n q.L = p;\n }\n function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n var p = node, q = node.L, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\n }\n q.U = parent;\n p.U = q;\n p.L = q.R;\n if (p.L) p.L.U = p;\n q.R = p;\n }\n function d3_geom_voronoiRedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n }\n function d3_geom_voronoi(sites, bbox) {\n var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n d3_geom_voronoiEdges = [];\n d3_geom_voronoiCells = new Array(sites.length);\n d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n while (true) {\n circle = d3_geom_voronoiFirstCircle;\n if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n if (site.x !== x0 || site.y !== y0) {\n d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n d3_geom_voronoiAddBeach(site);\n x0 = site.x, y0 = site.y;\n }\n site = sites.pop();\n } else if (circle) {\n d3_geom_voronoiRemoveBeach(circle.arc);\n } else {\n break;\n }\n }\n if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n var diagram = {\n cells: d3_geom_voronoiCells,\n edges: d3_geom_voronoiEdges\n };\n d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n return diagram;\n }\n function d3_geom_voronoiVertexOrder(a, b) {\n return b.y - a.y || b.x - a.x;\n }\n d3.geom.voronoi = function(points) {\n var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n if (points) return voronoi(points);\n function voronoi(data) {\n var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n var s = e.start();\n return [ s.x, s.y ];\n }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n polygon.point = data[i];\n });\n return polygons;\n }\n function sites(data) {\n return data.map(function(d, i) {\n return {\n x: Math.round(fx(d, i) / ε) * ε,\n y: Math.round(fy(d, i) / ε) * ε,\n i: i\n };\n });\n }\n voronoi.links = function(data) {\n return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n return edge.l && edge.r;\n }).map(function(edge) {\n return {\n source: data[edge.l.i],\n target: data[edge.r.i]\n };\n });\n };\n voronoi.triangles = function(data) {\n var triangles = [];\n d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n while (++j < m) {\n e0 = e1;\n s0 = s1;\n e1 = edges[j].edge;\n s1 = e1.l === site ? e1.r : e1.l;\n if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n }\n }\n });\n return triangles;\n };\n voronoi.x = function(_) {\n return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n };\n voronoi.y = function(_) {\n return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n };\n voronoi.clipExtent = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n return voronoi;\n };\n voronoi.size = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n };\n return voronoi;\n };\n var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n function d3_geom_voronoiTriangleArea(a, b, c) {\n return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n }\n d3.geom.delaunay = function(vertices) {\n return d3.geom.voronoi().triangles(vertices);\n };\n d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n if (compat = arguments.length) {\n x = d3_geom_quadtreeCompatX;\n y = d3_geom_quadtreeCompatY;\n if (compat === 3) {\n y2 = y1;\n x2 = x1;\n y1 = x1 = 0;\n }\n return quadtree(points);\n }\n function quadtree(data) {\n var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n if (x1 != null) {\n x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n } else {\n x2_ = y2_ = -(x1_ = y1_ = Infinity);\n xs = [], ys = [];\n n = data.length;\n if (compat) for (i = 0; i < n; ++i) {\n d = data[i];\n if (d.x < x1_) x1_ = d.x;\n if (d.y < y1_) y1_ = d.y;\n if (d.x > x2_) x2_ = d.x;\n if (d.y > y2_) y2_ = d.y;\n xs.push(d.x);\n ys.push(d.y);\n } else for (i = 0; i < n; ++i) {\n var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n if (x_ < x1_) x1_ = x_;\n if (y_ < y1_) y1_ = y_;\n if (x_ > x2_) x2_ = x_;\n if (y_ > y2_) y2_ = y_;\n xs.push(x_);\n ys.push(y_);\n }\n }\n var dx = x2_ - x1_, dy = y2_ - y1_;\n if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n function insert(n, d, x, y, x1, y1, x2, y2) {\n if (isNaN(x) || isNaN(y)) return;\n if (n.leaf) {\n var nx = n.x, ny = n.y;\n if (nx != null) {\n if (abs(nx - x) + abs(ny - y) < .01) {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n } else {\n var nPoint = n.point;\n n.x = n.y = n.point = null;\n insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n } else {\n n.x = x, n.y = y, n.point = d;\n }\n } else {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n }\n function insertChild(n, d, x, y, x1, y1, x2, y2) {\n var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n n.leaf = false;\n n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n if (right) x1 = xm; else x2 = xm;\n if (below) y1 = ym; else y2 = ym;\n insert(n, d, x, y, x1, y1, x2, y2);\n }\n var root = d3_geom_quadtreeNode();\n root.add = function(d) {\n insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n };\n root.visit = function(f) {\n d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n };\n root.find = function(point) {\n return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n };\n i = -1;\n if (x1 == null) {\n while (++i < n) {\n insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n }\n --i;\n } else data.forEach(root.add);\n xs = ys = data = d = null;\n return root;\n }\n quadtree.x = function(_) {\n return arguments.length ? (x = _, quadtree) : x;\n };\n quadtree.y = function(_) {\n return arguments.length ? (y = _, quadtree) : y;\n };\n quadtree.extent = function(_) {\n if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n y2 = +_[1][1];\n return quadtree;\n };\n quadtree.size = function(_) {\n if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n return quadtree;\n };\n return quadtree;\n };\n function d3_geom_quadtreeCompatX(d) {\n return d.x;\n }\n function d3_geom_quadtreeCompatY(d) {\n return d.y;\n }\n function d3_geom_quadtreeNode() {\n return {\n leaf: true,\n nodes: [],\n point: null,\n x: null,\n y: null\n };\n }\n function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n if (!f(node, x1, y1, x2, y2)) {\n var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n }\n }\n function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n var minDistance2 = Infinity, closestPoint;\n (function find(node, x1, y1, x2, y2) {\n if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n if (point = node.point) {\n var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n if (distance2 < minDistance2) {\n var distance = Math.sqrt(minDistance2 = distance2);\n x0 = x - distance, y0 = y - distance;\n x3 = x + distance, y3 = y + distance;\n closestPoint = point;\n }\n }\n var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n if (node = children[i & 3]) switch (i & 3) {\n case 0:\n find(node, x1, y1, xm, ym);\n break;\n\n case 1:\n find(node, xm, y1, x2, ym);\n break;\n\n case 2:\n find(node, x1, ym, xm, y2);\n break;\n\n case 3:\n find(node, xm, ym, x2, y2);\n break;\n }\n }\n })(root, x0, y0, x3, y3);\n return closestPoint;\n }\n d3.interpolateRgb = d3_interpolateRgb;\n function d3_interpolateRgb(a, b) {\n a = d3.rgb(a);\n b = d3.rgb(b);\n var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n return function(t) {\n return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n };\n }\n d3.interpolateObject = d3_interpolateObject;\n function d3_interpolateObject(a, b) {\n var i = {}, c = {}, k;\n for (k in a) {\n if (k in b) {\n i[k] = d3_interpolate(a[k], b[k]);\n } else {\n c[k] = a[k];\n }\n }\n for (k in b) {\n if (!(k in a)) {\n c[k] = b[k];\n }\n }\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n }\n d3.interpolateNumber = d3_interpolateNumber;\n function d3_interpolateNumber(a, b) {\n a = +a, b = +b;\n return function(t) {\n return a * (1 - t) + b * t;\n };\n }\n d3.interpolateString = d3_interpolateString;\n function d3_interpolateString(a, b) {\n var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n a = a + \"\", b = b + \"\";\n while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n if ((bs = bm.index) > bi) {\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) {\n if (s[i]) s[i] += bm; else s[++i] = bm;\n } else {\n s[++i] = null;\n q.push({\n i: i,\n x: d3_interpolateNumber(am, bm)\n });\n }\n bi = d3_interpolate_numberB.lastIndex;\n }\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n return b(t) + \"\";\n }) : function() {\n return b;\n } : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n }\n var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n d3.interpolate = d3_interpolate;\n function d3_interpolate(a, b) {\n var i = d3.interpolators.length, f;\n while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n return f;\n }\n d3.interpolators = [ function(a, b) {\n var t = typeof b;\n return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n } ];\n d3.interpolateArray = d3_interpolateArray;\n function d3_interpolateArray(a, b) {\n var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n for (;i < na; ++i) c[i] = a[i];\n for (;i < nb; ++i) c[i] = b[i];\n return function(t) {\n for (i = 0; i < n0; ++i) c[i] = x[i](t);\n return c;\n };\n }\n var d3_ease_default = function() {\n return d3_identity;\n };\n var d3_ease = d3.map({\n linear: d3_ease_default,\n poly: d3_ease_poly,\n quad: function() {\n return d3_ease_quad;\n },\n cubic: function() {\n return d3_ease_cubic;\n },\n sin: function() {\n return d3_ease_sin;\n },\n exp: function() {\n return d3_ease_exp;\n },\n circle: function() {\n return d3_ease_circle;\n },\n elastic: d3_ease_elastic,\n back: d3_ease_back,\n bounce: function() {\n return d3_ease_bounce;\n }\n });\n var d3_ease_mode = d3.map({\n \"in\": d3_identity,\n out: d3_ease_reverse,\n \"in-out\": d3_ease_reflect,\n \"out-in\": function(f) {\n return d3_ease_reflect(d3_ease_reverse(f));\n }\n });\n d3.ease = function(name) {\n var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n t = d3_ease.get(t) || d3_ease_default;\n m = d3_ease_mode.get(m) || d3_identity;\n return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n };\n function d3_ease_clamp(f) {\n return function(t) {\n return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n };\n }\n function d3_ease_reverse(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n function d3_ease_reflect(f) {\n return function(t) {\n return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n };\n }\n function d3_ease_quad(t) {\n return t * t;\n }\n function d3_ease_cubic(t) {\n return t * t * t;\n }\n function d3_ease_cubicInOut(t) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n var t2 = t * t, t3 = t2 * t;\n return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n }\n function d3_ease_poly(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n function d3_ease_sin(t) {\n return 1 - Math.cos(t * halfπ);\n }\n function d3_ease_exp(t) {\n return Math.pow(2, 10 * (t - 1));\n }\n function d3_ease_circle(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n function d3_ease_elastic(a, p) {\n var s;\n if (arguments.length < 2) p = .45;\n if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n };\n }\n function d3_ease_back(s) {\n if (!s) s = 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n function d3_ease_bounce(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n }\n d3.interpolateHcl = d3_interpolateHcl;\n function d3_interpolateHcl(a, b) {\n a = d3.hcl(a);\n b = d3.hcl(b);\n var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateHsl = d3_interpolateHsl;\n function d3_interpolateHsl(a, b) {\n a = d3.hsl(a);\n b = d3.hsl(b);\n var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n };\n }\n // ONTO: The -Long version was added in d3 v4 (this is v3) but we hacked our own implementation here\n d3.interpolateHslLong = d3_interpolateHslLong;\n function d3_interpolateHslLong(a, b) {\n a = d3.hsl(a);\n b = d3.hsl(b);\n var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah;// else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateLab = d3_interpolateLab;\n function d3_interpolateLab(a, b) {\n a = d3.lab(a);\n b = d3.lab(b);\n var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n return function(t) {\n return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n };\n }\n d3.interpolateRound = d3_interpolateRound;\n function d3_interpolateRound(a, b) {\n b -= a;\n return function(t) {\n return Math.round(a + b * t);\n };\n }\n d3.transform = function(string) {\n var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n return (d3.transform = function(string) {\n if (string != null) {\n g.setAttribute(\"transform\", string);\n var t = g.transform.baseVal.consolidate();\n }\n return new d3_transform(t ? t.matrix : d3_transformIdentity);\n })(string);\n };\n function d3_transform(m) {\n var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n if (r0[0] * r1[1] < r1[0] * r0[1]) {\n r0[0] *= -1;\n r0[1] *= -1;\n kx *= -1;\n kz *= -1;\n }\n this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n this.translate = [ m.e, m.f ];\n this.scale = [ kx, ky ];\n this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n }\n d3_transform.prototype.toString = function() {\n return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n };\n function d3_transformDot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n }\n function d3_transformNormalize(a) {\n var k = Math.sqrt(d3_transformDot(a, a));\n if (k) {\n a[0] /= k;\n a[1] /= k;\n }\n return k;\n }\n function d3_transformCombine(a, b, k) {\n a[0] += k * b[0];\n a[1] += k * b[1];\n return a;\n }\n var d3_transformIdentity = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0\n };\n d3.interpolateTransform = d3_interpolateTransform;\n function d3_interpolateTransformPop(s) {\n return s.length ? s.pop() + \",\" : \"\";\n }\n function d3_interpolateTranslate(ta, tb, s, q) {\n if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n var i = s.push(\"translate(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ta[0], tb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ta[1], tb[1])\n });\n } else if (tb[0] || tb[1]) {\n s.push(\"translate(\" + tb + \")\");\n }\n }\n function d3_interpolateRotate(ra, rb, s, q) {\n if (ra !== rb) {\n if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n x: d3_interpolateNumber(ra, rb)\n });\n } else if (rb) {\n s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n }\n }\n function d3_interpolateSkew(wa, wb, s, q) {\n if (wa !== wb) {\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n x: d3_interpolateNumber(wa, wb)\n });\n } else if (wb) {\n s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n }\n }\n function d3_interpolateScale(ka, kb, s, q) {\n if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ka[0], kb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ka[1], kb[1])\n });\n } else if (kb[0] !== 1 || kb[1] !== 1) {\n s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n }\n }\n function d3_interpolateTransform(a, b) {\n var s = [], q = [];\n a = d3.transform(a), b = d3.transform(b);\n d3_interpolateTranslate(a.translate, b.translate, s, q);\n d3_interpolateRotate(a.rotate, b.rotate, s, q);\n d3_interpolateSkew(a.skew, b.skew, s, q);\n d3_interpolateScale(a.scale, b.scale, s, q);\n a = b = null;\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n }\n function d3_uninterpolateNumber(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return (x - a) / b;\n };\n }\n function d3_uninterpolateClamp(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return Math.max(0, Math.min(1, (x - a) / b));\n };\n }\n d3.layout = {};\n d3.layout.bundle = function() {\n return function(links) {\n var paths = [], i = -1, n = links.length;\n while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n return paths;\n };\n };\n function d3_layout_bundlePath(link) {\n var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n while (start !== lca) {\n start = start.parent;\n points.push(start);\n }\n var k = points.length;\n while (end !== lca) {\n points.splice(k, 0, end);\n end = end.parent;\n }\n return points;\n }\n function d3_layout_bundleAncestors(node) {\n var ancestors = [], parent = node.parent;\n while (parent != null) {\n ancestors.push(node);\n node = parent;\n parent = parent.parent;\n }\n ancestors.push(node);\n return ancestors;\n }\n function d3_layout_bundleLeastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n while (aNode === bNode) {\n sharedNode = aNode;\n aNode = aNodes.pop();\n bNode = bNodes.pop();\n }\n return sharedNode;\n }\n d3.layout.chord = function() {\n var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n function relayout() {\n var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n chords = [];\n groups = [];\n k = 0, i = -1;\n while (++i < n) {\n x = 0, j = -1;\n while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(d3.range(n));\n k += x;\n }\n if (sortGroups) {\n groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n }\n if (sortSubgroups) {\n subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n }\n k = (τ - padding * n) / k;\n x = 0, i = -1;\n while (++i < n) {\n x0 = x, j = -1;\n while (++j < n) {\n var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n subgroups[di + \"-\" + dj] = {\n index: di,\n subindex: dj,\n startAngle: a0,\n endAngle: a1,\n value: v\n };\n }\n groups[di] = {\n index: di,\n startAngle: x0,\n endAngle: x,\n value: groupSums[di]\n };\n x += padding;\n }\n i = -1;\n while (++i < n) {\n j = i - 1;\n while (++j < n) {\n var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n if (source.value || target.value) {\n chords.push(source.value < target.value ? {\n source: target,\n target: source\n } : {\n source: source,\n target: target\n });\n }\n }\n }\n if (sortChords) resort();\n }\n function resort() {\n chords.sort(function(a, b) {\n return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n });\n }\n chord.matrix = function(x) {\n if (!arguments.length) return matrix;\n n = (matrix = x) && matrix.length;\n chords = groups = null;\n return chord;\n };\n chord.padding = function(x) {\n if (!arguments.length) return padding;\n padding = x;\n chords = groups = null;\n return chord;\n };\n chord.sortGroups = function(x) {\n if (!arguments.length) return sortGroups;\n sortGroups = x;\n chords = groups = null;\n return chord;\n };\n chord.sortSubgroups = function(x) {\n if (!arguments.length) return sortSubgroups;\n sortSubgroups = x;\n chords = null;\n return chord;\n };\n chord.sortChords = function(x) {\n if (!arguments.length) return sortChords;\n sortChords = x;\n if (chords) resort();\n return chord;\n };\n chord.chords = function() {\n if (!chords) relayout();\n return chords;\n };\n chord.groups = function() {\n if (!groups) relayout();\n return groups;\n };\n return chord;\n };\n d3.layout.force = function() {\n var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n function repulse(node) {\n return function(quad, x1, _, x2) {\n if (quad.point !== node) {\n var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n if (dw * dw / theta2 < dn) {\n if (dn < chargeDistance2) {\n var k = quad.charge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n return true;\n }\n if (quad.point && dn && dn < chargeDistance2) {\n var k = quad.pointCharge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n }\n return !quad.charge;\n };\n }\n force.tick = function() {\n if ((alpha *= .99) < .005) {\n timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n return true;\n }\n var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n for (i = 0; i < m; ++i) {\n o = links[i];\n s = o.source;\n t = o.target;\n x = t.x - s.x;\n y = t.y - s.y;\n if (l = x * x + y * y) {\n l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n x *= l;\n y *= l;\n t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n t.y -= y * k;\n s.x += x * (k = 1 - k);\n s.y += y * k;\n }\n }\n if (k = alpha * gravity) {\n x = size[0] / 2;\n y = size[1] / 2;\n i = -1;\n if (k) while (++i < n) {\n o = nodes[i];\n o.x += (x - o.x) * k;\n o.y += (y - o.y) * k;\n }\n }\n if (charge) {\n d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n i = -1;\n while (++i < n) {\n if (!(o = nodes[i]).fixed) {\n q.visit(repulse(o));\n }\n }\n }\n i = -1;\n while (++i < n) {\n o = nodes[i];\n if (o.fixed) {\n o.x = o.px;\n o.y = o.py;\n } else {\n o.x -= (o.px - (o.px = o.x)) * friction;\n o.y -= (o.py - (o.py = o.y)) * friction;\n }\n }\n event.tick({\n type: \"tick\",\n alpha: alpha\n });\n };\n force.nodes = function(x) {\n if (!arguments.length) return nodes;\n nodes = x;\n return force;\n };\n force.links = function(x) {\n if (!arguments.length) return links;\n links = x;\n return force;\n };\n force.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return force;\n };\n force.linkDistance = function(x) {\n if (!arguments.length) return linkDistance;\n linkDistance = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.distance = force.linkDistance;\n force.linkStrength = function(x) {\n if (!arguments.length) return linkStrength;\n linkStrength = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.friction = function(x) {\n if (!arguments.length) return friction;\n friction = +x;\n return force;\n };\n force.charge = function(x) {\n if (!arguments.length) return charge;\n charge = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.chargeDistance = function(x) {\n if (!arguments.length) return Math.sqrt(chargeDistance2);\n chargeDistance2 = x * x;\n return force;\n };\n force.gravity = function(x) {\n if (!arguments.length) return gravity;\n gravity = +x;\n return force;\n };\n force.theta = function(x) {\n if (!arguments.length) return Math.sqrt(theta2);\n theta2 = x * x;\n return force;\n };\n force.alpha = function(x) {\n if (!arguments.length) return alpha;\n x = +x;\n if (alpha) {\n if (x > 0) {\n alpha = x;\n } else {\n timer.c = null, timer.t = NaN, timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n }\n } else if (x > 0) {\n event.start({\n type: \"start\",\n alpha: alpha = x\n });\n timer = d3_timer(force.tick);\n }\n return force;\n };\n force.start = function() {\n var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n for (i = 0; i < n; ++i) {\n (o = nodes[i]).index = i;\n o.weight = 0;\n }\n for (i = 0; i < m; ++i) {\n o = links[i];\n if (typeof o.source == \"number\") o.source = nodes[o.source];\n if (typeof o.target == \"number\") o.target = nodes[o.target];\n ++o.source.weight;\n ++o.target.weight;\n }\n for (i = 0; i < n; ++i) {\n o = nodes[i];\n if (isNaN(o.x)) o.x = position(\"x\", w);\n if (isNaN(o.y)) o.y = position(\"y\", h);\n if (isNaN(o.px)) o.px = o.x;\n if (isNaN(o.py)) o.py = o.y;\n }\n distances = [];\n if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n strengths = [];\n if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n charges = [];\n if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n function position(dimension, size) {\n if (!neighbors) {\n neighbors = new Array(n);\n for (j = 0; j < n; ++j) {\n neighbors[j] = [];\n }\n for (j = 0; j < m; ++j) {\n var o = links[j];\n neighbors[o.source.index].push(o.target);\n neighbors[o.target.index].push(o.source);\n }\n }\n var candidates = neighbors[i], j = -1, l = candidates.length, x;\n while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n return Math.random() * size;\n }\n return force.resume();\n };\n force.resume = function() {\n return force.alpha(.1);\n };\n force.stop = function() {\n return force.alpha(0);\n };\n force.drag = function() {\n if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n if (!arguments.length) return drag;\n this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n };\n function dragmove(d) {\n d.px = d3.event.x, d.py = d3.event.y;\n force.resume();\n }\n return d3.rebind(force, event, \"on\");\n };\n function d3_layout_forceDragstart(d) {\n d.fixed |= 2;\n }\n function d3_layout_forceDragend(d) {\n d.fixed &= ~6;\n }\n function d3_layout_forceMouseover(d) {\n d.fixed |= 4;\n d.px = d.x, d.py = d.y;\n }\n function d3_layout_forceMouseout(d) {\n d.fixed &= ~4;\n }\n function d3_layout_forceAccumulate(quad, alpha, charges) {\n var cx = 0, cy = 0;\n quad.charge = 0;\n if (!quad.leaf) {\n var nodes = quad.nodes, n = nodes.length, i = -1, c;\n while (++i < n) {\n c = nodes[i];\n if (c == null) continue;\n d3_layout_forceAccumulate(c, alpha, charges);\n quad.charge += c.charge;\n cx += c.charge * c.cx;\n cy += c.charge * c.cy;\n }\n }\n if (quad.point) {\n if (!quad.leaf) {\n quad.point.x += Math.random() - .5;\n quad.point.y += Math.random() - .5;\n }\n var k = alpha * charges[quad.point.index];\n quad.charge += quad.pointCharge = k;\n cx += k * quad.point.x;\n cy += k * quad.point.y;\n }\n quad.cx = cx / quad.charge;\n quad.cy = cy / quad.charge;\n }\n var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n d3.layout.hierarchy = function() {\n var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n function hierarchy(root) {\n var stack = [ root ], nodes = [], node;\n root.depth = 0;\n while ((node = stack.pop()) != null) {\n nodes.push(node);\n if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n var n, childs, child;\n while (--n >= 0) {\n stack.push(child = childs[n]);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n if (value) node.value = 0;\n node.children = childs;\n } else {\n if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n delete node.children;\n }\n }\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var childs, parent;\n if (sort && (childs = node.children)) childs.sort(sort);\n if (value && (parent = node.parent)) parent.value += node.value;\n });\n return nodes;\n }\n hierarchy.sort = function(x) {\n if (!arguments.length) return sort;\n sort = x;\n return hierarchy;\n };\n hierarchy.children = function(x) {\n if (!arguments.length) return children;\n children = x;\n return hierarchy;\n };\n hierarchy.value = function(x) {\n if (!arguments.length) return value;\n value = x;\n return hierarchy;\n };\n hierarchy.revalue = function(root) {\n if (value) {\n d3_layout_hierarchyVisitBefore(root, function(node) {\n if (node.children) node.value = 0;\n });\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var parent;\n if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n if (parent = node.parent) parent.value += node.value;\n });\n }\n return root;\n };\n return hierarchy;\n };\n function d3_layout_hierarchyRebind(object, hierarchy) {\n d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n object.nodes = object;\n object.links = d3_layout_hierarchyLinks;\n return object;\n }\n function d3_layout_hierarchyVisitBefore(node, callback) {\n var nodes = [ node ];\n while ((node = nodes.pop()) != null) {\n callback(node);\n if ((children = node.children) && (n = children.length)) {\n var n, children;\n while (--n >= 0) nodes.push(children[n]);\n }\n }\n }\n function d3_layout_hierarchyVisitAfter(node, callback) {\n var nodes = [ node ], nodes2 = [];\n while ((node = nodes.pop()) != null) {\n nodes2.push(node);\n if ((children = node.children) && (n = children.length)) {\n var i = -1, n, children;\n while (++i < n) nodes.push(children[i]);\n }\n }\n while ((node = nodes2.pop()) != null) {\n callback(node);\n }\n }\n function d3_layout_hierarchyChildren(d) {\n return d.children;\n }\n function d3_layout_hierarchyValue(d) {\n return d.value;\n }\n function d3_layout_hierarchySort(a, b) {\n return b.value - a.value;\n }\n function d3_layout_hierarchyLinks(nodes) {\n return d3.merge(nodes.map(function(parent) {\n return (parent.children || []).map(function(child) {\n return {\n source: parent,\n target: child\n };\n });\n }));\n }\n d3.layout.partition = function() {\n var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n function position(node, x, dx, dy) {\n var children = node.children;\n node.x = x;\n node.y = node.depth * dy;\n node.dx = dx;\n node.dy = dy;\n if (children && (n = children.length)) {\n var i = -1, n, c, d;\n dx = node.value ? dx / node.value : 0;\n while (++i < n) {\n position(c = children[i], x, d = c.value * dx, dy);\n x += d;\n }\n }\n }\n function depth(node) {\n var children = node.children, d = 0;\n if (children && (n = children.length)) {\n var i = -1, n;\n while (++i < n) d = Math.max(d, depth(children[i]));\n }\n return 1 + d;\n }\n function partition(d, i) {\n var nodes = hierarchy.call(this, d, i);\n position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n return nodes;\n }\n partition.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return partition;\n };\n return d3_layout_hierarchyRebind(partition, hierarchy);\n };\n d3.layout.pie = function() {\n var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n function pie(data) {\n var n = data.length, values = data.map(function(d, i) {\n return +value.call(pie, d, i);\n }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n return values[j] - values[i];\n } : function(i, j) {\n return sort(data[i], data[j]);\n });\n index.forEach(function(i) {\n arcs[i] = {\n data: data[i],\n value: v = values[i],\n startAngle: a,\n endAngle: a += v * k + pa,\n padAngle: p\n };\n });\n return arcs;\n }\n pie.value = function(_) {\n if (!arguments.length) return value;\n value = _;\n return pie;\n };\n pie.sort = function(_) {\n if (!arguments.length) return sort;\n sort = _;\n return pie;\n };\n pie.startAngle = function(_) {\n if (!arguments.length) return startAngle;\n startAngle = _;\n return pie;\n };\n pie.endAngle = function(_) {\n if (!arguments.length) return endAngle;\n endAngle = _;\n return pie;\n };\n pie.padAngle = function(_) {\n if (!arguments.length) return padAngle;\n padAngle = _;\n return pie;\n };\n return pie;\n };\n var d3_layout_pieSortByValue = {};\n d3.layout.stack = function() {\n var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n function stack(data, index) {\n if (!(n = data.length)) return data;\n var series = data.map(function(d, i) {\n return values.call(stack, d, i);\n });\n var points = series.map(function(d) {\n return d.map(function(v, i) {\n return [ x.call(stack, v, i), y.call(stack, v, i) ];\n });\n });\n var orders = order.call(stack, points, index);\n series = d3.permute(series, orders);\n points = d3.permute(points, orders);\n var offsets = offset.call(stack, points, index);\n var m = series[0].length, n, i, j, o;\n for (j = 0; j < m; ++j) {\n out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n for (i = 1; i < n; ++i) {\n out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n }\n }\n return data;\n }\n stack.values = function(x) {\n if (!arguments.length) return values;\n values = x;\n return stack;\n };\n stack.order = function(x) {\n if (!arguments.length) return order;\n order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n return stack;\n };\n stack.offset = function(x) {\n if (!arguments.length) return offset;\n offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n return stack;\n };\n stack.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n return stack;\n };\n stack.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n return stack;\n };\n stack.out = function(z) {\n if (!arguments.length) return out;\n out = z;\n return stack;\n };\n return stack;\n };\n function d3_layout_stackX(d) {\n return d.x;\n }\n function d3_layout_stackY(d) {\n return d.y;\n }\n function d3_layout_stackOut(d, y0, y) {\n d.y0 = y0;\n d.y = y;\n }\n var d3_layout_stackOrders = d3.map({\n \"inside-out\": function(data) {\n var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n return max[a] - max[b];\n }), top = 0, bottom = 0, tops = [], bottoms = [];\n for (i = 0; i < n; ++i) {\n j = index[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n return bottoms.reverse().concat(tops);\n },\n reverse: function(data) {\n return d3.range(data.length).reverse();\n },\n \"default\": d3_layout_stackOrderDefault\n });\n var d3_layout_stackOffsets = d3.map({\n silhouette: function(data) {\n var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o > max) max = o;\n sums.push(o);\n }\n for (j = 0; j < m; ++j) {\n y0[j] = (max - sums[j]) / 2;\n }\n return y0;\n },\n wiggle: function(data) {\n var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n y0[0] = o = o0 = 0;\n for (j = 1; j < m; ++j) {\n for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n }\n s2 += s3 * data[i][j][1];\n }\n y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n if (o < o0) o0 = o;\n }\n for (j = 0; j < m; ++j) y0[j] -= o0;\n return y0;\n },\n expand: function(data) {\n var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n }\n for (j = 0; j < m; ++j) y0[j] = 0;\n return y0;\n },\n zero: d3_layout_stackOffsetZero\n });\n function d3_layout_stackOrderDefault(data) {\n return d3.range(data.length);\n }\n function d3_layout_stackOffsetZero(data) {\n var j = -1, m = data[0].length, y0 = [];\n while (++j < m) y0[j] = 0;\n return y0;\n }\n function d3_layout_stackMaxIndex(array) {\n var i = 1, j = 0, v = array[0][1], k, n = array.length;\n for (;i < n; ++i) {\n if ((k = array[i][1]) > v) {\n j = i;\n v = k;\n }\n }\n return j;\n }\n function d3_layout_stackReduceSum(d) {\n return d.reduce(d3_layout_stackSum, 0);\n }\n function d3_layout_stackSum(p, d) {\n return p + d[1];\n }\n d3.layout.histogram = function() {\n var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n function histogram(data, i) {\n var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n while (++i < m) {\n bin = bins[i] = [];\n bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n bin.y = 0;\n }\n if (m > 0) {\n i = -1;\n while (++i < n) {\n x = values[i];\n if (x >= range[0] && x <= range[1]) {\n bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n bin.y += k;\n bin.push(data[i]);\n }\n }\n }\n return bins;\n }\n histogram.value = function(x) {\n if (!arguments.length) return valuer;\n valuer = x;\n return histogram;\n };\n histogram.range = function(x) {\n if (!arguments.length) return ranger;\n ranger = d3_functor(x);\n return histogram;\n };\n histogram.bins = function(x) {\n if (!arguments.length) return binner;\n binner = typeof x === \"number\" ? function(range) {\n return d3_layout_histogramBinFixed(range, x);\n } : d3_functor(x);\n return histogram;\n };\n histogram.frequency = function(x) {\n if (!arguments.length) return frequency;\n frequency = !!x;\n return histogram;\n };\n return histogram;\n };\n function d3_layout_histogramBinSturges(range, values) {\n return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n }\n function d3_layout_histogramBinFixed(range, n) {\n var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n while (++x <= n) f[x] = m * x + b;\n return f;\n }\n function d3_layout_histogramRange(values) {\n return [ d3.min(values), d3.max(values) ];\n }\n d3.layout.pack = function() {\n var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n function pack(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n return radius;\n };\n root.x = root.y = 0;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r = +r(d.value);\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n if (padding) {\n var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r += dr;\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r -= dr;\n });\n }\n d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n return nodes;\n }\n pack.size = function(_) {\n if (!arguments.length) return size;\n size = _;\n return pack;\n };\n pack.radius = function(_) {\n if (!arguments.length) return radius;\n radius = _ == null || typeof _ === \"function\" ? _ : +_;\n return pack;\n };\n pack.padding = function(_) {\n if (!arguments.length) return padding;\n padding = +_;\n return pack;\n };\n return d3_layout_hierarchyRebind(pack, hierarchy);\n };\n function d3_layout_packSort(a, b) {\n return a.value - b.value;\n }\n function d3_layout_packInsert(a, b) {\n var c = a._pack_next;\n a._pack_next = b;\n b._pack_prev = a;\n b._pack_next = c;\n c._pack_prev = b;\n }\n function d3_layout_packSplice(a, b) {\n a._pack_next = b;\n b._pack_prev = a;\n }\n function d3_layout_packIntersects(a, b) {\n var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n return .999 * dr * dr > dx * dx + dy * dy;\n }\n function d3_layout_packSiblings(node) {\n if (!(nodes = node.children) || !(n = nodes.length)) return;\n var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n function bound(node) {\n xMin = Math.min(node.x - node.r, xMin);\n xMax = Math.max(node.x + node.r, xMax);\n yMin = Math.min(node.y - node.r, yMin);\n yMax = Math.max(node.y + node.r, yMax);\n }\n nodes.forEach(d3_layout_packLink);\n a = nodes[0];\n a.x = -a.r;\n a.y = 0;\n bound(a);\n if (n > 1) {\n b = nodes[1];\n b.x = b.r;\n b.y = 0;\n bound(b);\n if (n > 2) {\n c = nodes[2];\n d3_layout_packPlace(a, b, c);\n bound(c);\n d3_layout_packInsert(a, c);\n a._pack_prev = c;\n d3_layout_packInsert(c, b);\n b = a._pack_next;\n for (i = 3; i < n; i++) {\n d3_layout_packPlace(a, b, c = nodes[i]);\n var isect = 0, s1 = 1, s2 = 1;\n for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n if (d3_layout_packIntersects(j, c)) {\n isect = 1;\n break;\n }\n }\n if (isect == 1) {\n for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n if (d3_layout_packIntersects(k, c)) {\n break;\n }\n }\n }\n if (isect) {\n if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n i--;\n } else {\n d3_layout_packInsert(a, c);\n b = c;\n bound(c);\n }\n }\n }\n }\n var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n for (i = 0; i < n; i++) {\n c = nodes[i];\n c.x -= cx;\n c.y -= cy;\n cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n }\n node.r = cr;\n nodes.forEach(d3_layout_packUnlink);\n }\n function d3_layout_packLink(node) {\n node._pack_next = node._pack_prev = node;\n }\n function d3_layout_packUnlink(node) {\n delete node._pack_next;\n delete node._pack_prev;\n }\n function d3_layout_packTransform(node, x, y, k) {\n var children = node.children;\n node.x = x += k * node.x;\n node.y = y += k * node.y;\n node.r *= k;\n if (children) {\n var i = -1, n = children.length;\n while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n }\n }\n function d3_layout_packPlace(a, b, c) {\n var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n if (db && (dx || dy)) {\n var da = b.r + c.r, dc = dx * dx + dy * dy;\n da *= da;\n db *= db;\n var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n c.x = a.x + x * dx + y * dy;\n c.y = a.y + x * dy - y * dx;\n } else {\n c.x = a.x + db;\n c.y = a.y;\n }\n }\n d3.layout.tree = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n function tree(d, i) {\n var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n d3_layout_hierarchyVisitBefore(root1, secondWalk);\n if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n var left = root0, right = root0, bottom = root0;\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n return nodes;\n }\n function wrapTree(root0) {\n var root1 = {\n A: null,\n children: [ root0 ]\n }, queue = [ root1 ], node1;\n while ((node1 = queue.pop()) != null) {\n for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n queue.push((children[i] = child = {\n _: children[i],\n parent: node1,\n children: (child = children[i].children) && child.slice() || [],\n A: null,\n a: null,\n z: 0,\n m: 0,\n c: 0,\n s: 0,\n t: null,\n i: i\n }).a = child);\n }\n }\n return root1.children[0];\n }\n function firstWalk(v) {\n var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n if (children.length) {\n d3_layout_treeShift(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n vom = d3_layout_treeLeft(vom);\n vop = d3_layout_treeRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !d3_layout_treeRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !d3_layout_treeLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n function sizeNode(node) {\n node.x *= size[0];\n node.y = node.depth * size[1];\n }\n tree.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return tree;\n };\n tree.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null ? sizeNode : null;\n return tree;\n };\n tree.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) == null ? null : sizeNode;\n return tree;\n };\n return d3_layout_hierarchyRebind(tree, hierarchy);\n };\n function d3_layout_treeSeparation(a, b) {\n return a.parent == b.parent ? 1 : 2;\n }\n function d3_layout_treeLeft(v) {\n var children = v.children;\n return children.length ? children[0] : v.t;\n }\n function d3_layout_treeRight(v) {\n var children = v.children, n;\n return (n = children.length) ? children[n - 1] : v.t;\n }\n function d3_layout_treeMove(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n }\n function d3_layout_treeShift(v) {\n var shift = 0, change = 0, children = v.children, i = children.length, w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n }\n function d3_layout_treeAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n }\n d3.layout.cluster = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n function cluster(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var children = node.children;\n if (children && children.length) {\n node.x = d3_layout_clusterX(children);\n node.y = d3_layout_clusterY(children);\n } else {\n node.x = previousNode ? x += separation(node, previousNode) : 0;\n node.y = 0;\n previousNode = node;\n }\n });\n var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n node.x = (node.x - root.x) * size[0];\n node.y = (root.y - node.y) * size[1];\n } : function(node) {\n node.x = (node.x - x0) / (x1 - x0) * size[0];\n node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n });\n return nodes;\n }\n cluster.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return cluster;\n };\n cluster.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null;\n return cluster;\n };\n cluster.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) != null;\n return cluster;\n };\n return d3_layout_hierarchyRebind(cluster, hierarchy);\n };\n function d3_layout_clusterY(children) {\n return 1 + d3.max(children, function(child) {\n return child.y;\n });\n }\n function d3_layout_clusterX(children) {\n return children.reduce(function(x, child) {\n return x + child.x;\n }, 0) / children.length;\n }\n function d3_layout_clusterLeft(node) {\n var children = node.children;\n return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n }\n function d3_layout_clusterRight(node) {\n var children = node.children, n;\n return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n }\n d3.layout.treemap = function() {\n var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n function scale(children, k) {\n var i = -1, n = children.length, child, area;\n while (++i < n) {\n area = (child = children[i]).value * (k < 0 ? 0 : k);\n child.area = isNaN(area) || area <= 0 ? 0 : area;\n }\n }\n function squarify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while ((n = remaining.length) > 0) {\n row.push(child = remaining[n - 1]);\n row.area += child.area;\n if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n remaining.pop();\n best = score;\n } else {\n row.area -= row.pop().area;\n position(row, u, rect, false);\n u = Math.min(rect.dx, rect.dy);\n row.length = row.area = 0;\n best = Infinity;\n }\n }\n if (row.length) {\n position(row, u, rect, true);\n row.length = row.area = 0;\n }\n children.forEach(squarify);\n }\n }\n function stickify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), remaining = children.slice(), child, row = [];\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while (child = remaining.pop()) {\n row.push(child);\n row.area += child.area;\n if (child.z != null) {\n position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n row.length = row.area = 0;\n }\n }\n children.forEach(stickify);\n }\n }\n function worst(row, u) {\n var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n while (++i < n) {\n if (!(r = row[i].area)) continue;\n if (r < rmin) rmin = r;\n if (r > rmax) rmax = r;\n }\n s *= s;\n u *= u;\n return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n }\n function position(row, u, rect, flush) {\n var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n if (u == rect.dx) {\n if (flush || v > rect.dy) v = rect.dy;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dy = v;\n x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n }\n o.z = true;\n o.dx += rect.x + rect.dx - x;\n rect.y += v;\n rect.dy -= v;\n } else {\n if (flush || v > rect.dx) v = rect.dx;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dx = v;\n y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n }\n o.z = false;\n o.dy += rect.y + rect.dy - y;\n rect.x += v;\n rect.dx -= v;\n }\n }\n function treemap(d) {\n var nodes = stickies || hierarchy(d), root = nodes[0];\n root.x = root.y = 0;\n if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n if (stickies) hierarchy.revalue(root);\n scale([ root ], root.dx * root.dy / root.value);\n (stickies ? stickify : squarify)(root);\n if (sticky) stickies = nodes;\n return nodes;\n }\n treemap.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return treemap;\n };\n treemap.padding = function(x) {\n if (!arguments.length) return padding;\n function padFunction(node) {\n var p = x.call(treemap, node, node.depth);\n return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n }\n function padConstant(node) {\n return d3_layout_treemapPad(node, x);\n }\n var type;\n pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n padConstant) : padConstant;\n return treemap;\n };\n treemap.round = function(x) {\n if (!arguments.length) return round != Number;\n round = x ? Math.round : Number;\n return treemap;\n };\n treemap.sticky = function(x) {\n if (!arguments.length) return sticky;\n sticky = x;\n stickies = null;\n return treemap;\n };\n treemap.ratio = function(x) {\n if (!arguments.length) return ratio;\n ratio = x;\n return treemap;\n };\n treemap.mode = function(x) {\n if (!arguments.length) return mode;\n mode = x + \"\";\n return treemap;\n };\n return d3_layout_hierarchyRebind(treemap, hierarchy);\n };\n function d3_layout_treemapPadNull(node) {\n return {\n x: node.x,\n y: node.y,\n dx: node.dx,\n dy: node.dy\n };\n }\n function d3_layout_treemapPad(node, padding) {\n var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n if (dx < 0) {\n x += dx / 2;\n dx = 0;\n }\n if (dy < 0) {\n y += dy / 2;\n dy = 0;\n }\n return {\n x: x,\n y: y,\n dx: dx,\n dy: dy\n };\n }\n d3.random = {\n normal: function(µ, σ) {\n var n = arguments.length;\n if (n < 2) σ = 1;\n if (n < 1) µ = 0;\n return function() {\n var x, y, r;\n do {\n x = Math.random() * 2 - 1;\n y = Math.random() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n };\n },\n logNormal: function() {\n var random = d3.random.normal.apply(d3, arguments);\n return function() {\n return Math.exp(random());\n };\n },\n bates: function(m) {\n var random = d3.random.irwinHall(m);\n return function() {\n return random() / m;\n };\n },\n irwinHall: function(m) {\n return function() {\n for (var s = 0, j = 0; j < m; j++) s += Math.random();\n return s;\n };\n }\n };\n d3.scale = {};\n function d3_scaleExtent(domain) {\n var start = domain[0], stop = domain[domain.length - 1];\n return start < stop ? [ start, stop ] : [ stop, start ];\n }\n function d3_scaleRange(scale) {\n return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n }\n function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n return function(x) {\n return i(u(x));\n };\n }\n function d3_scale_nice(domain, nice) {\n var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n if (x1 < x0) {\n dx = i0, i0 = i1, i1 = dx;\n dx = x0, x0 = x1, x1 = dx;\n }\n domain[i0] = nice.floor(x0);\n domain[i1] = nice.ceil(x1);\n return domain;\n }\n function d3_scale_niceStep(step) {\n return step ? {\n floor: function(x) {\n return Math.floor(x / step) * step;\n },\n ceil: function(x) {\n return Math.ceil(x / step) * step;\n }\n } : d3_scale_niceIdentity;\n }\n var d3_scale_niceIdentity = {\n floor: d3_identity,\n ceil: d3_identity\n };\n function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n if (domain[k] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n while (++j <= k) {\n u.push(uninterpolate(domain[j - 1], domain[j]));\n i.push(interpolate(range[j - 1], range[j]));\n }\n return function(x) {\n var j = d3.bisect(domain, x, 1, k) - 1;\n return i[j](u[j](x));\n };\n }\n d3.scale.linear = function() {\n return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n };\n function d3_scale_linear(domain, range, interpolate, clamp) {\n var output, input;\n function rescale() {\n var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n output = linear(domain, range, uninterpolate, interpolate);\n input = linear(range, domain, uninterpolate, d3_interpolate);\n return scale;\n }\n function scale(x) {\n return output(x);\n }\n scale.invert = function(y) {\n return input(y);\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(Number);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.rangeRound = function(x) {\n return scale.range(x).interpolate(d3_interpolateRound);\n };\n scale.clamp = function(x) {\n if (!arguments.length) return clamp;\n clamp = x;\n return rescale();\n };\n scale.interpolate = function(x) {\n if (!arguments.length) return interpolate;\n interpolate = x;\n return rescale();\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n d3_scale_linearNice(domain, m);\n return rescale();\n };\n scale.copy = function() {\n return d3_scale_linear(domain, range, interpolate, clamp);\n };\n return rescale();\n }\n function d3_scale_linearRebind(scale, linear) {\n return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n }\n function d3_scale_linearNice(domain, m) {\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n return domain;\n }\n function d3_scale_linearTickRange(domain, m) {\n if (m == null) m = 10;\n var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n extent[0] = Math.ceil(extent[0] / step) * step;\n extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n extent[2] = step;\n return extent;\n }\n function d3_scale_linearTicks(domain, m) {\n return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n }\n function d3_scale_linearTickFormat(domain, m, format) {\n var range = d3_scale_linearTickRange(domain, m);\n if (format) {\n var match = d3_format_re.exec(format);\n match.shift();\n if (match[8] === \"s\") {\n var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n match[8] = \"f\";\n format = d3.format(match.join(\"\"));\n return function(d) {\n return format(prefix.scale(d)) + prefix.symbol;\n };\n }\n if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n format = match.join(\"\");\n } else {\n format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n }\n return d3.format(format);\n }\n var d3_scale_linearFormatSignificant = {\n s: 1,\n g: 1,\n p: 1,\n r: 1,\n e: 1\n };\n function d3_scale_linearPrecision(value) {\n return -Math.floor(Math.log(value) / Math.LN10 + .01);\n }\n function d3_scale_linearFormatPrecision(type, range) {\n var p = d3_scale_linearPrecision(range[2]);\n return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n }\n d3.scale.log = function() {\n return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n };\n function d3_scale_log(linear, base, positive, domain) {\n function log(x) {\n return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n }\n function pow(x) {\n return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n }\n function scale(x) {\n return linear(log(x));\n }\n scale.invert = function(x) {\n return pow(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n positive = x[0] >= 0;\n linear.domain((domain = x.map(Number)).map(log));\n return scale;\n };\n scale.base = function(_) {\n if (!arguments.length) return base;\n base = +_;\n linear.domain(domain.map(log));\n return scale;\n };\n scale.nice = function() {\n var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n linear.domain(niced);\n domain = niced.map(pow);\n return scale;\n };\n scale.ticks = function() {\n var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n if (isFinite(j - i)) {\n if (positive) {\n for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n ticks.push(pow(i));\n } else {\n ticks.push(pow(i));\n for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n }\n for (i = 0; ticks[i] < u; i++) {}\n for (j = ticks.length; ticks[j - 1] > v; j--) {}\n ticks = ticks.slice(i, j);\n }\n return ticks;\n };\n scale.tickFormat = function(n, format) {\n if (!arguments.length) return d3_scale_logFormat;\n if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n var k = Math.max(1, base * n / scale.ticks().length);\n return function(d) {\n var i = d / pow(Math.round(log(d)));\n if (i * base < base - .5) i *= base;\n return i <= k ? format(d) : \"\";\n };\n };\n scale.copy = function() {\n return d3_scale_log(linear.copy(), base, positive, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n floor: function(x) {\n return -Math.ceil(-x);\n },\n ceil: function(x) {\n return -Math.floor(-x);\n }\n };\n d3.scale.pow = function() {\n return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n };\n function d3_scale_pow(linear, exponent, domain) {\n var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n function scale(x) {\n return linear(powp(x));\n }\n scale.invert = function(x) {\n return powb(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n linear.domain((domain = x.map(Number)).map(powp));\n return scale;\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n return scale.domain(d3_scale_linearNice(domain, m));\n };\n scale.exponent = function(x) {\n if (!arguments.length) return exponent;\n powp = d3_scale_powPow(exponent = x);\n powb = d3_scale_powPow(1 / exponent);\n linear.domain(domain.map(powp));\n return scale;\n };\n scale.copy = function() {\n return d3_scale_pow(linear.copy(), exponent, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_scale_powPow(e) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n };\n }\n d3.scale.sqrt = function() {\n return d3.scale.pow().exponent(.5);\n };\n d3.scale.ordinal = function() {\n return d3_scale_ordinal([], {\n t: \"range\",\n a: [ [] ]\n });\n };\n function d3_scale_ordinal(domain, ranger) {\n var index, range, rangeBand;\n function scale(x) {\n return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n }\n function steps(start, step) {\n return d3.range(domain.length).map(function(i) {\n return start + step * i;\n });\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = [];\n index = new d3_Map();\n var i = -1, n = x.length, xi;\n while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n return scale[ranger.t].apply(scale, ranger.a);\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n rangeBand = 0;\n ranger = {\n t: \"range\",\n a: arguments\n };\n return scale;\n };\n scale.rangePoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n 0) : (stop - start) / (domain.length - 1 + padding);\n range = steps(start + step * padding / 2, step);\n rangeBand = 0;\n ranger = {\n t: \"rangePoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundPoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n 0) : (stop - start) / (domain.length - 1 + padding) | 0;\n range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n rangeBand = 0;\n ranger = {\n t: \"rangeRoundPoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n range = steps(start + step * outerPadding, step);\n if (reverse) range.reverse();\n rangeBand = step * (1 - padding);\n ranger = {\n t: \"rangeBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n if (reverse) range.reverse();\n rangeBand = Math.round(step * (1 - padding));\n ranger = {\n t: \"rangeRoundBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBand = function() {\n return rangeBand;\n };\n scale.rangeExtent = function() {\n return d3_scaleExtent(ranger.a[0]);\n };\n scale.copy = function() {\n return d3_scale_ordinal(domain, ranger);\n };\n return scale.domain(domain);\n }\n d3.scale.category10 = function() {\n return d3.scale.ordinal().range(d3_category10);\n };\n d3.scale.category20 = function() {\n return d3.scale.ordinal().range(d3_category20);\n };\n d3.scale.category20b = function() {\n return d3.scale.ordinal().range(d3_category20b);\n };\n d3.scale.category20c = function() {\n return d3.scale.ordinal().range(d3_category20c);\n };\n var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n d3.scale.quantile = function() {\n return d3_scale_quantile([], []);\n };\n function d3_scale_quantile(domain, range) {\n var thresholds;\n function rescale() {\n var k = 0, q = range.length;\n thresholds = [];\n while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n return scale;\n }\n function scale(x) {\n if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.quantiles = function() {\n return thresholds;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n };\n scale.copy = function() {\n return d3_scale_quantile(domain, range);\n };\n return rescale();\n }\n d3.scale.quantize = function() {\n return d3_scale_quantize(0, 1, [ 0, 1 ]);\n };\n function d3_scale_quantize(x0, x1, range) {\n var kx, i;\n function scale(x) {\n return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n }\n function rescale() {\n kx = range.length / (x1 - x0);\n i = range.length - 1;\n return scale;\n }\n scale.domain = function(x) {\n if (!arguments.length) return [ x0, x1 ];\n x0 = +x[0];\n x1 = +x[x.length - 1];\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n y = y < 0 ? NaN : y / kx + x0;\n return [ y, y + 1 / kx ];\n };\n scale.copy = function() {\n return d3_scale_quantize(x0, x1, range);\n };\n return rescale();\n }\n d3.scale.threshold = function() {\n return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n };\n function d3_scale_threshold(domain, range) {\n function scale(x) {\n if (x <= x) return range[d3.bisect(domain, x)];\n }\n scale.domain = function(_) {\n if (!arguments.length) return domain;\n domain = _;\n return scale;\n };\n scale.range = function(_) {\n if (!arguments.length) return range;\n range = _;\n return scale;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return [ domain[y - 1], domain[y] ];\n };\n scale.copy = function() {\n return d3_scale_threshold(domain, range);\n };\n return scale;\n }\n d3.scale.identity = function() {\n return d3_scale_identity([ 0, 1 ]);\n };\n function d3_scale_identity(domain) {\n function identity(x) {\n return +x;\n }\n identity.invert = identity;\n identity.domain = identity.range = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(identity);\n return identity;\n };\n identity.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n identity.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n identity.copy = function() {\n return d3_scale_identity(domain);\n };\n return identity;\n }\n d3.svg = {};\n function d3_zero() {\n return 0;\n }\n d3.svg.arc = function() {\n var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n function arc() {\n var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n if (!cw) p1 *= -1;\n if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n }\n if (r1) {\n x0 = r1 * Math.cos(a0 + p1);\n y0 = r1 * Math.sin(a0 + p1);\n x1 = r1 * Math.cos(a1 - p1);\n y1 = r1 * Math.sin(a1 - p1);\n var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n var h1 = (a0 + a1) / 2;\n x0 = r1 * Math.cos(h1);\n y0 = r1 * Math.sin(h1);\n x1 = y1 = null;\n }\n } else {\n x0 = y0 = 0;\n }\n if (r0) {\n x2 = r0 * Math.cos(a1 - p0);\n y2 = r0 * Math.sin(a1 - p0);\n x3 = r0 * Math.cos(a0 + p0);\n y3 = r0 * Math.sin(a0 + p0);\n var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n var h0 = (a0 + a1) / 2;\n x2 = r0 * Math.cos(h0);\n y2 = r0 * Math.sin(h0);\n x3 = y3 = null;\n }\n } else {\n x2 = y2 = 0;\n }\n if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n cr = r0 < r1 ^ cw ? 0 : 1;\n var rc1 = rc, rc0 = rc;\n if (da < π) {\n var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n }\n if (x1 != null) {\n var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n if (rc === rc1) {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n } else {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n }\n if (x3 != null) {\n var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n if (rc === rc0) {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n } else {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n }\n } else {\n path.push(\"L\", x2, \",\", y2);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n path.push(\"L\", x2, \",\", y2);\n if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n }\n path.push(\"Z\");\n return path.join(\"\");\n }\n function circleSegment(r1, cw) {\n return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n }\n arc.innerRadius = function(v) {\n if (!arguments.length) return innerRadius;\n innerRadius = d3_functor(v);\n return arc;\n };\n arc.outerRadius = function(v) {\n if (!arguments.length) return outerRadius;\n outerRadius = d3_functor(v);\n return arc;\n };\n arc.cornerRadius = function(v) {\n if (!arguments.length) return cornerRadius;\n cornerRadius = d3_functor(v);\n return arc;\n };\n arc.padRadius = function(v) {\n if (!arguments.length) return padRadius;\n padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n return arc;\n };\n arc.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return arc;\n };\n arc.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return arc;\n };\n arc.padAngle = function(v) {\n if (!arguments.length) return padAngle;\n padAngle = d3_functor(v);\n return arc;\n };\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n return [ Math.cos(a) * r, Math.sin(a) * r ];\n };\n return arc;\n };\n var d3_svg_arcAuto = \"auto\";\n function d3_svg_arcInnerRadius(d) {\n return d.innerRadius;\n }\n function d3_svg_arcOuterRadius(d) {\n return d.outerRadius;\n }\n function d3_svg_arcStartAngle(d) {\n return d.startAngle;\n }\n function d3_svg_arcEndAngle(d) {\n return d.endAngle;\n }\n function d3_svg_arcPadAngle(d) {\n return d && d.padAngle;\n }\n function d3_svg_arcSweep(x0, y0, x1, y1) {\n return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n }\n function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n }\n function d3_svg_line(projection) {\n var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n function line(data) {\n var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n function segment() {\n segments.push(\"M\", interpolate(projection(points), tension));\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n } else if (points.length) {\n segment();\n points = [];\n }\n }\n if (points.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n line.x = function(_) {\n if (!arguments.length) return x;\n x = _;\n return line;\n };\n line.y = function(_) {\n if (!arguments.length) return y;\n y = _;\n return line;\n };\n line.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return line;\n };\n line.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n return line;\n };\n line.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return line;\n };\n return line;\n }\n d3.svg.line = function() {\n return d3_svg_line(d3_identity);\n };\n var d3_svg_lineInterpolators = d3.map({\n linear: d3_svg_lineLinear,\n \"linear-closed\": d3_svg_lineLinearClosed,\n step: d3_svg_lineStep,\n \"step-before\": d3_svg_lineStepBefore,\n \"step-after\": d3_svg_lineStepAfter,\n basis: d3_svg_lineBasis,\n \"basis-open\": d3_svg_lineBasisOpen,\n \"basis-closed\": d3_svg_lineBasisClosed,\n bundle: d3_svg_lineBundle,\n cardinal: d3_svg_lineCardinal,\n \"cardinal-open\": d3_svg_lineCardinalOpen,\n \"cardinal-closed\": d3_svg_lineCardinalClosed,\n monotone: d3_svg_lineMonotone\n });\n d3_svg_lineInterpolators.forEach(function(key, value) {\n value.key = key;\n value.closed = /-closed$/.test(key);\n });\n function d3_svg_lineLinear(points) {\n return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n }\n function d3_svg_lineLinearClosed(points) {\n return points.join(\"L\") + \"Z\";\n }\n function d3_svg_lineStep(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n if (n > 1) path.push(\"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepBefore(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepAfter(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n return path.join(\"\");\n }\n function d3_svg_lineCardinalOpen(points, tension) {\n return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineCardinalClosed(points, tension) {\n return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n }\n function d3_svg_lineCardinal(points, tension) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineHermite(points, tangents) {\n if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n return d3_svg_lineLinear(points);\n }\n var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n if (quad) {\n path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n p0 = points[1];\n pi = 2;\n }\n if (tangents.length > 1) {\n t = tangents[1];\n p = points[pi];\n pi++;\n path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n for (var i = 2; i < tangents.length; i++, pi++) {\n p = points[pi];\n t = tangents[i];\n path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n }\n }\n if (quad) {\n var lp = points[pi];\n path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n }\n return path;\n }\n function d3_svg_lineCardinalTangents(points, tension) {\n var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n while (++i < n) {\n p0 = p1;\n p1 = p2;\n p2 = points[i];\n tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n }\n return tangents;\n }\n function d3_svg_lineBasis(points) {\n if (points.length < 3) return d3_svg_lineLinear(points);\n var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n points.push(points[n - 1]);\n while (++i <= n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n points.pop();\n path.push(\"L\", pi);\n return path.join(\"\");\n }\n function d3_svg_lineBasisOpen(points) {\n if (points.length < 4) return d3_svg_lineLinear(points);\n var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n while (++i < 3) {\n pi = points[i];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n --i;\n while (++i < n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBasisClosed(points) {\n var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n while (++i < 4) {\n pi = points[i % n];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n --i;\n while (++i < m) {\n pi = points[i % n];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBundle(points, tension) {\n var n = points.length - 1;\n if (n) {\n var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n while (++i <= n) {\n p = points[i];\n t = i / n;\n p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n }\n }\n return d3_svg_lineBasis(points);\n }\n function d3_svg_lineDot4(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n }\n var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n function d3_svg_lineBasisBezier(path, x, y) {\n path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n }\n function d3_svg_lineSlope(p0, p1) {\n return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n }\n function d3_svg_lineFiniteDifferences(points) {\n var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n while (++i < j) {\n m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n }\n m[i] = d;\n return m;\n }\n function d3_svg_lineMonotoneTangents(points) {\n var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n while (++i < j) {\n d = d3_svg_lineSlope(points[i], points[i + 1]);\n if (abs(d) < ε) {\n m[i] = m[i + 1] = 0;\n } else {\n a = m[i] / d;\n b = m[i + 1] / d;\n s = a * a + b * b;\n if (s > 9) {\n s = d * 3 / Math.sqrt(s);\n m[i] = s * a;\n m[i + 1] = s * b;\n }\n }\n }\n i = -1;\n while (++i <= j) {\n s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n tangents.push([ s || 0, m[i] * s || 0 ]);\n }\n return tangents;\n }\n function d3_svg_lineMonotone(points) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n }\n d3.svg.line.radial = function() {\n var line = d3_svg_line(d3_svg_lineRadial);\n line.radius = line.x, delete line.x;\n line.angle = line.y, delete line.y;\n return line;\n };\n function d3_svg_lineRadial(points) {\n var point, i = -1, n = points.length, r, a;\n while (++i < n) {\n point = points[i];\n r = point[0];\n a = point[1] - halfπ;\n point[0] = r * Math.cos(a);\n point[1] = r * Math.sin(a);\n }\n return points;\n }\n function d3_svg_area(projection) {\n var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n function area(data) {\n var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n return x;\n } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n return y;\n } : d3_functor(y1), x, y;\n function segment() {\n segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n } else if (points0.length) {\n segment();\n points0 = [];\n points1 = [];\n }\n }\n if (points0.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n area.x = function(_) {\n if (!arguments.length) return x1;\n x0 = x1 = _;\n return area;\n };\n area.x0 = function(_) {\n if (!arguments.length) return x0;\n x0 = _;\n return area;\n };\n area.x1 = function(_) {\n if (!arguments.length) return x1;\n x1 = _;\n return area;\n };\n area.y = function(_) {\n if (!arguments.length) return y1;\n y0 = y1 = _;\n return area;\n };\n area.y0 = function(_) {\n if (!arguments.length) return y0;\n y0 = _;\n return area;\n };\n area.y1 = function(_) {\n if (!arguments.length) return y1;\n y1 = _;\n return area;\n };\n area.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return area;\n };\n area.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n interpolateReverse = interpolate.reverse || interpolate;\n L = interpolate.closed ? \"M\" : \"L\";\n return area;\n };\n area.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return area;\n };\n return area;\n }\n d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n d3.svg.area = function() {\n return d3_svg_area(d3_identity);\n };\n d3.svg.area.radial = function() {\n var area = d3_svg_area(d3_svg_lineRadial);\n area.radius = area.x, delete area.x;\n area.innerRadius = area.x0, delete area.x0;\n area.outerRadius = area.x1, delete area.x1;\n area.angle = area.y, delete area.y;\n area.startAngle = area.y0, delete area.y0;\n area.endAngle = area.y1, delete area.y1;\n return area;\n };\n d3.svg.chord = function() {\n var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n function chord(d, i) {\n var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n // ONTO Patch!!! See WB-842\n // Do not render the arcs when their are too close to each other as this results into a whole circle\n var renderArc = function(sGr) {\n return !(Math.abs(sGr.p0[0]*1000 - sGr.p1[0]*1000) < 1 && Math.abs(sGr.p0[1]*1000 - sGr.p1[1]*1000) < 1);\n }\n return \"M\" + s.p0 + (renderArc(s) ? arc(s.r, s.p1, s.a1 - s.a0) : \"\") + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + (renderArc(t) ? arc(t.r, t.p1, t.a1 - t.a0) : \"\") + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n }\n function subgroup(self, f, d, i) {\n var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n return {\n r: r,\n a0: a0,\n a1: a1,\n p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n };\n }\n function equals(a, b) {\n return a.a0 == b.a0 && a.a1 == b.a1;\n }\n function arc(r, p, a) {\n return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n }\n function curve(r0, p0, r1, p1) {\n return \"Q 0,0 \" + p1;\n }\n chord.radius = function(v) {\n if (!arguments.length) return radius;\n radius = d3_functor(v);\n return chord;\n };\n chord.source = function(v) {\n if (!arguments.length) return source;\n source = d3_functor(v);\n return chord;\n };\n chord.target = function(v) {\n if (!arguments.length) return target;\n target = d3_functor(v);\n return chord;\n };\n chord.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return chord;\n };\n chord.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return chord;\n };\n return chord;\n };\n function d3_svg_chordRadius(d) {\n return d.radius;\n }\n d3.svg.diagonal = function() {\n var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n function diagonal(d, i) {\n var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n x: p0.x,\n y: m\n }, {\n x: p3.x,\n y: m\n }, p3 ];\n p = p.map(projection);\n return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n }\n diagonal.source = function(x) {\n if (!arguments.length) return source;\n source = d3_functor(x);\n return diagonal;\n };\n diagonal.target = function(x) {\n if (!arguments.length) return target;\n target = d3_functor(x);\n return diagonal;\n };\n diagonal.projection = function(x) {\n if (!arguments.length) return projection;\n projection = x;\n return diagonal;\n };\n return diagonal;\n };\n function d3_svg_diagonalProjection(d) {\n return [ d.x, d.y ];\n }\n d3.svg.diagonal.radial = function() {\n var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n diagonal.projection = function(x) {\n return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n };\n return diagonal;\n };\n function d3_svg_diagonalRadialProjection(projection) {\n return function() {\n var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n return [ r * Math.cos(a), r * Math.sin(a) ];\n };\n }\n d3.svg.symbol = function() {\n var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n function symbol(d, i) {\n return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n }\n symbol.type = function(x) {\n if (!arguments.length) return type;\n type = d3_functor(x);\n return symbol;\n };\n symbol.size = function(x) {\n if (!arguments.length) return size;\n size = d3_functor(x);\n return symbol;\n };\n return symbol;\n };\n function d3_svg_symbolSize() {\n return 64;\n }\n function d3_svg_symbolType() {\n return \"circle\";\n }\n function d3_svg_symbolCircle(size) {\n var r = Math.sqrt(size / π);\n return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n }\n var d3_svg_symbols = d3.map({\n circle: d3_svg_symbolCircle,\n cross: function(size) {\n var r = Math.sqrt(size / 5) / 2;\n return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n },\n diamond: function(size) {\n var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n },\n square: function(size) {\n var r = Math.sqrt(size) / 2;\n return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n },\n \"triangle-down\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n },\n \"triangle-up\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n }\n });\n d3.svg.symbolTypes = d3_svg_symbols.keys();\n var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n d3_selectionPrototype.transition = function(name) {\n var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n time: Date.now(),\n ease: d3_ease_cubicInOut,\n delay: 0,\n duration: 250\n };\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_selectionPrototype.interrupt = function(name) {\n return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n };\n var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n function d3_selection_interruptNS(ns) {\n return function() {\n var lock, activeId, active;\n if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n active.timer.c = null;\n active.timer.t = NaN;\n if (--lock.count) delete lock[activeId]; else delete this[ns];\n lock.active += .5;\n active.event && active.event.interrupt.call(this, this.__data__, active.index);\n }\n };\n }\n function d3_transition(groups, ns, id) {\n d3_subclass(groups, d3_transitionPrototype);\n groups.namespace = ns;\n groups.id = id;\n return groups;\n }\n var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n d3_transitionPrototype.call = d3_selectionPrototype.call;\n d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n d3_transitionPrototype.node = d3_selectionPrototype.node;\n d3_transitionPrototype.size = d3_selectionPrototype.size;\n d3.transition = function(selection, name) {\n return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n };\n d3.transition.prototype = d3_transitionPrototype;\n d3_transitionPrototype.select = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n subgroup.push(subnode);\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.selectAll = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n transition = node[ns][id];\n subnodes = selector.call(node, node.__data__, i, j);\n subgroups.push(subgroup = []);\n for (var k = -1, o = subnodes.length; ++k < o; ) {\n if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n subgroup.push(subnode);\n }\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_transition(subgroups, this.namespace, this.id);\n };\n d3_transitionPrototype.tween = function(name, tween) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n return d3_selection_each(this, tween == null ? function(node) {\n node[ns][id].tween.remove(name);\n } : function(node) {\n node[ns][id].tween.set(name, tween);\n });\n };\n function d3_transition_tween(groups, name, value, tween) {\n var id = groups.id, ns = groups.namespace;\n return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n } : (value = tween(value), function(node) {\n node[ns][id].tween.set(name, value);\n }));\n }\n d3_transitionPrototype.attr = function(nameNS, value) {\n if (arguments.length < 2) {\n for (value in nameNS) this.attr(value, nameNS[value]);\n return this;\n }\n var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrTween(b) {\n return b == null ? attrNull : (b += \"\", function() {\n var a = this.getAttribute(name), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttribute(name, i(t));\n });\n });\n }\n function attrTweenNS(b) {\n return b == null ? attrNullNS : (b += \"\", function() {\n var a = this.getAttributeNS(name.space, name.local), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttributeNS(name.space, name.local, i(t));\n });\n });\n }\n return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.attrTween = function(nameNS, tween) {\n var name = d3.ns.qualify(nameNS);\n function attrTween(d, i) {\n var f = tween.call(this, d, i, this.getAttribute(name));\n return f && function(t) {\n this.setAttribute(name, f(t));\n };\n }\n function attrTweenNS(d, i) {\n var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n return f && function(t) {\n this.setAttributeNS(name.space, name.local, f(t));\n };\n }\n return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.style(priority, name[priority], value);\n return this;\n }\n priority = \"\";\n }\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleString(b) {\n return b == null ? styleNull : (b += \"\", function() {\n var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n return a !== b && (i = d3_interpolate(a, b), function(t) {\n this.style.setProperty(name, i(t), priority);\n });\n });\n }\n return d3_transition_tween(this, \"style.\" + name, value, styleString);\n };\n d3_transitionPrototype.styleTween = function(name, tween, priority) {\n if (arguments.length < 3) priority = \"\";\n function styleTween(d, i) {\n var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n return f && function(t) {\n this.style.setProperty(name, f(t), priority);\n };\n }\n return this.tween(\"style.\" + name, styleTween);\n };\n d3_transitionPrototype.text = function(value) {\n return d3_transition_tween(this, \"text\", value, d3_transition_text);\n };\n function d3_transition_text(b) {\n if (b == null) b = \"\";\n return function() {\n this.textContent = b;\n };\n }\n d3_transitionPrototype.remove = function() {\n var ns = this.namespace;\n return this.each(\"end.transition\", function() {\n var p;\n if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n });\n };\n d3_transitionPrototype.ease = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].ease;\n if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n return d3_selection_each(this, function(node) {\n node[ns][id].ease = value;\n });\n };\n d3_transitionPrototype.delay = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].delay;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].delay = +value.call(node, node.__data__, i, j);\n } : (value = +value, function(node) {\n node[ns][id].delay = value;\n }));\n };\n d3_transitionPrototype.duration = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].duration;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n } : (value = Math.max(1, value), function(node) {\n node[ns][id].duration = value;\n }));\n };\n d3_transitionPrototype.each = function(type, listener) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) {\n var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n try {\n d3_transitionInheritId = id;\n d3_selection_each(this, function(node, i, j) {\n d3_transitionInherit = node[ns][id];\n type.call(node, node.__data__, i, j);\n });\n } finally {\n d3_transitionInherit = inherit;\n d3_transitionInheritId = inheritId;\n }\n } else {\n d3_selection_each(this, function(node) {\n var transition = node[ns][id];\n (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n });\n }\n return this;\n };\n d3_transitionPrototype.transition = function() {\n var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if (node = group[i]) {\n transition = node[ns][id0];\n d3_transitionNode(node, i, ns, id1, {\n time: transition.time,\n ease: transition.ease,\n delay: transition.delay + transition.duration,\n duration: transition.duration\n });\n }\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id1);\n };\n function d3_transitionNamespace(name) {\n return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n }\n function d3_transitionNode(node, i, ns, id, inherit) {\n var lock = node[ns] || (node[ns] = {\n active: 0,\n count: 0\n }), transition = lock[id], time, timer, duration, ease, tweens;\n function schedule(elapsed) {\n var delay = transition.delay;\n timer.t = delay + time;\n if (delay <= elapsed) return start(elapsed - delay);\n timer.c = start;\n }\n function start(elapsed) {\n var activeId = lock.active, active = lock[activeId];\n if (active) {\n active.timer.c = null;\n active.timer.t = NaN;\n --lock.count;\n delete lock[activeId];\n active.event && active.event.interrupt.call(node, node.__data__, active.index);\n }\n for (var cancelId in lock) {\n if (+cancelId < id) {\n var cancel = lock[cancelId];\n cancel.timer.c = null;\n cancel.timer.t = NaN;\n --lock.count;\n delete lock[cancelId];\n }\n }\n timer.c = tick;\n d3_timer(function() {\n if (timer.c && tick(elapsed || 1)) {\n timer.c = null;\n timer.t = NaN;\n }\n return 1;\n }, 0, time);\n lock.active = id;\n transition.event && transition.event.start.call(node, node.__data__, i);\n tweens = [];\n transition.tween.forEach(function(key, value) {\n if (value = value.call(node, node.__data__, i)) {\n tweens.push(value);\n }\n });\n ease = transition.ease;\n duration = transition.duration;\n }\n function tick(elapsed) {\n var t = elapsed / duration, e = ease(t), n = tweens.length;\n while (n > 0) {\n tweens[--n].call(node, e);\n }\n if (t >= 1) {\n transition.event && transition.event.end.call(node, node.__data__, i);\n if (--lock.count) delete lock[id]; else delete node[ns];\n return 1;\n }\n }\n if (!transition) {\n time = inherit.time;\n timer = d3_timer(schedule, 0, time);\n transition = lock[id] = {\n tween: new d3_Map(),\n time: time,\n timer: timer,\n delay: inherit.delay,\n duration: inherit.duration,\n ease: inherit.ease,\n index: i\n };\n inherit = null;\n ++lock.count;\n }\n }\n d3.svg.axis = function() {\n var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n function axis(g) {\n g.each(function() {\n var g = d3.select(this);\n var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n d3.transition(path));\n tickEnter.append(\"line\");\n tickEnter.append(\"text\");\n var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n if (orient === \"bottom\" || orient === \"top\") {\n tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n } else {\n tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n }\n lineEnter.attr(y2, sign * innerTickSize);\n textEnter.attr(y1, sign * tickSpacing);\n lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n if (scale1.rangeBand) {\n var x = scale1, dx = x.rangeBand() / 2;\n scale0 = scale1 = function(d) {\n return x(d) + dx;\n };\n } else if (scale0.rangeBand) {\n scale0 = scale1;\n } else {\n tickExit.call(tickTransform, scale1, scale0);\n }\n tickEnter.call(tickTransform, scale0, scale1);\n tickUpdate.call(tickTransform, scale1, scale1);\n });\n }\n axis.scale = function(x) {\n if (!arguments.length) return scale;\n scale = x;\n return axis;\n };\n axis.orient = function(x) {\n if (!arguments.length) return orient;\n orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n return axis;\n };\n axis.ticks = function() {\n if (!arguments.length) return tickArguments_;\n tickArguments_ = d3_array(arguments);\n return axis;\n };\n axis.tickValues = function(x) {\n if (!arguments.length) return tickValues;\n tickValues = x;\n return axis;\n };\n axis.tickFormat = function(x) {\n if (!arguments.length) return tickFormat_;\n tickFormat_ = x;\n return axis;\n };\n axis.tickSize = function(x) {\n var n = arguments.length;\n if (!n) return innerTickSize;\n innerTickSize = +x;\n outerTickSize = +arguments[n - 1];\n return axis;\n };\n axis.innerTickSize = function(x) {\n if (!arguments.length) return innerTickSize;\n innerTickSize = +x;\n return axis;\n };\n axis.outerTickSize = function(x) {\n if (!arguments.length) return outerTickSize;\n outerTickSize = +x;\n return axis;\n };\n axis.tickPadding = function(x) {\n if (!arguments.length) return tickPadding;\n tickPadding = +x;\n return axis;\n };\n axis.tickSubdivide = function() {\n return arguments.length && axis;\n };\n return axis;\n };\n var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n top: 1,\n right: 1,\n bottom: 1,\n left: 1\n };\n function d3_svg_axisX(selection, x0, x1) {\n selection.attr(\"transform\", function(d) {\n var v0 = x0(d);\n return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n });\n }\n function d3_svg_axisY(selection, y0, y1) {\n selection.attr(\"transform\", function(d) {\n var v0 = y0(d);\n return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n });\n }\n d3.svg.brush = function() {\n var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n function brush(g) {\n g.each(function() {\n var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n var background = g.selectAll(\".background\").data([ 0 ]);\n background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n resize.exit().remove();\n resize.enter().append(\"g\").attr(\"class\", function(d) {\n return \"resize \" + d;\n }).style(\"cursor\", function(d) {\n return d3_svg_brushCursor[d];\n }).append(\"rect\").attr(\"x\", function(d) {\n return /[ew]$/.test(d) ? -3 : null;\n }).attr(\"y\", function(d) {\n return /^[ns]/.test(d) ? -3 : null;\n }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n resize.style(\"display\", brush.empty() ? \"none\" : null);\n var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n if (x) {\n range = d3_scaleRange(x);\n backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n redrawX(gUpdate);\n }\n if (y) {\n range = d3_scaleRange(y);\n backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n redrawY(gUpdate);\n }\n redraw(gUpdate);\n });\n }\n brush.event = function(g) {\n g.each(function() {\n var event_ = event.of(this, arguments), extent1 = {\n x: xExtent,\n y: yExtent,\n i: xExtentDomain,\n j: yExtentDomain\n }, extent0 = this.__chart__ || extent1;\n this.__chart__ = extent1;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.brush\", function() {\n xExtentDomain = extent0.i;\n yExtentDomain = extent0.j;\n xExtent = extent0.x;\n yExtent = extent0.y;\n event_({\n type: \"brushstart\"\n });\n }).tween(\"brush:brush\", function() {\n var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n xExtentDomain = yExtentDomain = null;\n return function(t) {\n xExtent = extent1.x = xi(t);\n yExtent = extent1.y = yi(t);\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n };\n }).each(\"end.brush\", function() {\n xExtentDomain = extent1.i;\n yExtentDomain = extent1.j;\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n });\n } else {\n event_({\n type: \"brushstart\"\n });\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n }\n });\n };\n function redraw(g) {\n g.selectAll(\".resize\").attr(\"transform\", function(d) {\n return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n });\n }\n function redrawX(g) {\n g.select(\".extent\").attr(\"x\", xExtent[0]);\n g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n }\n function redrawY(g) {\n g.select(\".extent\").attr(\"y\", yExtent[0]);\n g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n }\n function brushstart() {\n var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n if (d3.event.changedTouches) {\n w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n } else {\n w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n }\n g.interrupt().selectAll(\"*\").interrupt();\n if (dragging) {\n origin[0] = xExtent[0] - origin[0];\n origin[1] = yExtent[0] - origin[1];\n } else if (resizing) {\n var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n origin[0] = xExtent[ex];\n origin[1] = yExtent[ey];\n } else if (d3.event.altKey) center = origin.slice();\n g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n event_({\n type: \"brushstart\"\n });\n brushmove();\n function keydown() {\n if (d3.event.keyCode == 32) {\n if (!dragging) {\n center = null;\n origin[0] -= xExtent[1];\n origin[1] -= yExtent[1];\n dragging = 2;\n }\n d3_eventPreventDefault();\n }\n }\n function keyup() {\n if (d3.event.keyCode == 32 && dragging == 2) {\n origin[0] += xExtent[1];\n origin[1] += yExtent[1];\n dragging = 0;\n d3_eventPreventDefault();\n }\n }\n function brushmove() {\n var point = d3.mouse(target), moved = false;\n if (offset) {\n point[0] += offset[0];\n point[1] += offset[1];\n }\n if (!dragging) {\n if (d3.event.altKey) {\n if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n origin[0] = xExtent[+(point[0] < center[0])];\n origin[1] = yExtent[+(point[1] < center[1])];\n } else center = null;\n }\n if (resizingX && move1(point, x, 0)) {\n redrawX(g);\n moved = true;\n }\n if (resizingY && move1(point, y, 1)) {\n redrawY(g);\n moved = true;\n }\n if (moved) {\n redraw(g);\n event_({\n type: \"brush\",\n mode: dragging ? \"move\" : \"resize\"\n });\n }\n }\n function move1(point, scale, i) {\n var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n if (dragging) {\n r0 -= position;\n r1 -= size + position;\n }\n min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n if (dragging) {\n max = (min += position) + size;\n } else {\n if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n if (position < min) {\n max = min;\n min = position;\n } else {\n max = position;\n }\n }\n if (extent[0] != min || extent[1] != max) {\n if (i) yExtentDomain = null; else xExtentDomain = null;\n extent[0] = min;\n extent[1] = max;\n return true;\n }\n }\n function brushend() {\n brushmove();\n g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n d3.select(\"body\").style(\"cursor\", null);\n w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n dragRestore();\n event_({\n type: \"brushend\"\n });\n }\n }\n brush.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.clamp = function(z) {\n if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n return brush;\n };\n brush.extent = function(z) {\n var x0, x1, y0, y1, t;\n if (!arguments.length) {\n if (x) {\n if (xExtentDomain) {\n x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n } else {\n x0 = xExtent[0], x1 = xExtent[1];\n if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n }\n }\n if (y) {\n if (yExtentDomain) {\n y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n } else {\n y0 = yExtent[0], y1 = yExtent[1];\n if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n }\n }\n return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n }\n if (x) {\n x0 = z[0], x1 = z[1];\n if (y) x0 = x0[0], x1 = x1[0];\n xExtentDomain = [ x0, x1 ];\n if (x.invert) x0 = x(x0), x1 = x(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n }\n if (y) {\n y0 = z[0], y1 = z[1];\n if (x) y0 = y0[1], y1 = y1[1];\n yExtentDomain = [ y0, y1 ];\n if (y.invert) y0 = y(y0), y1 = y(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n }\n return brush;\n };\n brush.clear = function() {\n if (!brush.empty()) {\n xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n xExtentDomain = yExtentDomain = null;\n }\n return brush;\n };\n brush.empty = function() {\n return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n };\n return d3.rebind(brush, event, \"on\");\n };\n var d3_svg_brushCursor = {\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n };\n var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n var d3_time_formatUtc = d3_time_format.utc;\n var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n function d3_time_formatIsoNative(date) {\n return date.toISOString();\n }\n d3_time_formatIsoNative.parse = function(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n };\n d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n d3_time.second = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 1e3) * 1e3);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n }, function(date) {\n return date.getSeconds();\n });\n d3_time.seconds = d3_time.second.range;\n d3_time.seconds.utc = d3_time.second.utc.range;\n d3_time.minute = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 6e4) * 6e4);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n }, function(date) {\n return date.getMinutes();\n });\n d3_time.minutes = d3_time.minute.range;\n d3_time.minutes.utc = d3_time.minute.utc.range;\n d3_time.hour = d3_time_interval(function(date) {\n var timezone = date.getTimezoneOffset() / 60;\n return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n }, function(date) {\n return date.getHours();\n });\n d3_time.hours = d3_time.hour.range;\n d3_time.hours.utc = d3_time.hour.utc.range;\n d3_time.month = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setDate(1);\n return date;\n }, function(date, offset) {\n date.setMonth(date.getMonth() + offset);\n }, function(date) {\n return date.getMonth();\n });\n d3_time.months = d3_time.month.range;\n d3_time.months.utc = d3_time.month.utc.range;\n function d3_time_scale(linear, methods, format) {\n function scale(x) {\n return linear(x);\n }\n scale.invert = function(x) {\n return d3_time_scaleDate(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n linear.domain(x);\n return scale;\n };\n function tickMethod(extent, count) {\n var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n return d / 31536e6;\n }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n }\n scale.nice = function(interval, skip) {\n var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n if (method) interval = method[0], skip = method[1];\n function skipped(date) {\n return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n }\n return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n floor: function(date) {\n while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n return date;\n },\n ceil: function(date) {\n while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n return date;\n }\n } : interval));\n };\n scale.ticks = function(interval, skip) {\n var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n range: interval\n }, skip ];\n if (method) interval = method[0], skip = method[1];\n return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n };\n scale.tickFormat = function() {\n return format;\n };\n scale.copy = function() {\n return d3_time_scale(linear.copy(), methods, format);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_time_scaleDate(t) {\n return new Date(t);\n }\n var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n return d.getMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getHours();\n } ], [ \"%a %d\", function(d) {\n return d.getDay() && d.getDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getMonth();\n } ], [ \"%Y\", d3_true ] ]);\n var d3_time_scaleMilliseconds = {\n range: function(start, stop, step) {\n return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n },\n floor: d3_identity,\n ceil: d3_identity\n };\n d3_time_scaleLocalMethods.year = d3_time.year;\n d3_time.scale = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n };\n var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n return [ m[0].utc, m[1] ];\n });\n var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n return d.getUTCMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getUTCSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getUTCMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getUTCHours();\n } ], [ \"%a %d\", function(d) {\n return d.getUTCDay() && d.getUTCDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getUTCDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getUTCMonth();\n } ], [ \"%Y\", d3_true ] ]);\n d3_time_scaleUtcMethods.year = d3_time.year.utc;\n d3_time.scale.utc = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n };\n d3.text = d3_xhrType(function(request) {\n return request.responseText;\n });\n d3.json = function(url, callback) {\n return d3_xhr(url, \"application/json\", d3_json, callback);\n };\n function d3_json(request) {\n return JSON.parse(request.responseText);\n }\n d3.html = function(url, callback) {\n return d3_xhr(url, \"text/html\", d3_html, callback);\n };\n function d3_html(request) {\n var range = d3_document.createRange();\n range.selectNode(d3_document.body);\n return range.createContextualFragment(request.responseText);\n }\n d3.xml = d3_xhrType(function(request) {\n return request.responseXML;\n });\n if (typeof define === \"function\" && define.amd) this.d3 = d3, define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();","var CirclePacking = CirclePacking || {};\n\nCirclePacking.SingleChild = function () {\n /*\n Functions that enable single child circles to display properly, see\n http://stackoverflow.com/questions/22307486/d3-js-packed-circle-layout-how-to-adjust-child-radius\n */\n function addPlaceholders(node, first) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n var child = node.children[i];\n addPlaceholders(child);\n }\n\n if (node.children.length === 1) {\n var placeholderSize = node.size * 1.2;\n if (first) {\n placeholderSize = node.children[0].size * 0.1;\n }\n node.children.push({\n name: 'placeholder', size: placeholderSize,\n // children: []\n });\n }\n }\n }\n\n function removePlaceholders(nodes) {\n for (var i = nodes.length - 1; i >= 0; i--) {\n var node = nodes[i];\n\n if (node.name === 'placeholder') {\n nodes.splice(i, 1);\n } else {\n if (node.children) {\n removePlaceholders(node.children);\n }\n }\n }\n }\n\n function centerNodes(nodes) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n\n if (node.children) {\n if (node.children.length === 1) {\n var offset = node.x - node.children[0].x;\n node.children[0].x += offset;\n reposition(node.children[0], offset);\n }\n }\n }\n\n function reposition(node, offset) {\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].x += offset;\n reposition(node.children[i], offset);\n }\n }\n }\n }\n\n function makePositionsRelativeToZero(nodes) {\n //use this to have vis centered at 0,0,0 (easier for positioning)\n var offsetX = nodes[0].x;\n var offsetY = nodes[0].y;\n\n for (var i = 0; i < nodes.length; i++) {\n\n var node = nodes[i];\n\n node.x -= offsetX;\n node.y -= offsetY;\n }\n }\n\n return {\n addPlaceholders: addPlaceholders,\n removePlaceholders: removePlaceholders,\n centerNodes: centerNodes,\n makePositionsRelativeToZero: makePositionsRelativeToZero\n }\n}();\n\nexport default CirclePacking;\n","/*\n * angucomplete-alt\n * Autocomplete directive for AngularJS\n * This is a fork of Daryl Rowland's angucomplete with some extra features.\n * By Hidenari Nozaki\n */\n\n/*! Copyright (c) 2014 Hidenari Nozaki and contributors | Licensed under the MIT license */\n\n(function (root, factory) {\n 'use strict';\n // if (typeof module !== 'undefined' && module.exports) {\n // CommonJS\n // module.exports = factory(require('angular'));\n // } else if (typeof define === 'function' && define.amd) {\n // AMD\n // define(['angular'], factory);\n // } else {\n // Global Variables\n factory(root.angular);\n // }\n}(window, function (angular) {\n 'use strict';\n\n angular.module('angucomplete-alt', []).directive('angucompleteAlt', ['$q', '$parse', '$http', '$sce', '$timeout', '$templateCache', '$interpolate', function ($q, $parse, $http, $sce, $timeout, $templateCache, $interpolate) {\n // keyboard events\n var KEY_DW = 40;\n var KEY_RT = 39;\n var KEY_UP = 38;\n var KEY_LF = 37;\n var KEY_ES = 27;\n var KEY_EN = 13;\n var KEY_TAB = 9;\n\n var MIN_LENGTH = 3;\n var MAX_LENGTH = 524288; // the default max length per the html maxlength attribute\n var PAUSE = 500;\n var BLUR_TIMEOUT = 200;\n\n // string constants\n var REQUIRED_CLASS = 'autocomplete-required';\n var TEXT_SEARCHING = 'Searching...';\n var TEXT_NORESULTS = 'No results found';\n var TEMPLATE_URL = '/angucomplete-alt/index.html';\n\n // Set the default template for this directive\n $templateCache.put(TEMPLATE_URL,\n '<div class=\"angucomplete-holder\" ng-class=\"{\\'angucomplete-dropdown-visible\\': showDropdown}\">' +\n ' <input id=\"{{id}}_value\" name=\"{{inputName}}\" tabindex=\"{{fieldTabindex}}\" ng-class=\"{\\'angucomplete-input-not-empty\\': notEmpty}\" ng-model=\"searchStr\" ng-disabled=\"disableInput\" type=\"{{inputType}}\" placeholder=\"{{placeholder}}\" maxlength=\"{{maxlength}}\" ng-focus=\"onFocusHandler()\" class=\"{{inputClass}}\" ng-focus=\"resetHideResults()\" ng-blur=\"hideResults($event)\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" ng-change=\"inputChangeHandler(searchStr)\"/>' +\n ' <div id=\"{{id}}_dropdown\" class=\"angucomplete-dropdown\" ng-show=\"showDropdown\">' +\n ' <div class=\"angucomplete-searching\" ng-show=\"searching\" ng-bind=\"textSearching\"></div>' +\n ' <div class=\"angucomplete-searching\" ng-show=\"!searching && (!results || results.length == 0)\" ng-bind=\"textNoResults\"></div>' +\n ' <div class=\"angucomplete-row\" ng-repeat=\"result in results\" ng-click=\"selectResult(result)\" ng-mouseenter=\"hoverRow($index)\" ng-class=\"{\\'angucomplete-selected-row\\': $index == currentIndex}\">' +\n ' <div ng-if=\"imageField\" class=\"angucomplete-image-holder\">' +\n ' <img ng-if=\"result.image && result.image != \\'\\'\" ng-src=\"{{result.image}}\" class=\"angucomplete-image\"/>' +\n ' <div ng-if=\"!result.image && result.image != \\'\\'\" class=\"angucomplete-image-default\"></div>' +\n ' </div>' +\n ' <div class=\"angucomplete-title\" ng-if=\"matchClass\" ng-bind-html=\"result.title\"></div>' +\n ' <div class=\"angucomplete-title\" ng-if=\"!matchClass\">{{ result.title }}</div>' +\n ' <div ng-if=\"matchClass && result.description && result.description != \\'\\'\" class=\"angucomplete-description\" ng-bind-html=\"result.description\"></div>' +\n ' <div ng-if=\"!matchClass && result.description && result.description != \\'\\'\" class=\"angucomplete-description\">{{result.description}}</div>' +\n ' </div>' +\n ' </div>' +\n '</div>'\n );\n\n function link(scope, elem, attrs, ctrl) {\n var inputField = elem.find('input');\n var minlength = MIN_LENGTH;\n var searchTimer = null;\n var hideTimer;\n var requiredClassName = REQUIRED_CLASS;\n var responseFormatter;\n var validState = null;\n var httpCanceller = null;\n var dd = elem[0].querySelector('.angucomplete-dropdown');\n var isScrollOn = false;\n var mousedownOn = null;\n var unbindInitialValue;\n var displaySearching;\n var displayNoResults;\n\n elem.on('mousedown', function (event) {\n if (event.target.id) {\n mousedownOn = event.target.id;\n if (mousedownOn === scope.id + '_dropdown') {\n document.body.addEventListener('click', clickoutHandlerForDropdown);\n }\n }\n else {\n mousedownOn = event.target.className;\n }\n });\n\n scope.currentIndex = scope.focusFirst ? 0 : null;\n scope.searching = false;\n unbindInitialValue = scope.$watch('initialValue', function (newval) {\n if (newval) {\n // remove scope listener\n unbindInitialValue();\n // change input\n handleInputChange(newval, true);\n }\n });\n\n scope.$watch('fieldRequired', function (newval, oldval) {\n if (newval !== oldval) {\n if (!newval) {\n ctrl[scope.inputName].$setValidity(requiredClassName, true);\n }\n else if (!validState || scope.currentIndex === -1) {\n handleRequired(false);\n }\n else {\n handleRequired(true);\n }\n }\n });\n\n scope.$on('angucomplete-alt:clearInput', function (event, elementId) {\n if (!elementId || elementId === scope.id) {\n scope.searchStr = null;\n callOrAssign();\n handleRequired(false);\n clearResults();\n }\n });\n\n scope.$on('angucomplete-alt:changeInput', function (event, elementId, newval) {\n if (!!elementId && elementId === scope.id) {\n handleInputChange(newval);\n }\n });\n\n function handleInputChange(newval, initial) {\n if (newval) {\n if (typeof newval === 'object') {\n scope.searchStr = extractTitle(newval);\n callOrAssign({originalObject: newval});\n } else if (typeof newval === 'string' && newval.length > 0) {\n scope.searchStr = newval;\n } else {\n if (console && console.error) {\n console.error('Tried to set ' + (!!initial ? 'initial' : '') + ' value of angucomplete to', newval, 'which is an invalid value');\n }\n }\n\n handleRequired(true);\n }\n }\n\n // #194 dropdown list not consistent in collapsing (bug).\n function clickoutHandlerForDropdown(event) {\n mousedownOn = null;\n scope.hideResults(event);\n document.body.removeEventListener('click', clickoutHandlerForDropdown);\n }\n\n // for IE8 quirkiness about event.which\n function ie8EventNormalizer(event) {\n return event.which ? event.which : event.keyCode;\n }\n\n function callOrAssign(value) {\n if (typeof scope.selectedObject === 'function') {\n scope.selectedObject(value, scope.selectedObjectData);\n }\n else {\n scope.selectedObject = value;\n }\n\n if (value) {\n handleRequired(true);\n }\n else {\n handleRequired(false);\n }\n }\n\n function callFunctionOrIdentity(fn) {\n return function (data) {\n return scope[fn] ? scope[fn](data) : data;\n };\n }\n\n function setInputString(str) {\n callOrAssign({originalObject: str});\n\n if (scope.clearSelected) {\n scope.searchStr = null;\n }\n clearResults();\n }\n\n function extractTitle(data) {\n // split title fields and run extractValue for each and join with ' '\n return scope.titleField.split(',')\n .map(function (field) {\n return extractValue(data, field);\n })\n .join(' ');\n }\n\n function extractValue(obj, key) {\n var keys, result;\n if (key) {\n keys = key.split('.');\n result = obj;\n for (var i = 0; i < keys.length; i++) {\n result = result[keys[i]];\n }\n }\n else {\n result = obj;\n }\n return result;\n }\n\n function findMatchString(target, str) {\n var result, matches, re;\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n // Escape user input to be treated as a literal string within a regular expression\n re = new RegExp(str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'i');\n if (!target) {\n return;\n }\n if (!target.match || !target.replace) {\n target = target.toString();\n }\n matches = target.match(re);\n if (matches) {\n result = target.replace(re,\n '<span class=\"' + scope.matchClass + '\">' + matches[0] + '</span>');\n }\n else {\n result = target;\n }\n return $sce.trustAsHtml(result);\n }\n\n function handleRequired(valid) {\n scope.notEmpty = valid;\n validState = scope.searchStr;\n if (scope.fieldRequired && ctrl && scope.inputName) {\n ctrl[scope.inputName].$setValidity(requiredClassName, valid);\n }\n }\n\n function keyupHandler(event) {\n var which = ie8EventNormalizer(event);\n if (which === KEY_LF || which === KEY_RT) {\n // do nothing\n return;\n }\n\n if (which === KEY_UP || which === KEY_EN) {\n event.preventDefault();\n }\n else if (which === KEY_DW) {\n event.preventDefault();\n if (!scope.showDropdown && scope.searchStr && scope.searchStr.length >= minlength) {\n initResults();\n scope.searching = true;\n searchTimerComplete(scope.searchStr);\n }\n }\n else if (which === KEY_ES) {\n clearResults();\n scope.$apply(function () {\n inputField.val(scope.searchStr);\n });\n }\n else {\n if (minlength === 0 && !scope.searchStr) {\n return;\n }\n\n if (!scope.searchStr || scope.searchStr === '') {\n scope.showDropdown = false;\n } else if (scope.searchStr.length >= minlength) {\n initResults();\n\n if (searchTimer) {\n $timeout.cancel(searchTimer);\n }\n\n scope.searching = true;\n\n searchTimer = $timeout(function () {\n searchTimerComplete(scope.searchStr);\n }, scope.pause);\n }\n\n if (validState && validState !== scope.searchStr && !scope.clearSelected) {\n scope.$apply(function () {\n callOrAssign();\n });\n }\n }\n }\n\n function handleOverrideSuggestions(event) {\n if (scope.overrideSuggestions && !(scope.selectedObject && scope.selectedObject.originalObject === scope.searchStr)) {\n if (event) {\n event.preventDefault();\n }\n\n // cancel search timer\n $timeout.cancel(searchTimer);\n // cancel http request\n cancelHttpRequest();\n\n setInputString(scope.searchStr);\n }\n }\n\n function dropdownRowOffsetHeight(row) {\n var css = getComputedStyle(row);\n return row.offsetHeight +\n parseInt(css.marginTop, 10) + parseInt(css.marginBottom, 10);\n }\n\n function dropdownHeight() {\n return dd.getBoundingClientRect().top +\n parseInt(getComputedStyle(dd).maxHeight, 10);\n }\n\n function dropdownRow() {\n return elem[0].querySelectorAll('.angucomplete-row')[scope.currentIndex];\n }\n\n function dropdownRowTop() {\n return dropdownRow().getBoundingClientRect().top -\n (dd.getBoundingClientRect().top +\n parseInt(getComputedStyle(dd).paddingTop, 10));\n }\n\n function dropdownScrollTopTo(offset) {\n dd.scrollTop = dd.scrollTop + offset;\n }\n\n function updateInputField() {\n var current = scope.results[scope.currentIndex];\n if (scope.matchClass) {\n inputField.val(extractTitle(current.originalObject));\n }\n else {\n inputField.val(current.title);\n }\n }\n\n function keydownHandler(event) {\n var which = ie8EventNormalizer(event);\n var row = null;\n var rowTop = null;\n\n if (which === KEY_EN && scope.results) {\n if (scope.currentIndex >= 0 && scope.currentIndex < scope.results.length) {\n event.preventDefault();\n scope.selectResult(scope.results[scope.currentIndex]);\n } else {\n handleOverrideSuggestions(event);\n clearResults();\n }\n scope.$apply();\n } else if (which === KEY_DW && scope.results) {\n event.preventDefault();\n if ((scope.currentIndex + 1) < scope.results.length && scope.showDropdown) {\n scope.$apply(function () {\n scope.currentIndex++;\n updateInputField();\n });\n\n if (isScrollOn) {\n row = dropdownRow();\n if (dropdownHeight() < row.getBoundingClientRect().bottom) {\n dropdownScrollTopTo(dropdownRowOffsetHeight(row));\n }\n }\n }\n } else if (which === KEY_UP && scope.results) {\n event.preventDefault();\n if (scope.currentIndex >= 1) {\n scope.$apply(function () {\n scope.currentIndex--;\n updateInputField();\n });\n\n if (isScrollOn) {\n rowTop = dropdownRowTop();\n if (rowTop < 0) {\n dropdownScrollTopTo(rowTop - 1);\n }\n }\n }\n else if (scope.currentIndex === 0) {\n scope.$apply(function () {\n scope.currentIndex = -1;\n inputField.val(scope.searchStr);\n });\n }\n } else if (which === KEY_TAB) {\n if (scope.results && scope.results.length > 0 && scope.showDropdown) {\n if (scope.currentIndex === -1 && scope.overrideSuggestions) {\n // intentionally not sending event so that it does not\n // prevent default tab behavior\n handleOverrideSuggestions();\n }\n else {\n if (scope.currentIndex === -1) {\n scope.currentIndex = 0;\n }\n scope.selectResult(scope.results[scope.currentIndex]);\n scope.$digest();\n }\n }\n else {\n // no results\n // intentionally not sending event so that it does not\n // prevent default tab behavior\n if (scope.searchStr && scope.searchStr.length > 0) {\n handleOverrideSuggestions();\n }\n }\n } else if (which === KEY_ES) {\n // This is very specific to IE10/11 #272\n // without this, IE clears the input text\n event.preventDefault();\n }\n }\n\n function httpSuccessCallbackGen(str) {\n return function (responseData, status, headers, config) {\n // normalize return obejct from promise\n if (!status && !headers && !config && responseData.data) {\n responseData = responseData.data;\n }\n scope.searching = false;\n processResults(\n extractValue(responseFormatter(responseData), scope.remoteUrlDataField),\n str);\n };\n }\n\n function httpErrorCallback(errorRes, status, headers, config) {\n scope.searching = false;\n\n // cancelled/aborted\n if (status === 0 || status === -1) {\n return;\n }\n\n // normalize return obejct from promise\n if (!status && !headers && !config) {\n status = errorRes.status;\n }\n if (scope.remoteUrlErrorCallback) {\n scope.remoteUrlErrorCallback(errorRes, status, headers, config);\n }\n else {\n if (console && console.error) {\n console.error('http error');\n }\n }\n }\n\n function cancelHttpRequest() {\n if (httpCanceller) {\n httpCanceller.resolve();\n }\n }\n\n function getRemoteResults(str) {\n var params = {},\n url = scope.remoteUrl + encodeURIComponent(str);\n if (scope.remoteUrlRequestFormatter) {\n params = {params: scope.remoteUrlRequestFormatter(str)};\n url = scope.remoteUrl;\n }\n if (!!scope.remoteUrlRequestWithCredentials) {\n params.withCredentials = true;\n }\n cancelHttpRequest();\n httpCanceller = $q.defer();\n params.timeout = httpCanceller.promise;\n $http.get(url, params)\n .success(httpSuccessCallbackGen(str))\n .error(httpErrorCallback);\n }\n\n function getRemoteResultsWithCustomHandler(str) {\n cancelHttpRequest();\n\n httpCanceller = $q.defer();\n\n scope.remoteApiHandler(str, httpCanceller.promise)\n .then(httpSuccessCallbackGen(str))\n .catch(httpErrorCallback);\n\n /* IE8 compatible\n scope.remoteApiHandler(str, httpCanceller.promise)\n ['then'](httpSuccessCallbackGen(str))\n ['catch'](httpErrorCallback);\n */\n }\n\n function clearResults() {\n scope.showDropdown = false;\n scope.results = [];\n if (dd) {\n dd.scrollTop = 0;\n }\n }\n\n function initResults() {\n scope.showDropdown = displaySearching;\n scope.currentIndex = scope.focusFirst ? 0 : -1;\n scope.results = [];\n }\n\n function getLocalResults(str) {\n var i, match, s, value,\n searchFields = scope.searchFields.split(','),\n matches = [];\n if (typeof scope.parseInput() !== 'undefined') {\n str = scope.parseInput()(str);\n }\n for (i = 0; i < scope.localData.length; i++) {\n match = false;\n\n for (s = 0; s < searchFields.length; s++) {\n value = extractValue(scope.localData[i], searchFields[s]) || '';\n match = match || (value.toString().toLowerCase().indexOf(str.toString().toLowerCase()) >= 0);\n }\n\n if (match) {\n matches[matches.length] = scope.localData[i];\n }\n }\n return matches;\n }\n\n function checkExactMatch(result, obj, str) {\n if (!str) {\n return false;\n }\n for (var key in obj) {\n if (obj[key].toLowerCase() === str.toLowerCase()) {\n scope.selectResult(result);\n return true;\n }\n }\n return false;\n }\n\n function searchTimerComplete(str) {\n // Begin the search\n if (!str || str.length < minlength) {\n return;\n }\n if (scope.localData) {\n scope.$apply(function () {\n var matches;\n if (typeof scope.localSearch() !== 'undefined') {\n matches = scope.localSearch()(str, scope.localData);\n } else {\n matches = getLocalResults(str);\n }\n scope.searching = false;\n processResults(matches, str);\n });\n }\n else if (scope.remoteApiHandler) {\n getRemoteResultsWithCustomHandler(str);\n } else {\n getRemoteResults(str);\n }\n }\n\n function processResults(responseData, str) {\n var i, description, image, text, formattedText, formattedDesc;\n\n if (responseData && responseData.length > 0) {\n scope.results = [];\n\n for (i = 0; i < responseData.length; i++) {\n if (scope.titleField && scope.titleField !== '') {\n text = formattedText = extractTitle(responseData[i]);\n }\n\n description = '';\n if (scope.descriptionField) {\n description = formattedDesc = extractValue(responseData[i], scope.descriptionField);\n }\n\n image = '';\n if (scope.imageField) {\n image = extractValue(responseData[i], scope.imageField);\n }\n\n if (scope.matchClass) {\n formattedText = findMatchString(text, str);\n formattedDesc = findMatchString(description, str);\n }\n\n scope.results[scope.results.length] = {\n title: formattedText,\n description: formattedDesc,\n image: image,\n originalObject: responseData[i]\n };\n }\n\n } else {\n scope.results = [];\n }\n\n if (scope.autoMatch && scope.results.length === 1 &&\n checkExactMatch(scope.results[0],\n {title: text, desc: description || ''}, scope.searchStr)) {\n scope.showDropdown = false;\n } else if (scope.results.length === 0 && !displayNoResults) {\n scope.showDropdown = false;\n } else {\n scope.showDropdown = true;\n }\n }\n\n function showAll() {\n if (scope.localData) {\n processResults(scope.localData, '');\n }\n else if (scope.remoteApiHandler) {\n getRemoteResultsWithCustomHandler('');\n }\n else {\n getRemoteResults('');\n }\n }\n\n scope.onFocusHandler = function () {\n if (scope.focusIn) {\n scope.focusIn();\n }\n if (minlength === 0 && (!scope.searchStr || scope.searchStr.length === 0)) {\n scope.currentIndex = scope.focusFirst ? 0 : scope.currentIndex;\n scope.showDropdown = true;\n showAll();\n }\n };\n\n scope.hideResults = function () {\n if (mousedownOn &&\n (mousedownOn === scope.id + '_dropdown' ||\n mousedownOn.indexOf('angucomplete') >= 0)) {\n mousedownOn = null;\n }\n else {\n hideTimer = $timeout(function () {\n clearResults();\n scope.$apply(function () {\n if (scope.searchStr && scope.searchStr.length > 0) {\n inputField.val(scope.searchStr);\n }\n });\n }, BLUR_TIMEOUT);\n cancelHttpRequest();\n\n if (scope.focusOut) {\n scope.focusOut();\n }\n\n if (scope.overrideSuggestions) {\n if (scope.searchStr && scope.searchStr.length > 0 && scope.currentIndex === -1) {\n handleOverrideSuggestions();\n }\n }\n }\n };\n\n scope.resetHideResults = function () {\n if (hideTimer) {\n $timeout.cancel(hideTimer);\n }\n };\n\n scope.hoverRow = function (index) {\n scope.currentIndex = index;\n };\n\n scope.selectResult = function (result) {\n // Restore original values\n if (scope.matchClass) {\n result.title = extractTitle(result.originalObject);\n result.description = extractValue(result.originalObject, scope.descriptionField);\n }\n\n if (scope.clearSelected) {\n scope.searchStr = null;\n }\n else {\n scope.searchStr = result.title;\n }\n callOrAssign(result);\n clearResults();\n };\n\n scope.inputChangeHandler = function (str) {\n if (str.length < minlength) {\n cancelHttpRequest();\n clearResults();\n }\n else if (str.length === 0 && minlength === 0) {\n scope.searching = false;\n showAll();\n }\n\n if (scope.inputChanged) {\n str = scope.inputChanged(str);\n }\n return str;\n };\n\n // check required\n if (scope.fieldRequiredClass && scope.fieldRequiredClass !== '') {\n requiredClassName = scope.fieldRequiredClass;\n }\n\n // check min length\n if (scope.minlength && scope.minlength !== '') {\n minlength = parseInt(scope.minlength, 10);\n }\n\n // check pause time\n if (!scope.pause) {\n scope.pause = PAUSE;\n }\n\n // check clearSelected\n if (!scope.clearSelected) {\n scope.clearSelected = false;\n }\n\n // check override suggestions\n if (!scope.overrideSuggestions) {\n scope.overrideSuggestions = false;\n }\n\n // check required field\n if (scope.fieldRequired && ctrl) {\n // check initial value, if given, set validitity to true\n if (scope.initialValue) {\n handleRequired(true);\n }\n else {\n handleRequired(false);\n }\n }\n\n scope.inputType = attrs.type ? attrs.type : 'text';\n\n // set strings for \"Searching...\" and \"No results\"\n scope.textSearching = attrs.textSearching ? attrs.textSearching : TEXT_SEARCHING;\n scope.textNoResults = attrs.textNoResults ? attrs.textNoResults : TEXT_NORESULTS;\n displaySearching = scope.textSearching === 'false' ? false : true;\n displayNoResults = scope.textNoResults === 'false' ? false : true;\n\n // set max length (default to maxlength deault from html\n scope.maxlength = attrs.maxlength ? attrs.maxlength : MAX_LENGTH;\n\n // register events\n inputField.on('keydown', keydownHandler);\n inputField.on('keyup', keyupHandler);\n\n // set response formatter\n responseFormatter = callFunctionOrIdentity('remoteUrlResponseFormatter');\n\n // set isScrollOn\n $timeout(function () {\n var css = getComputedStyle(dd);\n isScrollOn = css.maxHeight && css.overflowY === 'auto';\n });\n }\n\n return {\n restrict: 'EA',\n require: '^?form',\n scope: {\n selectedObject: '=',\n selectedObjectData: '=',\n disableInput: '=',\n initialValue: '=',\n localData: '=',\n localSearch: '&',\n remoteUrlRequestFormatter: '=',\n remoteUrlRequestWithCredentials: '@',\n remoteUrlResponseFormatter: '=',\n remoteUrlErrorCallback: '=',\n remoteApiHandler: '=',\n id: '@',\n type: '@',\n placeholder: '@',\n textSearching: '@',\n textNoResults: '@',\n remoteUrl: '@',\n remoteUrlDataField: '@',\n titleField: '@',\n descriptionField: '@',\n imageField: '@',\n inputClass: '@',\n pause: '@',\n searchFields: '@',\n minlength: '@',\n matchClass: '@',\n clearSelected: '@',\n overrideSuggestions: '@',\n fieldRequired: '=',\n fieldRequiredClass: '@',\n inputChanged: '=',\n autoMatch: '@',\n focusOut: '&',\n focusIn: '&',\n fieldTabindex: '@',\n inputName: '@',\n focusFirst: '@',\n parseInput: '&'\n },\n templateUrl: function (element, attrs) {\n return attrs.templateUrl || TEMPLATE_URL;\n },\n compile: function (tElement) {\n var startSym = $interpolate.startSymbol();\n var endSym = $interpolate.endSymbol();\n if (!(startSym === '{{' && endSym === '}}')) {\n var interpolatedHtml = tElement.html()\n .replace(/\\{\\{/g, startSym)\n .replace(/\\}\\}/g, endSym);\n tElement.html(interpolatedHtml);\n }\n return link;\n }\n };\n }]);\n\n}));\n","angular\n .module('graphdb.framework.utils.notifications', [])\n .factory('Notifications', Notifications);\n\nNotifications.$inject = ['toastr', '$translate'];\n\nfunction Notifications(toastr, $translate) {\n return {\n showToastMessageWithDelay\n };\n\n /**\n * This method will show message with tiny delay and only after completion\n * of latter redirection to \"graphs-visualizations\" page will happen.\n * @param {string} message The message to be displayed.\n * @return {Promise<any>}\n */\n function showToastMessageWithDelay(message) {\n return new Promise((r) => {\n toastr.success($translate.instant(message));\n setTimeout(r, 200);\n });\n }\n}\n","import 'angular/utils/local-storage-adapter';\nimport 'angular/rest/sparql.rest.service';\nimport {decodeHTML} from \"../../../../../app\";\n\nangular\n .module('graphdb.framework.core.directives.queryeditor.controllers', [\n 'graphdb.framework.utils.localstorageadapter',\n 'graphdb.framework.rest.sparql.service'\n ])\n .controller('QueryEditorCtrl', QueryEditorCtrl)\n .controller('QuerySampleModalCtrl', QuerySampleModalCtrl);\n\nQueryEditorCtrl.$inject = ['$scope', '$timeout', 'toastr', '$repositories', '$modal', 'ModalService', 'SparqlRestService', '$filter', '$window', '$jwtAuth', 'RDF4JRepositoriesRestService', 'MonitoringRestService', 'LocalStorageAdapter', 'LSKeys', '$translate'];\n\nfunction QueryEditorCtrl($scope, $timeout, toastr, $repositories, $modal, ModalService, SparqlRestService, $filter, $window, $jwtAuth, RDF4JRepositoriesRestService, MonitoringRestService, LocalStorageAdapter, LSKeys, $translate) {\n const defaultTabConfig = {\n id: \"1\",\n name: '',\n query: 'select * where { \\n' +\n '\\t?s ?p ?o .\\n' +\n '} limit 100 \\n',\n inference: true,\n sameAs: true\n };\n\n let principal = $jwtAuth.getPrincipal();\n let checkQueryIntervalId;\n if (principal) {\n initTabs($scope, principal);\n // principal is not yet set, wait for its initialization\n } else {\n $scope.$on('securityInit', function (scope) {\n principal = $jwtAuth.getPrincipal();\n initTabs(scope.currentScope, principal);\n });\n }\n\n function initTabs(scope, principal) {\n defaultTabConfig.inference = principal.appSettings.DEFAULT_INFERENCE;\n defaultTabConfig.sameAs = principal.appSettings.DEFAULT_SAMEAS;\n\n scope.skipCountQuery = !principal.appSettings.EXECUTE_COUNT;\n scope.ignoreSharedQueries = principal.appSettings.IGNORE_SHARED_QUERIES;\n scope.tabsData = scope.tabs = LocalStorageAdapter.get(LSKeys.TABS_STATE) || [defaultTabConfig];\n\n scope.$watchCollection('[currentQuery.inference, currentQuery.sameAs]', function (newVal, oldVal, scope) {\n saveQueryToLocal(scope.currentQuery);\n });\n\n scope.$on('repositoryIsSet', deleteCachedSparqlResults);\n }\n\n this.hint = document.createElement(\"span\");\n this.hint.innerHTML = $translate.instant('query.editor.autocomplete.hint');\n this.hint.style.fontSize = \"12px\";\n this.hint.style.color = \"gray\";\n this.hint.style.backgroundColor = \"white\";\n this.hint.style.position = \"absolute\";\n this.hint.style.zIndex = \"3\";\n this.hint.style.paddingLeft = 12 + \"px\";\n\n $scope.$watch(function() {\n return angular.element('.CodeMirror-hints').length;\n }, (newValue) => {\n if (newValue) {\n const elRect = angular.element('.CodeMirror-hints')[0].getBoundingClientRect();\n document.body.appendChild(this.hint);\n this.hint.style.top = elRect.top - 20 + \"px\";\n this.hint.style.left = elRect.right - this.hint.offsetWidth - 12 + \"px\";\n } else {\n this.hint && this.hint.parentNode && this.hint.parentNode.removeChild(this.hint);\n }\n });\n\n $scope.resetCurrentTabConfig = function () {\n $scope.currentTabConfig = {\n pageSize: 1000,\n page: 1,\n allResultsCount: 0,\n resultsCount: 0\n };\n };\n\n $scope.queryExists = false;\n\n $scope.resetCurrentTabConfig();\n\n // query tab operations\n $scope.saveTab = saveTab;\n $scope.loadTab = loadTab;\n $scope.addNewTab = addNewTab;\n $scope.isTabChangeOk = isTabChangeOk;\n\n // query operations\n $scope.runQuery = runQuery;\n $scope.abortCurrentQuery = abortCurrentQuery;\n $scope.editQuery = editQuery;\n $scope.getNamespaces = getNamespaces;\n $scope.changePagination = changePagination;\n $scope.toggleSampleQueries = toggleSampleQueries;\n $scope.addKnownPrefixes = addKnownPrefixes;\n $scope.getExistingTabId = getExistingTabId;\n $scope.querySelected = querySelected;\n $scope.deleteQuery = deleteQuery;\n $scope.deleteQueryHttp = deleteQueryHttp;\n $scope.saveQuery = saveQuery;\n $scope.saveQueryHttp = saveQueryHttp;\n $scope.saveQueryToLocal = saveQueryToLocal;\n\n $scope.setLoader = setLoader;\n $scope.getLoaderMessage = getLoaderMessage;\n\n // query editor and results orientation\n $scope.fixSizesOnHorizontalViewModeSwitch = fixSizesOnHorizontalViewModeSwitch;\n $scope.changeViewMode = changeViewMode;\n $scope.showHideEditor = showHideEditor;\n $scope.focusQueryEditor = focusQueryEditor;\n $scope.orientationViewMode = LocalStorageAdapter.get(LSKeys.VIEW_MODE) ? LocalStorageAdapter.get(LSKeys.VIEW_MODE) === \"true\" : true;\n $scope.viewMode = 'none';\n\n // start of repository actions\n // FIXME: do we need this??\n // $scope.getActiveRepository();\n $scope.getActiveRepository = function () {\n // same as getActiveRepository() but takes into account repo errors\n return $repositories.getActiveRepository();\n };\n\n $scope.getActiveRepositoryNoError = function () {\n if (!$scope.repositoryError) {\n return $repositories.getActiveRepository();\n }\n };\n\n function saveQueryToLocal(currentQueryTab) {\n shouldDisableSameAs();\n $scope.tabs.forEach(function (tab, index) {\n if (tab.id === currentQueryTab.id) {\n $scope.tabs[index].query = currentQueryTab.query;\n // Don't store inference and sameAs values for Ontop repository,\n // because they are overridden afterwards to true\n if (!$repositories.isActiveRepoOntopType()) {\n $scope.tabs[index].inference = currentQueryTab.inference;\n $scope.tabs[index].sameAs = currentQueryTab.sameAs;\n }\n }\n });\n LocalStorageAdapter.set(LSKeys.TABS_STATE, $scope.tabs);\n }\n\n function setLoader(isRunning, progressMessage, extraMessage, noTimer) {\n const yasrInnerContainer = angular.element(document.getElementById(\"yasr-inner\"));\n $scope.queryIsRunning = isRunning;\n if (isRunning) {\n $scope.queryStartTime = Date.now();\n $scope.countTimeouted = false;\n $scope.progressMessage = progressMessage;\n $scope.extraMessage = extraMessage;\n $scope.noLoaderTimer = noTimer;\n yasrInnerContainer.addClass(\"hide\");\n } else {\n $scope.progressMessage = \"\";\n $scope.extraMessage = \"\";\n $scope.noLoaderTimer = false;\n $scope.currentTrackAlias = null;\n $scope.abortRequested = false;\n yasrInnerContainer.removeClass(\"hide\");\n }\n // We might call this from angular or outside angular so take care of applying the scope.\n if ($scope.$$phase === null) {\n $scope.$apply();\n }\n }\n\n function getLoaderMessage() {\n const timeSeconds = (Date.now() - $scope.queryStartTime) / 1000;\n let timeHuman = \"\";\n let message = \"\";\n\n if (!$scope.noLoaderTimer) {\n timeHuman = $scope.getHumanReadableSeconds(timeSeconds);\n }\n\n if ($scope.progressMessage) {\n message = $translate.instant('query.editor.progress.msg', {progressMessage: $scope.progressMessage, timeHuman: timeHuman});\n } else {\n message = $translate.instant('common.running.operation', {timeHuman: timeHuman});\n }\n if ($scope.extraMessage && timeSeconds > 10) {\n message += $translate.instant('query.editor.extra.msg', {extraMessage: $scope.extraMessage});\n }\n\n return message;\n }\n\n // start of query editor results orientation operations\n function fixSizesOnHorizontalViewModeSwitch(verticalView) {\n function visibleWindowHeight() {\n return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0;\n }\n\n if (!$scope.orientationViewMode) {\n $scope.noPadding = {paddingRight: 15, paddingLeft: 0};\n\n // window.editor is undefined if no repo is selected\n if (window.editor && document.querySelector('.CodeMirror-wrap')) {\n let newHeight = visibleWindowHeight() - (document.querySelector('.CodeMirror-wrap').getBoundingClientRect().top);\n newHeight -= 40;\n document.querySelector('.CodeMirror-wrap').style.height = newHeight + 'px';\n document.getElementById('yasr').style.minHeight = newHeight + 'px';\n //window.editor.refresh();\n } else {\n let timer;\n if (verticalView) {\n timer = $timeout(function () {\n $scope.fixSizesOnHorizontalViewModeSwitch(verticalView);\n }, 100);\n } else {\n timer = $timeout($scope.fixSizesOnHorizontalViewModeSwitch, 100);\n }\n\n $scope.$on(\"$destroy\", function () {\n $timeout.cancel(timer);\n });\n }\n } else {\n if ($scope.viewMode === 'yasr') {\n let newHeight = visibleWindowHeight() - (document.querySelector('.CodeMirror-wrap').getBoundingClientRect().top);\n newHeight -= 40;\n document.querySelector('.CodeMirror-wrap').style.height = newHeight + 'px';\n //window.editor.refresh();\n } else {\n $scope.noPadding = {};\n document.querySelector('.CodeMirror-wrap').style.height = '';\n //window.editor.refresh();\n }\n document.getElementById('yasr').style.minHeight = '';\n }\n if (window.yasr && window.yasr.container) {\n $timeout(function () {\n window.yasr.container.resize();\n }, 100);\n }\n }\n\n if (!$scope.orientationViewMode) {\n showHideEditor();\n }\n\n function changeViewMode() {\n $scope.viewMode = 'none';\n $scope.orientationViewMode = !$scope.orientationViewMode;\n LocalStorageAdapter.set(LSKeys.VIEW_MODE, $scope.orientationViewMode);\n fixSizesOnHorizontalViewModeSwitch();\n }\n\n function showHideEditor() {\n fixSizesOnHorizontalViewModeSwitch(true);\n }\n\n function focusQueryEditor() {\n if (!angular.element(document).find('.editable-input').is(\":focus\")) {\n angular.element(document).find('.CodeMirror textarea:first-child').focus();\n }\n }\n\n // end of query editor results orientation operations\n\n function deleteCachedSparqlResults(foo, params) {\n if (params.newRepo) {\n $scope.tabsData = LocalStorageAdapter.get(LSKeys.TABS_STATE);\n $scope.tabsData.forEach(function (item) {\n item.yasrData = undefined;\n item.queryType = undefined;\n item.resultsCount = 0;\n item.allResultsCount = 0;\n item.sizeDelta = undefined;\n });\n\n LocalStorageAdapter.set(LSKeys.TABS_STATE, $scope.tabsData);\n $scope.tabs = $scope.tabsData;\n\n // The repository is changed. Remove error messages as well, if any\n $scope.currentQuery = {};\n $scope.errorMessage = null;\n $scope.repositoryError = null;\n }\n }\n\n function selectTab(id) {\n $timeout(function () {\n $('a[data-id = \"' + id + '\"]').tab('show');\n }, 0);\n }\n\n window.onbeforeunload = function () {\n if ($scope.currentQuery) {\n $scope.saveTab($scope.currentQuery.id);\n }\n LocalStorageAdapter.set(LSKeys.TABS_STATE, $scope.tabs);\n };\n\n $scope.$on('$destroy', function () {\n if ($scope.currentQuery) {\n $scope.saveTab($scope.currentQuery.id);\n }\n LocalStorageAdapter.set(LSKeys.TABS_STATE, $scope.tabs);\n clearInterval(checkQueryIntervalId);\n });\n\n // start of query operations\n function runQuery(changePage, explain) {\n $scope.executedQueryTab = $scope.currentQuery ;\n if (explain) {\n if (!(window.editor.getQueryType() === 'SELECT' || window.editor.getQueryType() === 'CONSTRUCT')) {\n toastr.warning($translate.instant('query.editor.warning.msg'));\n return;\n }\n\n if ($repositories.isActiveRepoOntopType()) {\n toastr.warning($translate.instant('query.editor.virtual.repo.warning.msg'));\n return;\n }\n }\n\n $scope.explainRequested = explain;\n if (!$scope.queryIsRunning) {\n if (changePage) {\n $scope.currentTabConfig.resultsCount = 0;\n } else {\n $scope.resetCurrentTabConfig();\n }\n\n $scope.lastRunQueryMode = window.editor.getQueryMode();\n\n if ($scope.lastRunQueryMode === 'update' && $repositories.isActiveRepoOntopType()) {\n toastr.warning($translate.instant('query.editor.virtual.repo.update.warning.msg'));\n return;\n }\n\n setLoader(true, $scope.lastRunQueryMode === 'update' ? 'Executing update' : 'Evaluating query');\n if ($scope.viewMode !== 'none') {\n $scope.viewMode = 'none';\n if ($scope.orientationViewMode) {\n $scope.fixSizesOnHorizontalViewModeSwitch();\n }\n const timer = $timeout(window.editor.query, 500);\n $scope.$on('$destroy', function () {\n $timeout.cancel(timer);\n });\n } else {\n window.editor.query();\n }\n }\n }\n\n function abortCurrentQuery() {\n MonitoringRestService.abortQueryByAlias($scope.currentTrackAlias)\n .success(function () {\n $scope.abortRequested = true;\n });\n }\n\n function getNamespaces() {\n // Signals the namespaces are to be fetched => loader will be shown\n setLoader(true, $translate.instant('common.refreshing.namespaces'), $translate.instant('common.extra.message'));\n $scope.namespacesLoading = true;\n\n RDF4JRepositoriesRestService.getRepositoryNamespaces()\n .success(function (data) {\n const usedPrefixes = {};\n data.results.bindings.forEach(function (e) {\n usedPrefixes[e.prefix.value] = e.namespace.value;\n });\n $scope.namespaces = usedPrefixes;\n })\n .error(function (data) {\n $scope.repositoryError = getError(data);\n })\n .finally(function () {\n // Signals namespaces were fetched => loader will be hidden\n setLoader(false);\n $scope.namespacesLoading = false;\n });\n }\n\n function changePagination() {\n runQuery(true, $scope.explainRequested);\n }\n\n $scope.$on(\"$destroy\", function () {\n clearInterval(checkQueryIntervalId);\n window.editor = null;\n window.yasr = null;\n });\n\n function toggleSampleQueries() {\n $scope.showSampleQueries = !$scope.showSampleQueries;\n if ($scope.showSampleQueries) {\n SparqlRestService.getSavedQueries()\n .success(function (data) {\n $scope.sampleQueries = data;\n $('#sampleQueriesCollapse').collapse('show').width('300px');\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('query.editor.get.saved.queries.error'));\n });\n } else {\n $('#sampleQueriesCollapse').collapse('hide');\n }\n }\n\n // Hide the sample queries when the user clicks somewhere else in the UI.\n $(document).mouseup(function (event) {\n const container = $('#sampleQueriesCollapse');\n if (!container.is(event.target) // if the target of the click isn't the container..\n && container.has(event.target).length === 0 //... nor a descendant of the container\n && $scope.showSampleQueries) {\n toggleSampleQueries();\n }\n });\n\n // Add known prefixes\n function addKnownPrefixes() {\n SparqlRestService.addKnownPrefixes(JSON.stringify(window.editor.getValue()))\n .success(function (data) {\n if (angular.isDefined(window.editor) && angular.isDefined(data) && data !== window.editor.getValue()) {\n window.editor.setValue(data);\n }\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('common.add.known.prefixes.error'));\n return true;\n });\n }\n\n function querySelected(query) {\n const tabId = getExistingTabId(query);\n $scope.toggleSampleQueries();\n\n if ($scope.isTabChangeOk(false)) {\n $scope.highlightNextTabChange = true;\n if (!angular.isDefined(tabId)) {\n $scope.addNewTab(null, query.name, query.body);\n } else {\n selectTab(tabId);\n }\n }\n }\n\n function getExistingTabId(query) {\n let existingTabId = undefined;\n $scope.tabsData.forEach(function (item) {\n if (item.name === query.name && item.query === query.body) {\n existingTabId = item.id;\n return item;\n }\n });\n return existingTabId;\n }\n\n function editQuery(query) {\n const modalInstance = $modal.open({\n templateUrl: 'js/angular/core/directives/queryeditor/templates/query-sample.html',\n controller: 'QuerySampleModalCtrl',\n resolve: {\n data: function () {\n return {\n title: $translate.instant('query.editor.edit.saved.query', {name: query.name}),\n query: query,\n edit: true,\n okButtonText: $translate.instant('common.save.btn')\n };\n }\n }\n });\n\n modalInstance.result.then(function (queryModal) {\n const data = {\n name: queryModal.name,\n body: queryModal.body,\n shared: queryModal.shared\n };\n if (query.name !== queryModal.name) {\n SparqlRestService.addNewSavedQuery(data)\n .success(function () {\n $scope.deleteQueryHttp(query.name, true);\n })\n .error(function (error) {\n const msg = getError(error);\n toastr.error(msg, $translate.instant('query.editor.edit.saved.query.error'));\n });\n } else {\n SparqlRestService.editSavedQuery(data)\n .success(function () {\n $('#editQueryContainer').modal('hide');\n $scope.toggleSampleQueries();\n toastr.success($translate.instant('query.editor.edit.saved.query.success.msg', {name: query.name}));\n })\n .error(function (error) {\n const msg = getError(error);\n toastr.error(msg, $translate.instant('query.editor.edit.saved.query.error'));\n });\n }\n });\n }\n\n function deleteQueryHttp(savedQueryName, edit) {\n SparqlRestService.deleteSavedQuery(savedQueryName)\n .success(function () {\n $scope.toggleSampleQueries();\n if (!edit) {\n toastr.success($translate.instant('query.editor.delete.saved.query.success.msg', {savedQueryName: savedQueryName}));\n }\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('query.editor.delete.saved.query.error'));\n });\n }\n\n function deleteQuery(savedQueryName) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('query.editor.delete.saved.query.warning.msg', {savedQueryName: savedQueryName}),\n warning: true\n }).result\n .then(function () {\n $scope.deleteQueryHttp(savedQueryName);\n });\n }\n\n function saveQueryHttp(query) {\n SparqlRestService.addNewSavedQuery(query)\n .success(function () {\n toastr.success($translate.instant('query.editor.save.saved.query.success.msg', {name: query.name}));\n })\n .error(function (data) {\n let msg = getError(data);\n toastr.error(msg, $translate.instant('query.editor.create.saved.query.error'));\n // TODO: This condition will always be true\n if (msg = \"Query '\" + query.name + \"' already exists!\") {\n query.query = query.body;\n const queryExists = true;\n $scope.saveQuery(query, queryExists);\n }\n });\n }\n\n function saveQuery(query, queryExists) {\n const modalInstance = $modal.open({\n templateUrl: 'js/angular/core/directives/queryeditor/templates/query-sample.html',\n controller: 'QuerySampleModalCtrl',\n resolve: {\n data: function () {\n return {\n title: $translate.instant('query.editor.create.saved.query.msg'),\n query: {name: query.name, body: query.query, shared: query.shared},\n edit: false,\n okButtonText: $translate.instant('common.create.btn'),\n queryExists: queryExists,\n existingQueryErrMsg: decodeHTML($translate.instant('query.sample.existing.query.warning', {name: query.name}))\n };\n }\n }\n });\n\n modalInstance.result.then(function (query) {\n $scope.saveQueryHttp(query);\n }, function () {\n });\n }\n\n // end of query operations\n\n function showModal(modalSelector) {\n return function (name, query, shared) {\n $scope.savedQuery = {\n name: name,\n query: query || window.editor.getValue(),\n shared: shared\n };\n $(modalSelector).modal('show');\n };\n }\n\n\n // start of query tab operations\n function findTabIndexByID(id) {\n for (let i = 0; i < $scope.tabsData.length; i++) {\n const tab = $scope.tabsData[i];\n if (tab.id === id) {\n return i;\n }\n }\n }\n\n function saveTab(id) {\n const idx = findTabIndexByID(id);\n // Tab was deleted, don't try to save it's state\n if (idx === undefined) {\n return {};\n }\n const tab = $scope.tabsData[idx];\n //tab.query = window.editor.getValue();\n $scope.saveQueryToLocal(tab);\n return tab;\n }\n\n let maxID = LocalStorageAdapter.get(LSKeys.TABS_STATE_MAXID) || 1;\n\n function addNewTab(callback, tabName, savedQuery) { // optional callback to call after tab has been added\n if (!isTabChangeOk(true)) {\n return;\n }\n let defaultTabConfig;\n if (tabName || savedQuery) {\n defaultTabConfig = {\n id: \"1\",\n name: tabName,\n query: savedQuery,\n inference: principal.appSettings.DEFAULT_INFERENCE,\n sameAs: principal.appSettings.DEFAULT_SAMEAS\n };\n } else {\n defaultTabConfig = {\n id: \"1\",\n name: '',\n query: 'select * where { \\n' +\n '\\t?s ?p ?o .\\n' +\n '} limit 100 \\n',\n inference: principal.appSettings.DEFAULT_INFERENCE,\n sameAs: principal.appSettings.DEFAULT_SAMEAS\n };\n }\n\n maxID++;\n const newID = '' + maxID;\n $scope.tabsData = $scope.tabs;\n\n const newTab = defaultTabConfig;\n newTab.id = newID;\n\n $scope.tabsData.push(newTab);\n\n LocalStorageAdapter.set(LSKeys.TABS_STATE_MAXID, maxID);\n LocalStorageAdapter.set(LSKeys.TABS_STATE, $scope.tabsData);\n const callbackArgs = Array.prototype.slice.call(arguments, 1); // skip one argument, i.e. the callback itself\n $timeout(function () {\n $scope.$apply();\n selectTab(newID);\n if (callback) {\n callback.apply(this, callbackArgs);\n }\n }, 0);\n $scope.tabs = $scope.tabsData;\n }\n\n function loadTab(id) {\n $scope.tabsData = LocalStorageAdapter.get(LSKeys.TABS_STATE) || [defaultTabConfig];\n\n // find available tab\n const idx = findTabIndexByID(id);\n const tab = $scope.tabsData[idx];\n\n if (tab.yasrData) {\n setLoader(true, $translate.instant('query.editor.render.results.msg'), null, true);\n }\n\n // set query in editor available on the current tab\n $timeout(function () {\n if ($scope.currentQuery.query === '') {\n $scope.currentQuery.query = \" \";\n }\n $timeout(function () {\n window.editor.setValue($scope.currentQuery.query);\n $scope.yasr.updateDownloadDropdown();\n $scope.$broadcast('tabLoaded', $scope.currentQuery.id);\n\n // set query results in query results sections after\n // previous query execution. Yasr response rendering depends on the\n // query type of window.editor!\n $scope.yasr.options.output = tab.outputType; // this may be undefined, that's fine!\n if (tab.yasrData) {\n if (tab.yasrData.customError) {\n // Our injected custom (not real HTTP) error\n $scope.yasr.results = {\n getException: function () {\n return tab.yasrData.customError;\n }\n };\n setLoader(false);\n } else {\n // Real YASR result\n $timeout(function () {\n $scope.setYasrResponse(tab.yasrData, tab.textStatus, tab.jqXhrOrErrorString);\n setLoader(false);\n if ($('.yasr_btnGroup li:nth-child(2)').hasClass(\"active\")) {\n $timeout(function () {\n $('.yasr_btnGroup li:nth-child(2) a').get(0).click();\n }, 0);\n }\n }, 0);\n }\n }\n }, 0);\n }, 0);\n\n\n // persist current tab id in local storage\n LocalStorageAdapter.set(LSKeys.TABS_STATE_CURRENT_ID, id);\n\n $scope.currentQuery = tab;\n\n $timeout(function () {\n $scope.currentTabConfig = {};\n $scope.currentTabConfig.queryType = tab.queryType;\n $scope.currentTabConfig.resultsCount = tab.resultsCount;\n\n $scope.currentTabConfig.offset = tab.offset;\n $scope.currentTabConfig.allResultsCount = tab.allResultsCount;\n $scope.currentTabConfig.allResultsCountExact = tab.allResultsCountExact;\n $scope.currentTabConfig.page = tab.page;\n $scope.currentTabConfig.pageSize = tab.pageSize;\n\n $scope.currentTabConfig.timeFinished = tab.timeFinished;\n $scope.currentTabConfig.timeTook = tab.timeTook;\n $scope.currentTabConfig.sizeDelta = tab.sizeDelta;\n $scope.currentTabConfig.customUpdateMessage = tab.customUpdateMessage;\n $scope.currentTabConfig.errorMessage = tab.errorMessage;\n $scope.currentTabConfig.warningMessage = tab.warningMessage;\n\n $scope.$apply();\n }, 0);\n\n //Remove paddign of yasr so it will be aligned with sparql editor\n $('#yasr').css('padding', '0');\n\n if (!checkQueryIntervalId) {\n checkQueryIntervalId = setInterval(showOrHideSaveAsDropDown, 200);\n }\n overrideSameAsInferenceAndNoCountIfNeeded();\n }\n\n function getQueryID(element) {\n return $(element).attr('data-id');\n }\n\n function showOrHideSaveAsDropDown() {\n // If selected tab has results and query in editor controller is invalid save as\n // dropdown menu will be removed and on fixing query latter will be added\n if ($scope.currentTabConfig.resultsCount >= 0) {\n const $saveAsDropDown = $('.saveAsDropDown');\n if ($saveAsDropDown.length > 0 && !window.editor.queryValid) {\n yasr.header.find('.saveAsDropDown').remove();\n } else if ($saveAsDropDown.length === 0 && window.editor.queryValid) {\n yasr.updateDownloadDropdown();\n }\n }\n }\n\n function isTabChangeOk(isNew) {\n if ($scope.queryIsRunning && !$scope.namespacesLoading) {\n if (isNew) {\n toastr.info($translate.instant('query.editor.new.tab.running.query.warning.msg'));\n } else {\n toastr.info($translate.instant('query.editor.tab.switching.running.query.warning.msg'));\n }\n\n return false;\n }\n\n return true;\n }\n\n // Raise this flag to provide visual feedback to the user the next time a tab changes\n // (either manually or by the system). See GDB-1983.\n $scope.highlightNextTabChange = false;\n $scope.$on('tabAction', function (e, tabEvent) {\n if (tabEvent.relatedTarget) {\n // Cancel any highlight timer that might have been left by the last highlight\n $timeout.cancel(tabEvent.relatedTarget.timer);\n $(tabEvent.relatedTarget).css('color', '');\n\n $scope.saveTab(getQueryID(tabEvent.relatedTarget));\n }\n\n $scope.loadTab(getQueryID(tabEvent.target));\n\n // These arrays define how the tab change will be visually enhanced.\n // colors contains the colors to set to the tab name,\n // while times defines the times in milliseconds to keep each color.\n // Once we cycle through the arrays we restore the default color.\n const colors = ['#ED4F2F', '', '#ED4F2F'];\n const times = [400, 400, 400];\n if ($scope.highlightNextTabChange) {\n $scope.highlightNextTabChange = false;\n let index = 0;\n $(tabEvent.target).css('color', colors[index]);\n const highlightFun = function () {\n index++;\n if (index < colors.length) {\n $(tabEvent.target).css('color', colors[index]);\n tabEvent.target.timer = $timeout(highlightFun, times[index]);\n } else {\n $(tabEvent.target).css('color', '');\n }\n };\n $timeout(highlightFun, times[index]);\n }\n });\n\n $scope.$on('deleteAllexeptSelected', function (e, tabs) {\n $scope.tabsData = tabs;\n $scope.tabs = tabs;\n });\n // end of query tab operations\n\n $scope.currentQuery = {};\n // $scope.state = {};\n $scope.showSampleQueries = false;\n $scope.savedQuery = {};\n $scope.sampleQueries = {};\n $scope.editQueryModal = showModal('#editQueryContainer');\n $scope.deleteQueryModal = showModal('#confirmDeleteContainer');\n $scope.saveQueryModal = showModal('#saveQueryContainer');\n\n $scope.getResultsDescription = function () {\n let desc;\n if ($scope.currentTabConfig.resultsCount === 0) {\n desc = \"No results.\";\n } else {\n const currentPageEnd = ($scope.currentTabConfig.page - 1) * $scope.currentTabConfig.pageSize\n + Math.min($scope.currentTabConfig.resultsCount, $scope.currentTabConfig.pageSize);\n desc = $translate.instant('query.editor.showing.results.from.msg') + $filter('currency')($scope.currentTabConfig.offset, '', 0)\n + $translate.instant('query.editor.to') + $filter('currency')(currentPageEnd, '', 0);\n if ($scope.currentTabConfig.allResultsCount > 0) {\n // Unsure total results count \"of at least\" happens if counting timed out or\n // counting was disabled and we got at least $pageSize + 1 results for the current page.\n // It may reset become exact when we navigate and reach the end of results.\n desc += $translate.instant(($scope.currentTabConfig.allResultsCountExact\n ? 'query.editor.of' : 'query.editor.of.at.least'));\n desc += $filter('currency')($scope.currentTabConfig.allResultsCount, '', 0);\n }\n desc += \".\";\n }\n\n return desc;\n };\n\n $scope.getUpdateDescription = function () {\n if ($scope.currentTabConfig.customUpdateMessage) {\n return $scope.currentTabConfig.customUpdateMessage;\n } else if ($scope.currentTabConfig.sizeDelta === undefined) {\n return '';\n } else if ($scope.currentTabConfig.sizeDelta < 0) {\n return $translate.instant('yasr.removed.statements.result.msg', {sizeDelta: Math.abs($scope.currentTabConfig.sizeDelta)});\n } else if ($scope.currentTabConfig.sizeDelta > 0) {\n return $translate.instant('yasr.added.statements.result.msg', {sizeDelta: $scope.currentTabConfig.sizeDelta});\n } else {\n return $translate.instant('yasr.statements.no.change.msg');\n }\n };\n\n $scope.getStaleWarningMessage = function () {\n const secondsAgo = Math.round((Date.now() - $scope.currentTabConfig.timeFinished) / 60000) * 60;\n if (secondsAgo >= 3600) { // must be at least an hour\n return $translate.instant('yasr.stale.result.msg', {secondsAgo: $scope.getHumanReadableSeconds(secondsAgo)});\n }\n };\n\n const resize = function () {\n // $scope.fixSizesOnHorizontalViewModeSwitch();\n };\n\n angular.element($window).bind('resize', resize);\n\n $scope.$on('$destroy', function () {\n angular.element($window).unbind('resize', resize);\n });\n\n /**\n * In case of Ontop repository, sameAs, inference and nocount are\n * overridden to true and #sameAs and #inference buttons are disabled, In case of FedX repo nocount is overridden\n */\n function overrideSameAsInferenceAndNoCountIfNeeded() {\n const isOntop = $repositories.isActiveRepoOntopType();\n const isFedX = $repositories.isActiveRepoFedXType();\n handleSameAsAndInferenceBtns(isOntop);\n\n $scope.nocount = (isOntop || isFedX) ? true : !principal.appSettings.EXECUTE_COUNT;\n if (isOntop) {\n $scope.currentQuery.inference = true;\n $scope.currentQuery.sameAs = true;\n }\n }\n\n function handleSameAsAndInferenceBtns(isOntop) {\n const sameAsBtn = document.getElementById('sameAs');\n const inferenceBtn = document.getElementById('inference');\n\n if (sameAsBtn) {\n sameAsBtn.disabled = !!isOntop;\n }\n\n if (inferenceBtn) {\n inferenceBtn.disabled = !!isOntop;\n }\n }\n\n // The sameAs is meaningless without inference.\n // Set its value to false and disable button\n function shouldDisableSameAs() {\n // don't try to override sameAs if repository is Ontop type\n if ($repositories.isActiveRepoOntopType()) {\n return;\n }\n const sameAsBtn = document.getElementById('sameAs');\n if (sameAsBtn && !$scope.currentQuery.inference && !sameAsBtn.disabled) {\n sameAsBtn.disabled = true;\n $scope.currentQuery.sameAs = false;\n } else if ($scope.currentQuery.inference && sameAsBtn.disabled) {\n sameAsBtn.removeAttribute('disabled');\n $scope.currentQuery.sameAs = principal.appSettings.DEFAULT_SAMEAS;\n }\n }\n}\n\nQuerySampleModalCtrl.$inject = ['$scope', '$modalInstance', 'data', '$sce'];\n\nfunction QuerySampleModalCtrl($scope, $modalInstance, data, $sce) {\n if (data.queryExists) {\n $scope.queryExists = true;\n }\n $scope.query = angular.copy(data.query);\n $scope.title = data.title;\n $scope.edit = data.edit;\n $scope.okButtonText = data.okButtonText;\n $scope.existingQueryErrMsg = $sce.trustAsHtml(data.existingQueryErrMsg);\n $scope.ok = function () {\n if ($scope.form.$valid) {\n $modalInstance.close($scope.query);\n }\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n}\n","export const STATIC_RULESETS = [\n {id: 'empty', name: 'No inference'},\n {id: 'rdfs-optimized', name: 'RDFS (Optimized)'},\n {id: 'rdfs', name: 'RDFS'},\n {id: 'rdfsplus-optimized', name: 'RDFS-Plus (Optimized)'},\n {id: 'owl-horst-optimized', name: 'OWL-Horst (Optimized)'},\n {id: 'owl-horst', name: 'OWL-Horst'},\n {id: 'owl2-ql-optimized', name: 'OWL2-QL (Optimized)'},\n {id: 'owl2-ql', name: 'OWL2-QL'},\n {id: 'owl-max-optimized', name: 'OWL-Max (Optimized)'},\n {id: 'owl-max', name: 'OWL-Max'},\n {id: 'owl2-rl-optimized', name: 'OWL2-RL (Optimized)'},\n {id: 'owl2-rl', name: 'OWL2-RL'},\n\n];\n\nexport const REPOSITORY_TYPES = {graphdbRepo: 'graphdb', free: 'free', eeWorker: 'worker', eeMaster: 'master', ontop: 'ontop', se: 'se', fedx: 'fedx'};\nexport const FILENAME_PATTERN = new RegExp('^[a-zA-Z0-9-_]+$');\nexport const NUMBER_PATTERN = new RegExp('^[0-9]+$');\n","angular\n .module('graphdb.framework.rest.graphexplore.data.service', [])\n .factory('GraphDataRestService', GraphDataRestService);\n\nGraphDataRestService.$inject = ['$http'];\n\nconst CLASS_HIERARCHY_ENDPOINT = 'rest/class-hierarchy';\nconst DOMAIN_RANGE_ENDPOINT = 'rest/domain-range';\nconst DEPENDENCIES_ENDPOINT = 'rest/dependencies/';\nconst EXPORE_GRAPH_ENDPOINT = 'rest/explore-graph/';\n\nfunction GraphDataRestService($http) {\n return {\n // class hierarchy\n getClassHierarchyData,\n reloadClassHierarchy,\n getClassInstances,\n\n // domain-range graph\n getDomainRangeData,\n checkDomainRangeData,\n\n // class relationships\n getRelationshipsData,\n getRelationshipsClasses,\n getRelationshipsStatus,\n calculateRelationships,\n getPredicates,\n\n // instances graph\n getInstanceNode,\n getInstanceNodeLinks,\n\n // common\n getRdfsLabelAndComment\n };\n\n function getClassHierarchyData(graphURI) {\n return $http.get(CLASS_HIERARCHY_ENDPOINT, {\n params: {\n graphURI: graphURI\n }\n });\n }\n\n function reloadClassHierarchy(graphURI) {\n return $http.get(CLASS_HIERARCHY_ENDPOINT, {\n params: {\n doReload: true,\n graphURI: graphURI\n }\n });\n }\n\n function getClassInstances(targetUri) {\n return $http.get(`${CLASS_HIERARCHY_ENDPOINT}/class-instances`, {\n params: {\n targetUri\n }\n });\n }\n\n function checkDomainRangeData(targetUri) {\n return $http.head(DOMAIN_RANGE_ENDPOINT, {\n params: {\n targetUri\n }\n });\n }\n\n function getDomainRangeData(targetUri, collapsed) {\n return $http.get(DOMAIN_RANGE_ENDPOINT, {\n params: {\n targetUri,\n collapsed\n }\n });\n }\n\n function getRelationshipsData(selectedClasses, direction, graphURI) {\n return $http.get(`${DEPENDENCIES_ENDPOINT}matrix`, {\n params: {\n 'mode': direction,\n 'classes': _.map(selectedClasses, function (c) {\n return c.name;\n }),\n 'graphURI': graphURI\n }\n });\n }\n\n function getRelationshipsClasses(direction, graphURI) {\n return $http.get(`${DEPENDENCIES_ENDPOINT}classes`, {\n params: {\n 'mode': direction,\n 'graphURI': graphURI\n }\n });\n }\n\n function getRelationshipsStatus(graphURI) {\n return $http.get(`${DEPENDENCIES_ENDPOINT}status`, {\n params: {\n graphURI: graphURI\n }\n });\n }\n\n function calculateRelationships(graphURI) {\n return $http.get(`${DEPENDENCIES_ENDPOINT}update`, {\n params: {\n graphURI: graphURI\n }\n });\n }\n\n function getPredicates(sourceClass, destinationClass, graphURI) {\n return $http.get(`${DEPENDENCIES_ENDPOINT}predicates`, {\n params: {\n 'from': sourceClass,\n 'to': destinationClass,\n 'mode': 'all',\n graphURI: graphURI\n }\n });\n }\n\n function getInstanceNode(iri) {\n return $http.get(`${EXPORE_GRAPH_ENDPOINT}node`, {\n params: {\n iri\n }\n });\n }\n\n function getInstanceNodeLinks(iri) {\n return $http.get(`${EXPORE_GRAPH_ENDPOINT}links`, {\n params: {\n iri\n }\n });\n }\n\n function getRdfsLabelAndComment(targetUri, languages, extraParams) {\n const requestParams = extraParams || {};\n return $http({\n url: 'rest/explore/details',\n method: 'GET',\n params: _.extend(requestParams, {uri: targetUri, languages}),\n headers: {\n 'Accept': 'application/json'\n }\n });\n }\n}\n","angular\n .module('graphdb.framework.graphexplore.services.uiscroll', [])\n .factory('UiScrollService', UiScrollService);\n\nUiScrollService.$inject = ['$timeout'];\n\nfunction UiScrollService($timeout) {\n return {\n initLazyList: initLazyList\n };\n\n function initLazyList(index, count, success, position, data) {\n return $timeout(function () {\n const actualIndex = index + position - 1;\n const start = Math.max(0 - position, actualIndex);\n const end = Math.min(actualIndex + count - 1, data.length);\n if (start > end) {\n success([]);\n } else if ($.isArray(data)) {\n success(data.slice(start, end + 1));\n }\n }, 100, true);\n }\n}\n","angular\n .module('graphdb.framework.graphexplore.services.rdfsdetails', [])\n .factory('RdfsLabelCommentService', RdfsLabelCommentService);\n\nfunction RdfsLabelCommentService() {\n return {\n processAndFilterLabelAndComment: processAndFilterLabelAndComment\n };\n\n function processAndFilterLabelAndComment(response) {\n function processKeysWithColon(obj) {\n const newObj = {};\n for (let k in obj) {\n if (obj.hasOwnProperty(k)) {\n let origKey = k;\n if (k.indexOf(':') > -1) {\n origKey = k;\n k = k.split(':')[1].toLowerCase();\n }\n newObj[k] = obj[origKey];\n }\n }\n return newObj;\n }\n\n const results = response.results.bindings;\n const labels = [];\n const comments = [];\n _.each(results, function (value) {\n let processedObj;\n if (!angular.isUndefined(value.label)) {\n processedObj = processKeysWithColon(value.label);\n labels.push(processedObj);\n }\n\n if (!angular.isUndefined(value.comment)) {\n processedObj = processKeysWithColon(value.comment);\n comments.push(processedObj);\n }\n });\n\n const langFilter = function (item) {\n return item.lang === 'en' || item.lang === 'de';\n };\n\n const filteredRdfsLabel = $.grep(labels, langFilter)[0];\n const filteredRdfsComment = $.grep(comments, langFilter)[0];\n\n const rdfsLabel = !angular.isUndefined(filteredRdfsLabel)\n ? filteredRdfsLabel.value\n : labels.length > 0\n ? labels[0].value\n : undefined;\n\n const rdfsComment = !angular.isUndefined(filteredRdfsComment)\n ? filteredRdfsComment.value\n : comments.length > 0\n ? comments[0].value\n : undefined;\n\n return {\n rdfsLabel: rdfsLabel,\n rdfsComment: rdfsComment\n };\n }\n}\n","angular\n .module('graphdb.framework.rest.graphexplore.savedgraphs.service', [])\n .factory('SavedGraphsRestService', SavedGraphsRestService);\n\nSavedGraphsRestService.$inject = ['$http'];\n\nconst SAVED_GRAPHS_ENDPOINT = 'rest/explore-graph/saved';\n\nfunction SavedGraphsRestService($http) {\n return {\n getSavedGraphs,\n getSavedGraph,\n editSavedGraph,\n deleteSavedGraph,\n addNewSavedGraph\n };\n\n function getSavedGraphs() {\n return $http.get(SAVED_GRAPHS_ENDPOINT);\n }\n\n function getSavedGraph(id) {\n return $http.get(`${SAVED_GRAPHS_ENDPOINT}/${encodeURIComponent(id)}`);\n }\n\n function editSavedGraph(graph) {\n return $http.put(`${SAVED_GRAPHS_ENDPOINT}/${encodeURIComponent(graph.id)}`, graph);\n }\n\n function deleteSavedGraph(graph) {\n return $http.delete(`${SAVED_GRAPHS_ENDPOINT}/${encodeURIComponent(graph.id)}`);\n }\n\n function addNewSavedGraph(graph) {\n return $http.post(SAVED_GRAPHS_ENDPOINT, graph);\n }\n}\n","angular\n .module('graphdb.framework.rest.graphconfig.service', [])\n .factory('GraphConfigRestService', GraphConfigRestService);\n\nconst EXPLORE_GRAPH_ENDPOINT = 'rest/explore-graph/';\nconst EXPLORE_GRAPH_CONFIG_ENDPOINT = `${EXPLORE_GRAPH_ENDPOINT}config`;\n\nGraphConfigRestService.$inject = ['$http'];\n\nfunction GraphConfigRestService($http) {\n return {\n getGraphConfigs,\n getGraphConfigSamples,\n loadGraphForConfig,\n getConfig,\n createGraphConfig,\n updateGraphConfig,\n deleteGraphConfig,\n validateQuery\n };\n\n function getGraphConfigs() {\n return $http.get(EXPLORE_GRAPH_CONFIG_ENDPOINT);\n }\n\n function getGraphConfigSamples() {\n return $http.get(`${EXPLORE_GRAPH_ENDPOINT}samples`);\n }\n\n function loadGraphForConfig(config, includeInferred, linksLimit, startQuerySameAs) {\n return $http.get(`${EXPLORE_GRAPH_CONFIG_ENDPOINT}/graph/${encodeURIComponent(config.id)}?includeInferred=${includeInferred}&linksLimit=${linksLimit}&sameAsState=${startQuerySameAs}`);\n }\n\n function getConfig(id) {\n return $http.get(`${EXPLORE_GRAPH_CONFIG_ENDPOINT}/${encodeURIComponent(id)}`);\n }\n\n function createGraphConfig(config) {\n return $http.post(EXPLORE_GRAPH_CONFIG_ENDPOINT, config);\n }\n\n function updateGraphConfig(config) {\n return $http.put(`${EXPLORE_GRAPH_CONFIG_ENDPOINT}/${encodeURIComponent(config.id)}`, config);\n }\n\n function deleteGraphConfig(config) {\n return $http.delete(`${EXPLORE_GRAPH_CONFIG_ENDPOINT}/${encodeURIComponent(config.id)}`);\n }\n\n function validateQuery(query, queryType, params, all, oneOf) {\n return $http({\n method: 'POST',\n url: `${EXPLORE_GRAPH_ENDPOINT}validate`,\n data: {\n query,\n queryType,\n params,\n all,\n oneOf\n }\n });\n }\n}\n","import 'angular/utils/local-storage-adapter';\n\nconst modules = [\n 'pageslide-directive',\n 'ngAnimate',\n 'ui.scroll.jqlite',\n 'ui.scroll',\n 'angucomplete-alt',\n 'rzSlider',\n 'toastr',\n 'graphdb.framework.utils.localstorageadapter'\n];\n\nconst SAFARI_IE_EDGE_CLASS_LIMIT = 400;\nconst FIREFOX_CLASS_LIMIT = 50;\nconst CLASS_COUNT_THRESHOLD = 1500;\nconst CLASS_COUNT_THRESHOLD_IE = 25;\n\nangular\n .module('graphdb.framework.graphexplore.controllers.class', modules)\n .controller('RdfClassHierarchyCtlr', RdfClassHierarchyCtlr);\n\nRdfClassHierarchyCtlr.$inject = [\"$scope\", \"$rootScope\", \"$location\", \"$repositories\", \"$licenseService\", \"$window\", \"toastr\", \"GraphDataRestService\", \"UiScrollService\", \"RdfsLabelCommentService\", \"$timeout\", \"ModalService\", \"bowser\", \"LocalStorageAdapter\", \"LSKeys\", \"RDF4JRepositoriesRestService\", \"$translate\"];\n\nfunction RdfClassHierarchyCtlr($scope, $rootScope, $location, $repositories, $licenseService, $window, toastr, GraphDataRestService, UiScrollService, RdfsLabelCommentService, $timeout, ModalService, bowser, LocalStorageAdapter, LSKeys, RDF4JRepositoriesRestService, $translate) {\n $scope.classHierarchyData = {};\n $scope.instancesObj = {};\n $scope.instancesQueryObj = {};\n\n $scope.instancesObj.items = [];\n $scope.instancesNotFiltered = [];\n $scope.isWarningShowed = false;\n\n // Handle pageslide directive callbacks which incidentally appeared to be present in the angular's\n // scope, so we need to define our's and pass them to pageslide, otherwise it throws an error.\n $scope.onopen = $scope.onclose = () => angular.noop();\n\n $scope.currentBrowserLimit = 2000;\n if (bowser.firefox) {\n $scope.currentBrowserLimit = FIREFOX_CLASS_LIMIT;\n } else if (bowser.safari || bowser.msie || bowser.msedge) {\n $scope.currentBrowserLimit = SAFARI_IE_EDGE_CLASS_LIMIT;\n }\n\n // creating datasource for class instances data\n const datasource = {};\n let position = 0;\n let current = 0;\n $rootScope.key = \"\";\n datasource.get = function (index, count, success) {\n return UiScrollService.initLazyList(index, count, success, position, $scope.instancesObj.items);\n };\n\n let selectedGraph = allGraphs;\n\n const initView = function () {\n if (!$scope.getActiveRepository()) {\n return;\n }\n return RDF4JRepositoriesRestService.resolveGraphs()\n .success(function (graphsInRepo) {\n $scope.graphsInRepo = graphsInRepo.results.bindings;\n setSelectedGraphFromCache();\n }).error(function (data) {\n $scope.repositoryError = getError(data);\n toastr.error(getError(data), $translate.instant('graphexplore.error.getting.graphs'));\n });\n };\n\n const setSelectedGraphFromCache = function () {\n const selGraphFromCache = LocalStorageAdapter.get(`classHierarchy-selectedGraph-${$repositories.getActiveRepository()}`);\n if (selGraphFromCache !== null && $scope.graphsInRepo.some(graph => graph.contextID.uri === selGraphFromCache.contextID.uri)) {\n selectedGraph = selGraphFromCache;\n } else {\n LocalStorageAdapter.set(`classHierarchy-selectedGraph-${$repositories.getActiveRepository()}`, selectedGraph);\n }\n };\n\n $rootScope.$watch(function () {\n return $rootScope.key;\n }, function () {\n position = 0;\n _.each($scope.instancesObj.items, function (item) {\n if ($rootScope.key > item) position++;\n });\n current++;\n });\n\n datasource.revision = function () {\n return current;\n };\n // adapter implementation for ui-scroll directive\n $scope.adapterContainer = {adapter: {remain: true}};\n\n\n // events\n $scope.$on('goToDomainRangeGraphView', onGoToDomainRangeGraphView);\n $scope.$on('classCount', initClassCountSlider);\n $scope.$on('repositoryIsSet', onRepositoryIsSet);\n\n // objects\n $scope.datasource = datasource;\n\n // functions\n $scope.goToDomainRangeGraphView = goToDomainRangeGraphView;\n $scope.toggleClassInfoSidePanel = toggleClassInfoSidePanel;\n $scope.getActiveRepositoryNoError = getActiveRepositoryNoError;\n $scope.isSystemRepository = isSystemRepository;\n $scope.confirmReloadClassHierarchy = confirmReloadClassHierarchy;\n $scope.focusOnRoot = focusOnRoot;\n $scope.copyToClipboard = copyToClipboard;\n\n $scope.searchedClassCallback = searchedClassCallback;\n\n $scope.instancesQueryObj.query = \"\";\n $scope.instancesFilterFunc = instancesFilterFunc;\n\n initView();\n\n $scope.$watch('instancesObj.items', function () {\n if ($scope.instancesObj.items.length > 0) {\n $timeout(function () {\n $scope.adapterContainer.adapter.reload();\n }, 30);\n }\n });\n\n $scope.$watch('selectedClass', function () {\n if ($scope.showClassInfoPanel) {\n prepareDataForClassInfoSidePanel($scope.selectedClass);\n }\n });\n\n function instancesFilterFunc(inst) {\n return inst.resolvedUri\n .toLowerCase()\n .indexOf($scope.instancesQueryObj.query.toLowerCase()) >= 0;\n }\n\n function searchedClassCallback(selected) {\n if (selected) {\n const searchedClass = {name: selected.title};\n $rootScope.$broadcast('searchedClass', searchedClass);\n }\n }\n\n function initClassCountSlider(event, classCount, currentSliderValue) {\n if ($scope.classCountSlider.options && $scope.classCountSlider.options.ceil !== classCount) {\n // Force reset of the slider if it exists and its class count (ceil) is different from\n // the broadcast class count.\n $scope.classCountSlider = {};\n }\n\n const showBrowserCompatibleClassLimitWarning = function (classLimit) {\n if (bowser.chrome) {\n toastr.warning($translate.instant('graphexplore.disabling.animations', {classLimit: classLimit}),\n $translate.instant('graphexplore.reducing.visual.effects'));\n } else {\n toastr.warning($translate.instant('graphexplore.browser.performance', {browser: bowser.name, classLimit: classLimit}),\n $translate.instant('graphexplore.reducing.visual.effects'));\n }\n };\n\n if (!$scope.classCountSlider.value) {\n $scope.showExternalElements = true;\n $scope.classCountSlider = {\n value: classCount,\n options: {\n floor: 1,\n ceil: classCount,\n vertical: true,\n showSelectionBar: true,\n onChange: function () {\n $timeout(setNewCurrentSliderValue, 100, true);\n }\n }\n };\n\n if (LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE) === null) {\n if (classCount > $scope.currentBrowserLimit) {\n showBrowserCompatibleClassLimitWarning($scope.currentBrowserLimit);\n }\n }\n }\n\n const s = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_SWITCH_PREFIXES);\n const noSwitchPrefixes = (s != null) && (s !== \"true\");\n if (noSwitchPrefixes) {\n $scope.showExternalElements = true;\n }\n\n if (currentSliderValue) {\n $scope.classCountSlider.value = currentSliderValue;\n } else if (classCount >= CLASS_COUNT_THRESHOLD) {\n $scope.classCountSlider.value = CLASS_COUNT_THRESHOLD;\n toastr.warning($translate.instant('graphexplore.class.count.slider', {count: CLASS_COUNT_THRESHOLD}), $translate.instant('graphexplore.reducing.class.count'));\n }\n\n if (classCount >= CLASS_COUNT_THRESHOLD_IE && (!(window.ActiveXObject) && \"ActiveXObject\" in window) && !$scope.isWarningShowed) {\n $scope.classCountSlider.value = CLASS_COUNT_THRESHOLD_IE;\n $scope.isWarningShowed = true;\n toastr.warning($translate.instant('graphexplore.class.count.browser', {count: CLASS_COUNT_THRESHOLD_IE}), $translate.instant('graphexplore.reducing.class.count'));\n }\n\n $timeout(function () {\n $scope.$broadcast('reCalcViewDimensions');\n }, 200);\n\n // set this before the slider is moved by the user as we need it\n setNewCurrentSliderValue();\n\n // Modify the slider with the mouse wheel\n let lastTimeWheel = 0;\n $('rzslider').on('wheel', function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n // at least 100ms must have passed since last time we updated\n const now = new Date().getTime();\n if (now - lastTimeWheel > 100) {\n lastTimeWheel = now;\n } else {\n return;\n }\n\n e = e.originalEvent;\n\n let newValue = $scope.classCountSlider.value;\n if (e.deltaY <= -1) {\n newValue += 1;\n } else if (e.deltaY >= 1) {\n newValue -= 1;\n }\n\n if (newValue !== $scope.classCountSlider.value\n && newValue >= $scope.classCountSlider.options.floor\n && newValue <= $scope.classCountSlider.options.ceil) {\n $scope.$apply(function () {\n $scope.classCountSlider.value = newValue;\n $timeout(setNewCurrentSliderValue, 100, true);\n });\n }\n });\n }\n\n function setNewCurrentSliderValue() {\n $scope.currentSliderValue = $scope.classCountSlider.value;\n }\n\n function goToDomainRangeGraphView(selectedClass) {\n const uri = selectedClass.fullName;\n const name = selectedClass.name;\n\n GraphDataRestService.checkDomainRangeData(uri)\n .success(function (response, status) {\n if (status === 204) {\n toastr.warning($translate.instant('graphexplore.no.domain.range', {name: name}));\n } else {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_LAST_SELECTED_CLASS, $location.hash());\n $location\n .hash(\"\")\n .path(\"domain-range-graph\")\n .search(\"uri\", uri)\n .search(\"name\", name);\n }\n }).error(function () {\n toastr.error($translate.instant('graphexplore.error.request.failed', {name: name}));\n });\n }\n\n function onGoToDomainRangeGraphView(event, selectedClass) {\n goToDomainRangeGraphView(selectedClass);\n }\n\n function copyToClipboard(uri) {\n ModalService.openCopyToClipboardModal(uri);\n }\n\n function prepareDataForClassInfoSidePanel(selectedClass) {\n // generate SPARQL query for listing class instances in sparql view\n const uri = selectedClass.fullName;\n let name = selectedClass.name;\n\n // in case of no prefix available both name and uri are the same\n // so only take the local name of the uri a tab name for the SPARQL view\n if (name === uri) {\n const localNameStartIdx = name.lastIndexOf(\"#\");\n name = name.substring(localNameStartIdx + 1);\n }\n $scope.encodedUri = encodeURIComponent(uri);\n\n const query = \"prefix onto:<http://www.ontotext.com/> select ?s from onto:disable-sameAs { ?s a <\" + uri + \"> . }\";\n\n const encodedQuery = encodeURIComponent(query);\n\n // generate url for redirecting to sparql view, opening a new tab, writing the generated query and executing it\n $scope.viewInstancesUri = 'sparql?name=' + name + '&infer=true&sameAs=false&query=' + encodedQuery + '&execute=true';\n\n GraphDataRestService.getRdfsLabelAndComment(uri)\n .success(function (response) {\n $scope.rdfsLabel = response.label;\n $scope.rdfsComment = response.comment;\n $scope.expanded = false;\n })\n .error(function () {\n toastr.error(\"Error getting rdfs:label and rdfs:comment\");\n });\n\n // clear instances search input field when changing classes\n $scope.instancesQueryObj.query = '';\n\n // get class instances for selected rdf class\n $scope.instancesLoader = true;\n GraphDataRestService.getClassInstances(uri)\n .success(function (response) {\n $scope.instancesObj.items = [];\n _.each(response, function (value, key) {\n const obj = {};\n // TODO extract in core function isTriple(str)\n obj.type = (value.startsWith(\"<<\") && value.endsWith(\">>\")) ? \"triple\": \"uri\";\n obj.absUri = encodeURIComponent(value);\n obj.absUriNonEncoded = value;\n obj.resolvedUri = key;\n $scope.instancesObj.items.push(obj);\n });\n $scope.instancesLoader = false;\n\n $scope.instancesSearchPlaceholder = $scope.instancesObj.items.length < 1000 ? \"Search class instances\" : \"Search first 1000 class instances\";\n $scope.instancesNotFiltered = $scope.instancesObj.items;\n })\n .error(function () {\n toastr.error($translate.instant('graphexplore.error.instances.request'));\n });\n\n }\n\n function toggleClassInfoSidePanel() {\n $scope.showClassInfoPanel = !$scope.showClassInfoPanel;\n $rootScope.$broadcast('sidePanelClosed');\n }\n\n function getActiveRepositoryNoError() {\n if (!$scope.repositoryError) {\n return $repositories.getActiveRepository();\n }\n }\n\n function isSystemRepository() {\n return $repositories.isSystemRepository();\n }\n\n // Hack needed to force hide prefix toggle tooltip in order not be\n // visible after icon is switched\n $(document).ready(function () {\n $(\".prefix-toggle\").click(function () {\n $(\".tooltip\").hide();\n });\n });\n\n function focusOnRoot() {\n $scope.$broadcast(\"rootFocus\");\n }\n\n function refreshDiagramExternalElements() {\n $location.replace().hash(\"1\");\n\n // clear old instances data from previous repository\n $scope.instancesObj.items = [];\n\n // delete old instance count slider and reinit with classes count values\n // appropriate for the newly activated repository\n $scope.showExternalElements = false;\n\n $scope.showClassInfoPanel = false;\n\n LocalStorageAdapter.clearClassHieararchyState();\n\n // reset all watched scope variables to undefined in order to stop unwanted triggering of watches\n $scope.hidePrefixes = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES) === \"true\";\n $scope.currentSliderValue = undefined;\n $scope.classHierarchyData = {};\n\n // clear class search input field\n $rootScope.$broadcast('angucomplete-alt:clearInput');\n }\n\n function fixToolbar() {\n // For some reason angular behaves weirdly with the toolbar and its ng-show. Even though the condition\n // is updated, angular won't remove the ng-hide class and the toolbar will stay hidden.\n // Calling $apply(), $digest() or whatever doesn't help either so we have to resort to this instead.\n // The problem is easy to reproduce when viewing a deeper class and changing the repository.\n if ($scope.hasClassHierarchy()) {\n $timeout(function () {\n $('#toolbar').removeClass('ng-hide');\n }, 0);\n }\n }\n\n function reloadClassHierarchy() {\n refreshDiagramExternalElements();\n $scope.loader = true;\n $scope.hierarchyError = false;\n GraphDataRestService.reloadClassHierarchy(selectedGraph.contextID.uri)\n .success(function (response) {\n $scope.loader = false;\n $scope.classHierarchyData = response;\n fixToolbar();\n initClassCountSlider();\n })\n .error(function (response) {\n $scope.loader = false;\n $scope.hierarchyError = getError(response);\n toastr.error(getError(response), $translate.instant('graphexplore.error.rdf.class.request'));\n });\n }\n\n function confirmReloadClassHierarchy() {\n ModalService.openSimpleModal({\n title: $translate.instant('confirm.operation'),\n message: $translate.instant('graphexplore.calculating.hierarchy'),\n warning: true\n }).result\n .then(function () {\n reloadClassHierarchy();\n });\n }\n\n let currentActiveRepository = $repositories.getActiveRepository();\n function onRepositoryIsSet() {\n if (!$licenseService.isLicenseValid()) {\n return;\n }\n if (currentActiveRepository === $repositories.getActiveRepository()) {\n return;\n } else {\n currentActiveRepository = $repositories.getActiveRepository();\n }\n $scope.repositoryError = null;\n if (!currentActiveRepository) {\n return;\n }\n selectedGraph = allGraphs;\n initView()\n .then(getClassHierarchyData);\n }\n\n function getClassHierarchyData() {\n\n refreshDiagramExternalElements();\n\n if (!$scope.isSystemRepository() && $scope.isLicenseValid()) {\n $scope.hierarchyError = false;\n $scope.loader = true;\n GraphDataRestService.getClassHierarchyData(selectedGraph.contextID.uri)\n .success(function (response, status) {\n $scope.showExternalElements = true;\n $scope.loader = false;\n $scope.classHierarchyData = response;\n if (status === 207) {\n toastr.warning($translate.instant('graphexplore.update.diagram'), $translate.instant('graphexplore.repository.data.changed'));\n }\n fixToolbar();\n }).error(function (response) {\n $scope.loader = false;\n $scope.hierarchyError = getError(response);\n toastr.error(getError(response), $translate.instant('graphexplore.error.rdf.class.request'));\n });\n }\n }\n\n $scope.hasClassHierarchy = function () {\n return $scope.classHierarchyData.classCount && $scope.getActiveRepositoryNoError() && !$scope.isSystemRepository();\n };\n\n $scope.isLicenseValid = function () {\n return $licenseService.isLicenseValid();\n };\n\n\n $scope.chosenGraph = function (graph) {\n selectedGraph = graph;\n getClassHierarchyData();\n LocalStorageAdapter.set(`classHierarchy-selectedGraph-${$repositories.getActiveRepository()}`, selectedGraph);\n };\n\n $scope.getSelGraphValue = function () {\n return selectedGraph.contextID.value;\n };\n\n $scope.isAllGraphsSelected = function () {\n return $scope.getSelGraphValue() === 'All graphs'\n }\n}\n","import 'angular/utils/local-storage-adapter';\n\nangular\n .module('graphdb.framework.graphexplore.controllers.domainrange', [\n 'ui.scroll.jqlite',\n 'ui.scroll',\n 'ngSanitize',\n 'graphdb.framework.utils.localstorageadapter'\n ])\n .controller('DomainRangeGraphCtlr', DomainRangeGraphCtlr);\n\nDomainRangeGraphCtlr.$inject = ['$scope', '$location', '$rootScope', '$timeout', '$repositories', '$window', 'LocalStorageAdapter', 'LSKeys', 'GraphDataRestService', 'UiScrollService', 'ModalService', 'toastr', '$translate'];\n\nfunction DomainRangeGraphCtlr($scope, $location, $rootScope, $timeout, $repositories, $window, LocalStorageAdapter, LSKeys, GraphDataRestService, UiScrollService, ModalService, toastr, $translate) {\n $scope.predicatesObj = {};\n $scope.predicatesQueryObj = {};\n $scope.predicatesObj.items = [];\n $scope.predicatesQueryObj.query = '';\n $scope.predicatesListNotFiltered = [];\n $scope.predicatesSearchPlaceholder = 'Search predicates';\n\n // Handle pageslide directive callbacks which incidentally appeared to be present in the angular's\n // scope, so we need to define our's and pass them to pageslide, otherwise it throws an error.\n $scope.onopen = $scope.onclose = () => angular.noop();\n\n // creating datasource for predicates data\n const datasource = {};\n let position = 0;\n let current = 0;\n $rootScope.key = '';\n datasource.get = function (index, count, success) {\n return UiScrollService.initLazyList(index, count, success, position, $scope.predicatesObj.items);\n };\n $rootScope.$watch(function () {\n return $rootScope.key;\n }, function () {\n position = 0;\n _.each($scope.predicatesObj.items, function (item) {\n if ($rootScope.key > item) position++;\n });\n current++;\n });\n\n datasource.revision = function () {\n return current;\n };\n\n // adapter implementation for ui-scroll directive\n $scope.adapterContainer = {adapter: {remain: true}};\n\n\n const doCollapseEdges = LocalStorageAdapter.get(LSKeys.DOMAIN_RANGE_COLLAPSE_EDGES);\n if (doCollapseEdges === null) {\n $scope.collapseEdges = true;\n } else {\n $scope.collapseEdges = doCollapseEdges === 'true';\n }\n\n $scope.datasource = datasource;\n\n $scope.$on('reloadDomainRangeGraphView', reloadDomainRangeGraphView);\n $scope.$on('switchEdgeMode', switchEdgeMode);\n $scope.$on('repositoryIsSet', onRepositoryIsSet);\n $scope.$on('changeCollapsedEdgesState', function (event, collapsed) {\n $scope.collapseEdges = !collapsed;\n LocalStorageAdapter.set(LSKeys.DOMAIN_RANGE_COLLAPSE_EDGES, $scope.collapseEdges);\n });\n\n $scope.goToClassHierarchyView = goToClassHierarchyView;\n $scope.copyToClipboard = copyToClipboard;\n $scope.toggleCollapseEdgesState = toggleCollapseEdgesState;\n $scope.predicatesListFilterFunc = predicatesListFilterFunc;\n\n $scope.$watch('predicatesObj.items', function () {\n if ($scope.predicatesObj.items > 0) {\n $timeout(function () {\n $scope.adapterContainer.adapter.reload();\n }, 30);\n }\n });\n\n $scope.$watch('selectedPredicate', function () {\n if ($scope.showPredicatesInfoPanel) {\n prepareDataForPredicatesInfoSidePanel($scope.selectedPredicate);\n }\n });\n\n function predicatesListFilterFunc(pred) {\n return pred.resolvedUri\n .toLowerCase()\n .indexOf($scope.predicatesQueryObj.query.toLowerCase()) >= 0;\n }\n\n function prepareDataForPredicatesInfoSidePanel(selectedPredicate) {\n const targetNode = selectedPredicate.target;\n const sourceNode = selectedPredicate.source;\n\n $scope.encodedUri = encodeURIComponent(selectedPredicate.uri);\n\n $scope.sourceTargetObjectNodeUri = targetNode.objectPropClassUri\n ? targetNode.objectPropClassUri\n : sourceNode.objectPropClassUri;\n\n $scope.encodedSourceTargetObjectNodeUri = encodeURIComponent($scope.sourceTargetObjectNodeUri);\n\n $scope.sourceTargetObjectNodeName = targetNode.objectPropClassName\n ? targetNode.objectPropClassName\n : sourceNode.objectPropClassName\n ? sourceNode.objectPropClassName\n : '<i>Literal</i>';\n\n if ($scope.sourceTargetObjectNodeName.indexOf('Literal') === -1) {\n GraphDataRestService.getRdfsLabelAndComment($scope.sourceTargetObjectNodeUri)\n .success(function (response) {\n $scope.rdfsLabel = response.label;\n $scope.rdfsComment = response.comment;\n })\n .error(function () {\n toastr.error($translate.instant('domain.range.error.get.label.comment'));\n });\n } else {\n $scope.rdfsComment = undefined;\n $scope.rdfsLabel = undefined;\n }\n\n $scope.predicatesObj.items = [];\n\n // clear predicates search input field when changing edges\n $scope.predicatesQueryObj.query = '';\n\n // if target node of selected predicate has no edges then it is a left edge and edges should\n // come from the source node\n const allEdges = targetNode.allEdges\n ? targetNode.allEdges\n : sourceNode.allEdges;\n\n _.each(allEdges, function (pred) {\n const obj = {};\n obj.absUri = encodeURIComponent(pred.uri);\n obj.absUriNonEncoded = pred.uri;\n obj.resolvedUri = pred.name;\n obj.isImplicit = pred.implicit;\n $scope.predicatesObj.items.push(obj);\n });\n $scope.predicatesListNotFiltered = $scope.predicatesObj.items;\n }\n\n\n // Hack needed to force hide collapsed-mode toggle tooltip in order not be\n // visible after icon is switched\n $(document).ready(function () {\n $('.compact-mode-toggle').click(function () {\n $('.tooltip').hide();\n });\n });\n\n function reloadDomainRangeGraphView(event, selectedClass) {\n const uri = selectedClass.objectPropClassUri;\n const name = selectedClass.objectPropClassName;\n\n $location\n .path('domain-range-graph')\n .search('uri', uri)\n .search('name', name);\n }\n\n function switchEdgeMode(event, selectedClass) {\n $location\n .path('domain-range-graph')\n .search('uri', selectedClass.uri)\n .search('name', selectedClass.name)\n .search('collapsed', selectedClass.collapsed);\n }\n\n function goToClassHierarchyView() {\n const lastSelectedClass = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_LAST_SELECTED_CLASS);\n\n $location\n .search('')\n .hash(lastSelectedClass)\n .path('hierarchy');\n }\n\n function toggleCollapseEdgesState() {\n $scope.collapseEdges = !$scope.collapseEdges;\n $window.history.pushState({collapsed: $scope.collapseEdges}, 'domainRangePage', null);\n }\n\n function copyToClipboard(uri) {\n ModalService.openCopyToClipboardModal(uri);\n }\n\n\n let currentActiveRepository = $repositories.getActiveRepository();\n\n function onRepositoryIsSet() {\n if (currentActiveRepository === $repositories.getActiveRepository()) {\n return;\n } else {\n currentActiveRepository = $repositories.getActiveRepository();\n }\n goToClassHierarchyView();\n }\n}\n","const STATUS = {\n 'WAIT': 'WAIT',\n 'NO_REPO': 'NO_REPO',\n 'READY': 'READY',\n 'IN_PROGRESS': 'IN_PROGRESS',\n 'ERROR': 'ERROR'\n};\n\nconst modules = [\n 'ui.scroll.jqlite',\n 'ui.scroll',\n 'toastr',\n 'ui.bootstrap',\n 'graphdb.framework.core.services.repositories',\n 'graphdb.framework.utils.localstorageadapter'\n];\nconst allGraphs = {\n contextID: {\n type: \"all\",\n value: \"All graphs\",\n uri: \"\"\n }\n};\nObject.defineProperty(global, 'allGraphs', {\n get: () => {return allGraphs;}\n});\n\nangular\n .module('graphdb.framework.graphexplore.controllers.dependencies', modules)\n .controller('DependenciesChordCtrl', DependenciesChordCtrl)\n .config(['$tooltipProvider', function ($tooltipProvider) {\n $tooltipProvider.options({appendToBody: true});\n }])\n .filter('humanize', function () {\n return humanize;\n });\n\nfunction humanize(number) {\n if (number < 1000) {\n return number;\n }\n const si = ['K', 'M', 'G', 'T', 'P', 'H'];\n const exp = Math.floor(Math.log(number) / Math.log(1000));\n let result = number / Math.pow(1000, exp);\n result = (result % 1 > (1 / Math.pow(1000, exp - 1))) ? result.toFixed(2) : result.toFixed(0);\n return result + si[exp - 1];\n}\n\nDependenciesChordCtrl.$inject = ['$scope', '$rootScope', '$repositories', 'toastr', '$timeout', 'GraphDataRestService', 'UiScrollService', 'ModalService', 'LocalStorageAdapter', 'RDF4JRepositoriesRestService', '$translate'];\n\nfunction DependenciesChordCtrl($scope, $rootScope, $repositories, toastr, $timeout, GraphDataRestService, UiScrollService, ModalService, LocalStorageAdapter, RDF4JRepositoriesRestService, $translate) {\n\n let timer = null;\n\n $scope.status = !$repositories.getActiveRepository() ? STATUS.NO_REPO : STATUS.WAIT;\n\n let selectedGraph = allGraphs;\n\n const initView = function () {\n RDF4JRepositoriesRestService.resolveGraphs()\n .success(function (graphsInRepo) {\n $scope.graphsInRepo = graphsInRepo.results.bindings;\n setSelectedGraphFromCache();\n if (!$scope.isSystemRepository()) {\n $scope.status = 'WAIT';\n getRelationshipsStatus(true);\n } else if ($scope.status !== \"READY\") {\n getRelationshipsStatus();\n }\n }).error(function (data) {\n $scope.repositoryError = getError(data);\n toastr.error(getError(data), $translate.instant('graphexplore.error.getting.graph'));\n });\n };\n\n const setSelectedGraphFromCache = function () {\n const selGraphFromCache = LocalStorageAdapter.get(`dependencies-selectedGraph-${$repositories.getActiveRepository()}`);\n if (selGraphFromCache !== null && $scope.graphsInRepo.some(graph => graph.contextID.uri === selGraphFromCache.contextID.uri)) {\n selectedGraph = selGraphFromCache;\n } else {\n LocalStorageAdapter.set(`dependencies-selectedGraph-${$repositories.getActiveRepository()}`, selectedGraph);\n }\n };\n\n const getRelationshipsData = function (selectedClasses) {\n d3.select('#dependencies-chord').html('');\n\n $scope.status = STATUS.WAIT;\n\n GraphDataRestService.getRelationshipsData(selectedClasses, $scope.direction, selectedGraph.contextID.uri)\n .success(function (matrixData) {\n // Check classes empty\n $scope.dependenciesData = {\n matrix: matrixData.right,\n nodes: matrixData.left,\n hasLinks: _.sum(_.map(matrixData.right, function (arr) {\n return _.sum(arr);\n })) > 0,\n direction: $scope.direction\n };\n $scope.status = STATUS.READY;\n }).error(function (data) {\n $scope.status = STATUS.READY;\n toastr.error(getError(data), $translate.instant('graphexplore.error.dependencies.count'));\n });\n };\n\n const getRelationshipsClasses = function () {\n GraphDataRestService.getRelationshipsClasses($scope.direction, selectedGraph.contextID.uri)\n .success(function (classesData, status) {\n $scope.allClasses.items = _.filter(classesData, classFilterFunc);\n $scope.allNotFilteredClasses = classesData;\n $scope.selectedClasses = undefined;\n if (angular.isUndefined($scope.selectedClasses)) {\n $scope.selectedClasses = classesData.slice(0, 10);\n }\n getRelationshipsData($scope.selectedClasses);\n if (status === 207) {\n toastr.warning($translate.instant('graphexplore.update.diagram'), $translate.instant('graphexplore.repository.data.changed'));\n }\n });\n };\n\n const getRelationshipsStatus = function (force) {\n if ($scope.status === STATUS.READY && !force) {\n return;\n }\n $scope.status = STATUS.WAIT;\n GraphDataRestService.getRelationshipsStatus(selectedGraph.contextID.uri)\n .success(function (data) {\n $scope.status = data;\n if ($scope.status === STATUS.IN_PROGRESS) {\n if (timer !== null) {\n return;\n } else {\n timer = $timeout(getRelationshipsStatus, 2000);\n }\n }\n if ($scope.status === STATUS.READY) {\n if (timer !== null) {\n $timeout.cancel(timer);\n timer = null;\n }\n getRelationshipsClasses();\n }\n if ($scope.status.indexOf('ERROR;') === 0) {\n $scope.status = STATUS.ERROR;\n toastr.error($translate.instant('graphexplore.error.dependencies.calc', {error:$scope.status.substring('ERROR;'.length)}));\n }\n })\n .error(function (data) {\n $scope.status = STATUS.ERROR;\n toastr.error(getError(data), $translate.instant('graphexplore.error.dependencies.count.status'));\n });\n };\n\n $scope.allClasses = {};\n $scope.allClasses.items = [];\n $scope.allNotFilteredClasses = [];\n $scope.direction = 'all';\n\n const datasource = {};\n let position = 0;\n let current = 0;\n $rootScope.key = '';\n\n datasource.get = function (index, count, success) {\n return UiScrollService.initLazyList(index, count, success, position, $scope.allClasses.items);\n };\n\n $rootScope.$watch(function () {\n return $rootScope.key;\n }, function () {\n position = 0;\n _.each($scope.allClasses.items, function (item) {\n if ($rootScope.key > item) position++;\n });\n current++;\n });\n\n datasource.revision = function () {\n return current;\n };\n\n $scope.datasource = datasource;\n\n // adapter implementation for ui-scroll directive\n // reload\n $scope.adapterContainer = {adapter: {remain: true}};\n\n $scope.classQuery = {};\n $scope.classQuery.query = '';\n $scope.classFilterFunc = classFilterFunc;\n\n function classFilterFunc(c) {\n return c.name\n .toLowerCase()\n .indexOf($scope.classQuery.query.toLowerCase()) !== -1;\n }\n\n $scope.$watch('allClasses.items', function () {\n if ($scope.allClasses.items.length > 0) {\n $timeout(function () {\n $scope.adapterContainer.adapter.reload();\n }, 30);\n }\n });\n\n $scope.$watch('direction', function () {\n if (!$repositories.getActiveRepository() ||\n $scope.isSystemRepository() || $repositories.isActiveRepoFedXType()) {\n return;\n }\n initView();\n });\n\n $scope.$on('$destroy', function () {\n $timeout.cancel(timer);\n });\n\n $scope.isLoading = function () {\n return $scope.status === STATUS.IN_PROGRESS || $scope.status === STATUS.WAIT;\n };\n\n $scope.confirmCalculateDependencies = function () {\n ModalService.openSimpleModal({\n title: $translate.instant('confirm.operation'),\n message: $translate.instant('graphexplore.calculating.relationships'),\n warning: true\n }).result\n .then(function () {\n $scope.calculateDependencies();\n });\n };\n\n $scope.calculateDependencies = function () {\n $scope.status = STATUS.WAIT;\n $scope.selectedClasses = undefined;\n GraphDataRestService.calculateRelationships(selectedGraph.contextID.uri)\n .success(function (data) {\n if (data.indexOf('ERROR;') === 0) {\n toastr.error($translate.instant('graphexplore.error.dependencies.calc', {error:$scope.status.substring('ERROR;'.length)}));\n } else {\n getRelationshipsStatus();\n }\n })\n .error(function (data) {\n toastr.error($translate.instant('graphexplore.error.could.not.force.count', {error: getError(data)}));\n });\n };\n\n $scope.addClass = function (clazz) {\n $scope.selectedClasses.push(clazz);\n getRelationshipsData($scope.selectedClasses);\n };\n\n $scope.removeClass = function (clazz) {\n _.remove($scope.selectedClasses, function (c) {\n return c.name === clazz.name;\n });\n getRelationshipsData($scope.selectedClasses);\n };\n\n $scope.showClass = function (clazz) {\n $scope.classToShow = clazz;\n };\n\n $scope.isClassByNameShown = function (name) {\n return _.find($scope.selectedClasses, {name: name}) !== undefined;\n };\n\n $scope.addClassByName = function (name) {\n $scope.selectedClasses.push(_.find($scope.allClasses.items, {name: name}));\n getRelationshipsData($scope.selectedClasses);\n };\n\n $scope.removeClassByName = function (name) {\n _.remove($scope.selectedClasses, function (c) {\n return c.name === name;\n });\n getRelationshipsData($scope.selectedClasses);\n };\n\n\n $scope.removeAllClasses = function () {\n $scope.selectedClasses = [];\n getRelationshipsData($scope.selectedClasses);\n };\n\n $scope.isSystemRepository = function () {\n return $repositories.getActiveRepository() === 'SYSTEM';\n };\n\n function onRepositoryIsSet() {\n // clear class search on changing the repository\n $scope.classQuery = {};\n $scope.classQuery.query = '';\n $scope.repositoryError = null;\n selectedGraph = allGraphs;\n if (!$repositories.getActiveRepository() || $repositories.isActiveRepoFedXType()) {\n $scope.status = STATUS.NO_REPO;\n return;\n }\n initView();\n }\n\n const repoIsSetListener = $scope.$on('repositoryIsSet', onRepositoryIsSet);\n\n window.addEventListener('beforeunload', removeRepoIsSetListener);\n\n function removeRepoIsSetListener() {\n repoIsSetListener();\n window.removeEventListener('beforeunload', removeRepoIsSetListener);\n }\n\n $scope.selectGraph = function (graph) {\n selectedGraph = graph;\n getRelationshipsStatus(true);\n LocalStorageAdapter.set(`dependencies-selectedGraph-${$repositories.getActiveRepository()}`, selectedGraph);\n };\n\n $scope.getSelectedGraphValue = function () {\n return selectedGraph.contextID.value;\n };\n\n $scope.isAllGraphsSelected = function () {\n return $scope.getSelectedGraphValue() === 'All graphs'\n }\n}\n","import 'angular/core/services';\nimport D3 from 'lib/common/d3-utils.js';\nimport d3tip from 'lib/d3-tip/d3-tip-patch';\nimport 'angular/utils/local-storage-adapter';\nimport {NUMBER_PATTERN} from \"../../repositories/repository.constants\";\n\nconst modules = [\n 'ui.scroll.jqlite',\n 'ui.scroll',\n 'toastr',\n 'ui.bootstrap',\n 'ngTagsInput',\n 'graphdb.framework.utils.localstorageadapter'\n];\n\nangular\n .module('graphdb.framework.graphexplore.controllers.graphviz', modules)\n .controller('GraphsVisualizationsCtrl', GraphsVisualizationsCtrl)\n .controller('SaveGraphModalCtrl', SaveGraphModalCtrl)\n .config(['$tooltipProvider', function ($tooltipProvider) {\n $tooltipProvider.options({appendToBody: true});\n }]);\n\nGraphsVisualizationsCtrl.$inject = [\"$scope\", \"$rootScope\", \"$repositories\", \"$licenseService\", \"toastr\", \"$timeout\", \"$http\", \"ClassInstanceDetailsService\", \"AutocompleteRestService\", \"$q\", \"$location\", \"$jwtAuth\", \"UiScrollService\", \"ModalService\", \"$modal\", \"$window\", \"LocalStorageAdapter\", \"LSKeys\", \"SavedGraphsRestService\", \"GraphConfigRestService\", \"RDF4JRepositoriesRestService\", \"$translate\"];\n\nfunction GraphsVisualizationsCtrl($scope, $rootScope, $repositories, $licenseService, toastr, $timeout, $http, ClassInstanceDetailsService, AutocompleteRestService, $q, $location, $jwtAuth, UiScrollService, ModalService, $modal, $window, LocalStorageAdapter, LSKeys, SavedGraphsRestService, GraphConfigRestService, RDF4JRepositoriesRestService, $translate) {\n\n $scope.languageChanged = false;\n $scope.propertiesObj = {};\n $scope.propertiesQueryObj = {};\n\n $scope.propertiesObj.items = [];\n $scope.propertiesNotFiltered = [];\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.queryResultsMode = false;\n $scope.embedded = $location.search().embedded;\n $scope.openedNodeInfoPanel = undefined;\n\n $scope.invalidLimit = false;\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n\n $rootScope.$on('$translateChangeSuccess', function () {\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n });\n\n // Handle pageslide directive callbacks which incidentally appeared to be present in the angular's\n // scope, so we need to define our's and pass them to pageslide, otherwise it throws an error.\n $scope.onopen = $scope.onclose = () => angular.noop();\n\n // embedded and other params when the controller is initialized\n if ($scope.embedded && ($location.search().query ||\n $location.search().uri ||\n $location.search().config ||\n $location.search().saved)) {\n\n $scope.noGoHome = true;\n }\n\n // creating datasource for class properties data\n const datasource = {};\n let position = 0;\n let current = 0;\n let type2color = {};\n let colorIndex = 0;\n const nodeLabelMinFontSize = 16; // pixels\n // define zoom and drag behavior; keep this out of draw() to preserve state when nodes are added/removed\n const panAndZoom = d3.behavior.zoom()\n .scaleExtent([0.5, 10]);\n let transformValues;\n // build svg element\n const width = 1000;\n const height = 1000;\n let tipElement;\n let openedLink;\n\n $rootScope.key = \"\";\n\n datasource.get = function (index, count, success) {\n return UiScrollService.initLazyList(index, count, success, position, $scope.propertiesObj.items);\n };\n\n $rootScope.$watch(function () {\n return $rootScope.key;\n }, function () {\n position = 0;\n _.each($scope.propertiesObj.items, function (item) {\n if ($rootScope.key > item) {\n position++;\n }\n });\n current++;\n });\n\n datasource.revision = function () {\n return current;\n };\n\n $scope.datasource = datasource;\n\n // adapter implementation for ui-scroll directive\n $scope.adapterContainer = {adapter: {remain: true}};\n\n $scope.propertiesQueryObj.query = '';\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n $scope.propertiesFilterFunc = propertiesFilterFunc;\n\n $scope.resetState = function () {\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.configLoaded = null;\n $scope.queryResultsMode = false;\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = false;\n $scope.numberOfPinnedNodes = 0;\n\n // Reset type colours\n type2color = {};\n colorIndex = 0;\n };\n\n $scope.pushHistory = function (searchParams, state) {\n if ($scope.embedded) {\n searchParams.embedded = true;\n }\n $location.search(searchParams);\n $location.state(state);\n };\n\n $scope.goToHome = function () {\n $scope.resetState();\n $location.url(\"graphs-visualizations\");\n };\n\n $scope.shouldShowSettings = function () {\n return $scope.configLoaded && $scope.configLoaded.id === $scope.defaultGraphConfig.id;\n };\n\n $scope.shouldDisableSameAs = function () {\n const sameAsCheckbox = $('#sameAsCheck');\n if ($scope.settings && !$scope.settings['includeInferred'] && sameAsCheckbox.prop('checked')) {\n sameAsCheckbox.prop(\"checked\", false);\n $scope.settings['sameAsState'] = false;\n }\n\n return $scope.settings && !$scope.settings['includeInferred'];\n };\n\n function propertiesFilterFunc(item) {\n return item.key\n .toLowerCase()\n .indexOf($scope.propertiesQueryObj.query.toLowerCase()) >= 0;\n }\n\n $scope.$watch('propertiesObj.items', function () {\n if (angular.isDefined($scope.propertiesObj.items) && $scope.propertiesObj.items.length > 0) {\n $timeout(function () {\n $scope.adapterContainer.adapter.reload();\n }, 500);\n }\n });\n\n $scope.toggleMoreInfo = function (ev) {\n angular.element(ev.currentTarget).parent().next().toggle(200);\n angular.element(ev.currentTarget).children('span').toggleClass(\"icon-caret-down\").toggleClass(\"icon-caret-up\");\n };\n\n function updatePredicateLabels() {\n if (!$scope.saveSettings['showLinksText']) {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"none\");\n } else {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"block\");\n }\n }\n\n function updateNodeLabels(nodeLabels) {\n nodeLabels.each(function (d) {\n d.fontSize = D3.Text.calcFontSizeRaw(d.labels[0].label, d.size, nodeLabelMinFontSize, true);\n // TODO: get language and set it on the label html tag\n })\n .attr(\"height\", function (d) {\n return d.fontSize * 3;\n })\n // if this was kosher we would use xhtml:body here but if we do that angular (or the browser)\n // goes crazy and resizes/messes up other unrelated elements. div seems to work too.\n .append(\"xhtml:div\")\n .attr(\"class\", \"node-label-body\")\n .style(\"font-size\", function (d) {\n return d.fontSize + 'px';\n })\n .append('xhtml:div')\n .text(function (d) {\n return d.labels[0].label;\n });\n\n // Our own implementation of what browsers should really do but they either can't or don't do properly.\n // This code will look at each node's label element and check if the text fits. This is achieved by\n // checking the DOM properties scrollHeight/-Width and clientHeight/-Width. Generally if the scroll ones\n // are bigger than the client ones the content doesn't fit.\n $timeout(function () {\n $('.node-label-body div').each(function (i, e) {\n // Initial text is minus one character as we'll be adding a one-character suffix if we need to truncate\n let text = e.textContent.substring(0, e.textContent.length - 1);\n const suffixToInsert = '…';\n let endlessLoopGuard = 0;\n\n // Loop until the text fits\n while (endlessLoopGuard < 200 && (e.scrollHeight > e.clientHeight || e.scrollWidth > e.clientWidth)) {\n // Take previous text minus one character\n text = text.substring(0, text.length - 1);\n\n // Set the new text + suffix as textContent\n e.textContent = text + suffixToInsert;\n\n endlessLoopGuard++;\n }\n });\n }, 50);\n }\n\n $scope.copyToClipboard = copyToClipboard;\n\n function copyToClipboard(uri) {\n ModalService.openCopyToClipboardModal(uri);\n }\n\n $scope.defaultSettings = {\n linksLimit: 20,\n includeInferred: true,\n sameAsState: true,\n languages: ['en'],\n showLinksText: true,\n preferredTypes: [],\n rejectedTypes: [],\n preferredPredicates: [],\n rejectedPredicates: [\"http://dbpedia.org/property/logo\",\n \"http://dbpedia.org/property/hasPhotoCollection\",\n \"http://dbpedia.org/property/website\",\n \"http://dbpedia.org/property/homepage\",\n \"http://dbpedia.org/ontology/thumbnail\",\n \"http://xmlns.com/foaf/0.1/depiction\",\n \"http://xmlns.com/foaf/0.1/homepage\",\n \"http://xmlns.com/foaf/0.1/mbox\",\n \"http://dbpedia.org/ontology/wikiPage*\",\n \"http://dbpedia.org/property/wikiPage*\",\n \"http://factforge.net/*\"],\n preferredTypesOnly: false,\n preferredPredicatesOnly: false,\n includeSchema: true\n };\n // Static defaults before we do the actual dynamic default settings in initSettings\n $scope.saveSettings = angular.copy($scope.defaultSettings);\n\n function initSettings(principal) {\n const settingsFromPrincipal = principal.appSettings;\n\n // New style settings from principal\n $scope.defaultSettings.includeInferred = settingsFromPrincipal['DEFAULT_INFERENCE'];\n $scope.defaultSettings.sameAsState = settingsFromPrincipal['DEFAULT_INFERENCE'] && settingsFromPrincipal['DEFAULT_SAMEAS'],\n $scope.defaultSettings.includeSchema = settingsFromPrincipal['DEFAULT_VIS_GRAPH_SCHEMA'];\n\n const localStorageSettings = LocalStorageAdapter.get(LSKeys.GRAPHS_VIZ);\n if (localStorageSettings && typeof localStorageSettings === 'object') {\n // Patch existing settings\n try {\n $scope.saveSettings = localStorageSettings;\n if ($scope.saveSettings['includeSchema'] === undefined) {\n // Add the new defaults when migrating from an old GDB\n $scope.saveSettings['includeSchema'] = $scope.defaultSettings['includeSchema'];\n $scope.saveSettings['rejectedPredicates'] = [...$scope.saveSettings['rejectedPredicates'], ...$scope.defaultSettings['rejectedPredicates']].unique();\n }\n } catch (e) {\n $scope.saveSettings = angular.copy($scope.defaultSettings);\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n }\n } else {\n $scope.saveSettings = angular.copy($scope.defaultSettings);\n }\n }\n\n // Resolves race condition with security init if this is the first loaded page\n const principal = $jwtAuth.getPrincipal();\n if (principal) {\n // We already got a principal, safe to call initSettings\n initSettings(principal);\n } else {\n // No principal yet, delegate to the securityInit event to do call initSettings for us\n $scope.$on('securityInit', function () {\n initSettings($jwtAuth.getPrincipal());\n });\n }\n\n function renderSettings() {\n $scope.settings.languagesMap = _.map($scope.settings.languages, function (v) {\n return {'text': v};\n });\n\n $scope.settings.preferredTypesMap = _.map($scope.settings.preferredTypes, function (v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedTypesMap = _.map($scope.settings.rejectedTypes, function (v) {\n return {'text': v};\n });\n\n $scope.settings.preferredPredicatesMap = _.map($scope.settings.preferredPredicates, function (v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedPredicatesMap = _.map($scope.settings.rejectedPredicates, function (v) {\n return {'text': v};\n });\n }\n\n $scope.resetSettings = function () {\n $scope.settings = angular.copy($scope.defaultSettings);\n $scope.validateLinksLimit();\n renderSettings();\n };\n\n $scope.changeLimit = function (delta) {\n let linksLimit = $scope.settings.linksLimit + delta;\n if (linksLimit < 1) {\n linksLimit = 1;\n }\n if (linksLimit > 1000) {\n linksLimit = 1000;\n }\n $scope.settings.linksLimit = linksLimit;\n };\n\n $scope.validateLinksLimit = function () {\n $scope.invalidLimit = !NUMBER_PATTERN.test($scope.settings.linksLimit);\n }\n\n $scope.showSettings = function () {\n $scope.showInfoPanel = true;\n $scope.showFilter = true;\n $scope.showNodeInfo = false;\n $scope.showPredicates = false;\n if (!$scope.saveSettings) {\n $scope.settings = angular.copy($scope.defaultSettings);\n } else {\n $scope.settings = angular.copy($scope.saveSettings);\n }\n renderSettings();\n };\n\n $scope.reExpandNode = function () {\n if ($scope.rootNodeIri) {\n $scope.$broadcast(\"onRootNodeChange\", $scope.rootNodeIri);\n }\n };\n\n const loadGraphForQuery = function (queryString, sameAsParam, inferredParam) {\n const sendSameAs = (sameAsParam === undefined) ? ($scope.saveSettings['sameAsState']) : sameAsParam === true;\n const sendInferred = (inferredParam === undefined) ? ($scope.saveSettings['includeInferred']) : inferredParam === true;\n $scope.loading = true;\n $http({\n url: 'rest/explore-graph/graph',\n method: 'POST',\n headers: {\n 'Content-Type' : 'application/json'\n },\n data: {\n query: queryString,\n linksLimit: $scope.saveSettings['linksLimit'],\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: sendInferred,\n sameAsState: sendSameAs\n }\n }).then(function (response) {\n // Node draw will turn off loader\n initGraphFromResponse(response);\n }, function (response) {\n $scope.loading = false;\n toastr.error(getError(response.data), $translate.instant('graphexplore.error.cannot.load.graph'));\n });\n };\n\n $scope.updateSettings = function () {\n if ($scope.invalidLimit) {\n toastr.error($scope.INVALID_LINKS_TOOLTIP, $scope.INVALID_LINKS_MSG);\n return;\n }\n $scope.saveSettings = $scope.settings;\n $scope.saveSettings.languages = _.map($scope.saveSettings['languagesMap'], function (s) {\n return s['text'];\n });\n\n $scope.saveSettings.preferredTypes = _.map($scope.saveSettings['preferredTypesMap'], function (t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedTypes = _.map($scope.saveSettings['rejectedTypesMap'], function (t) {\n return t['text'];\n });\n\n $scope.saveSettings.preferredPredicates = _.map($scope.saveSettings['preferredPredicatesMap'], function (t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedPredicates = _.map($scope.saveSettings['rejectedPredicatesMap'], function (t) {\n return t['text'];\n });\n\n // TODO\n // reexpand root node\n if ($scope.rootNodeIri) {\n $scope.reExpandNode($scope.rootNodeIri);\n } else if ($scope.queryResultsMode && $location.search().query) {\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else if ($scope.configLoaded.startMode === 'query') {\n $scope.loadGraphConfig($scope.configLoaded);\n }\n\n updatePredicateLabels();\n\n $scope.showInfoPanel = false;\n $scope.showFilter = false;\n\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n };\n\n $scope.showInfoPanel = false;\n\n /**\n * Removes brackets and serial commas from IRIs\n * when used to create ids for links and markers,\n * because elements with ids that contain such\n * are not valid XHTML and cause a host problems\n * when trying to style individual elements\n * @param string\n * @returns {*}\n */\n function removeSpecialChars(string) {\n return string.replace(/[()']/g, \"\");\n }\n\n /**\n * Converts triple to link id or generates unique id (needed for arrows)\n * @param triple\n * @param tripleLike\n * @returns {string}\n */\n function convertTripleToLinkId(triple, tripleLike) {\n let tripleParts = triple.split(' ');\n if (tripleLike) {\n return [tripleParts[0], tripleParts[1], tripleParts[2]].join('>');\n }\n return [tripleParts[0], tripleParts[2]].join('>');\n }\n\n function convertLinkDataToLinkId(link) {\n return [link.source.iri, link.target.iri].join('>');\n }\n\n /**\n * If source or target of a link is a triple returns a x\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's x,\n * which afterwards will be overridden\n * @param node\n * @returns {number|number|*}\n */\n function getNodeX(node) {\n if (node.isTriple) {\n let el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.x !== \"undefined\") {\n return el.__data__.x;\n }\n }\n return node.x;\n }\n\n /**\n * If source or target of a link is a triple returns a y\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's y,\n * which afterwards will be overridden\n * @param node\n * @returns {number|number|*}\n */\n function getNodeY(node) {\n if (node.isTriple) {\n let el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.y !== \"undefined\") {\n return el.__data__.y;\n }\n }\n return node.y;\n }\n\n function createTriple(value) {\n let tripleParts = value.trim().split(' ');\n return `<<<${tripleParts[0]}> <${tripleParts[1]}> <${tripleParts[2]}>>>`;\n }\n\n /**\n * Creates unique arrow-marker id will allow change color and refX for particular one\n * @param d\n * @returns {string}\n */\n function createArrowMarkerUniqueID(d) {\n let source = d.source.isTriple ? convertTripleToLinkId(d.source.iri, true) : d.source.iri;\n let target = d.target.isTriple ? convertTripleToLinkId(d.target.iri, true) : d.target.iri;\n return removeSpecialChars(`${source}>${target}>marker`);\n }\n\n /**\n * Filters nodes array on a given field\n * @param iri\n * @param array\n * @returns {*}\n */\n function distinctBy(iri, array) {\n let keys = array.map(function (value) { return value[iri]; });\n return array.filter(function (value, index) { return keys.indexOf(value[iri]) === index; });\n }\n\n function Graph() {\n this.nodes = [];\n this.links = [];\n this.tripleNodes = new Map();\n this.tripleLinksCopy = new Map();\n\n this.addNode = function (node, x, y) {\n node.x = x;\n node.y = y;\n this.nodes.push(node);\n return node;\n };\n\n // computes a \"connectedness\" metric on each link, which is then used to hint for longer links.\n // this results in improved clustering and appearance.\n this.computeConnectedness = function () {\n // count the the number of times a given node is connected to other nodes\n // (only for nodes connected to more than one node)\n const counts = {};\n const seenLinks = {};\n _.each(this.links, function (link) {\n const i1 = link.source.iri;\n const i2 = link.target.iri;\n const seenKey = _.min([i1, i2]) + \"|\" + _.max([i1, i2]);\n if (!seenLinks[seenKey]) {\n seenLinks[seenKey] = 1;\n counts[i1] = (counts[i1] || 0) + 1;\n counts[i2] = (counts[i2] || 0) + 1;\n }\n });\n\n // computes the connectedness of each link based on the number of times its nodes were connected\n // (only for links to/from nodes connected to more than one node)\n _.each(this.links, function (link) {\n if (counts[link.source.iri] > 1 && counts[link.target.iri] > 1) {\n link.connectedness = Math.min(5, Math.max(counts[link.source.iri], counts[link.target.iri]) - 1);\n } else {\n link.connectedness = 0;\n }\n });\n };\n\n this.addAndMatchLinks = function (newLinks) {\n const nodes = this.nodes;\n Array.prototype.push.apply(this.links, matchLinksToNodes(newLinks, nodes));\n for (let key of graph.tripleLinksCopy.keys()) {\n if (graph.tripleLinksCopy.get(key).length === 1) {\n graph.tripleLinksCopy.delete(key);\n }\n }\n this.links = this.links.filter(link => link !== null);\n this.computeConnectedness();\n };\n\n const countLinks = function (d, links) {\n return findLinksForNode(d, links).length;\n };\n\n this.countLinks = countLinks;\n\n function findLinksForNode(d, links) {\n return _.filter(links, function (l) {\n return l.source.iri === d.iri || l.target.iri === d.iri;\n });\n }\n\n function linksTypes(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const types = _.map(linksForNode, function (l) {\n return (l.source.iri === d.iri ) ? l.target.types : l.source.types;\n });\n return _.uniq(_.flatten(types));\n }\n\n function linksPredicates(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const predicates = _.map(linksForNode, function (l) {\n return l.predicates;\n });\n return _.uniq(_.flatten(predicates));\n }\n\n this.linksTypes = linksTypes;\n\n this.linksPredicates = linksPredicates;\n\n /**\n * Removes generated triple links and related nodes\n * @param triplesToRemove\n */\n this.removeTriples = function (triplesToRemove) {\n let targetTriples = [];\n if (this.tripleNodes.size > 0) {\n triplesToRemove.forEach((source) => {\n if (this.tripleNodes.has(source)) {\n this.tripleNodes.delete(source);\n this.links = _.reject(this.links, function (l) {\n let sourceSplit = source.split('>');\n let lSource = convertTripleToLinkId(l.source.iri);\n let lTarget = convertTripleToLinkId(l.target.iri);\n // Handle triple targets\n if (lSource === source && graph.tripleNodes.delete(lTarget)) {\n let targetSplit = lTarget.split('>');\n targetTriples.push({\n source: targetSplit[0],\n target: targetSplit[1]\n });\n }\n let isRejected = lSource === source || lTarget === source || (l.source.iri === sourceSplit[0] && l.target.iri === sourceSplit[1]);\n if (isRejected) {\n graph.tripleLinksCopy.delete(`${lSource}>${lTarget}`);\n graph.tripleLinksCopy.delete(`${lTarget}>${lSource}`);\n }\n return isRejected;\n });\n }\n });\n }\n\n // This step is needed for removing artificially created links representing triples\n targetTriples.forEach((target) => {\n this.links = _.reject(this.links, function (l) {\n return l.source.iri === target.source && l.target.iri === target.target;\n });\n });\n }\n\n this.removeNode = function (d) {\n let triplesToRemove = [];\n this.links = _.reject(this.links, function (l) {\n let isRejected = l.source.iri === d.iri || l.target.iri === d.iri;\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'))\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n const links = this.links;\n this.nodes = _.reject(this.nodes, function (n) {\n return countLinks(n, links) === 0;\n });\n if (this.nodes.length === 0) {\n $scope.nodeSelected = false;\n }\n\n this.computeConnectedness();\n };\n\n this.removeNodeLeafLinks = function (d) {\n let triplesToRemove = [];\n let links = this.links;\n this.links = _.reject(this.links, function (l) {\n let isRejected = (l.source.iri === d.iri && countLinks(l.target, links) === 1 && !l.target.isTriple) ||\n (l.target.iri === d.iri && countLinks(l.source, links) === 1 && !l.source.isTriple);\n if (!isRejected) {\n let targetLinks;\n if (l.source.iri === d.iri && countLinks(l.target, links) === 2 && !l.target.isTriple) {\n targetLinks = findLinksForNode(l.target, links);\n } else if (l.target.iri === d.iri && countLinks(l.source, links) === 2 && !l.source.isTriple) {\n targetLinks = findLinksForNode(l.source, links);\n }\n if (!targetLinks) {\n return false;\n }\n // the node to which (or from which) d has link to has only two links, check if the second one is to d also\n isRejected = (targetLinks[0].source.iri === d.iri || targetLinks[0].target.iri) &&\n (targetLinks[1].source.iri === d.iri || targetLinks[1].target.iri);\n }\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'))\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n links = this.links;\n this.nodes = _.reject(this.nodes, function (n) {\n return countLinks(n, links) === 0 && n.iri !== d.iri;\n });\n\n this.computeConnectedness();\n };\n\n this.addTriple = function (triple, x, y) {\n triple.x = x;\n triple.y = y;\n triple.weight = 0;\n let key = convertTripleToLinkId(triple.iri);\n if (!this.tripleNodes.has(key)) {\n triple.weight = 10;\n this.tripleNodes.set(key, [triple]);\n } else {\n let value = this.tripleNodes.get(key);\n value.push(triple);\n this.tripleNodes.set(key, value);\n }\n }\n\n function matchLinksToNodes(newLinks, nodes) {\n return _.map(newLinks, function (link) {\n let source;\n let target;\n if (link.isTripleSource) {\n source = getTripleNode(link.source);\n } else {\n source = _.find(nodes, function (o) {\n return o.iri === link.source;\n })\n }\n if (link.isTripleTarget) {\n target = getTripleNode(link.target);\n } else {\n target = _.find(nodes, function (o) {\n return o.iri === link.target;\n })\n }\n let matchedLink = {\n \"source\": source,\n \"target\": target,\n \"predicates\": link.predicates\n };\n // make copy of links with triples in them\n if (link.isTripleSource || link.isTripleTarget) {\n let sourceId = matchedLink.source.isTriple ? convertTripleToLinkId(matchedLink.source.iri) : matchedLink.source.iri;\n let targetId = matchedLink.target.isTriple ? convertTripleToLinkId(matchedLink.target.iri) : matchedLink.target.iri;\n let linkId = `${sourceId}>${targetId}`;\n if (graph.tripleLinksCopy.has(linkId)) {\n let value = graph.tripleLinksCopy.get(linkId);\n value[0].predicates.push(...matchedLink.predicates);\n value.push(matchedLink);\n graph.tripleLinksCopy.set(linkId, value);\n return null;\n } else {\n graph.tripleLinksCopy.set(linkId, [matchedLink]);\n }\n }\n return matchedLink;\n });\n }\n\n this.copyState = function () {\n const nodesCopy = _.map(this.nodes, function (node) {\n return {\n iri: node.iri,\n isTriple: node.isTriple,\n size: node.size,\n labels: angular.copy(node.labels),\n types: angular.copy(node.types),\n rdfRank: node.rdfRank,\n x: node.x,\n y: node.y,\n fixed: node.fixed\n };\n });\n\n const triplesCopy = JSON.stringify(Array.from(this.tripleNodes.entries()));\n const tripleLinksCopy = JSON.stringify(Array.from(this.tripleLinksCopy.entries()));\n\n const linksCopy = _.map(this.links, function (link) {\n return {\n source: link.source.iri,\n isTripleSource: link.source.isTriple,\n target: link.target.iri,\n isTripleTarget: link.target.isTriple,\n predicates: link.predicates\n };\n });\n\n return {\n nodes: nodesCopy,\n links: linksCopy,\n tripleNodes: triplesCopy,\n tripleLinksCopy: tripleLinksCopy,\n colorIndex: colorIndex,\n type2color: type2color,\n scale: panAndZoom.scale(),\n translate: panAndZoom.translate()\n };\n };\n\n this.restoreState = function (state) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n\n this.nodes = angular.copy(state.nodes);\n // check if triples exists is needed for old configs\n this.tripleNodes = state.tripleNodes ? new Map(JSON.parse(state.tripleNodes)) : new Map();\n this.links = [];\n this.addAndMatchLinks(state.links);\n this.tripleLinksCopy = state.tripleLinksCopy ? new Map(JSON.parse(state.tripleLinksCopy)) : new Map();\n\n _.each(this.nodes, function (d) {\n if (d.fixed) {\n $scope.numberOfPinnedNodes++;\n }\n });\n\n if (angular.isDefined(state.colorIndex) && angular.isDefined(state.type2color)) {\n colorIndex = state.colorIndex;\n type2color = angular.copy(state.type2color);\n }\n\n if (angular.isDefined(state.translate) && angular.isDefined(state.scale)) {\n transformValues = \"translate(\" + state.translate[0] + \", \" + state.translate[1] + \") scale(\" + state.scale + \")\";\n panAndZoom.translate(state.translate);\n panAndZoom.scale(state.scale);\n }\n\n draw();\n };\n }\n\n let graph = new Graph();\n\n $scope.defaultGraphConfig = {\n id: 'default',\n name: 'Easy graph',\n startMode: 'search'\n };\n\n // Graph Config\n $scope.getGraphConfigs = function (graphCallback) {\n GraphConfigRestService.getGraphConfigs()\n .success(function (data) {\n $scope.graphConfigs = data;\n if (graphCallback) {\n graphCallback();\n }\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.configs.short.msg'));\n });\n };\n\n $scope.loadConfigForId = function (configId, successCallback) {\n if (configId === $scope.defaultGraphConfig.id) {\n $scope.loadGraphConfig($scope.defaultGraphConfig);\n } else {\n GraphConfigRestService.getConfig(configId)\n .success(function (data) {\n $scope.loadGraphConfig(data);\n successCallback();\n })\n .error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.could.not.load.config', {configId: configId}));\n });\n }\n };\n\n $scope.findConfigById = function (configId) {\n if (configId === $scope.defaultGraphConfig.id) {\n return $scope.defaultGraphConfig;\n }\n return $.grep($scope.graphConfigs, function (e) {\n return e.id === configId;\n })[0];\n };\n\n $scope.easyGraphSearch = function (iri) {\n $scope.configLoaded = $scope.defaultGraphConfig;\n $scope.openUri(iri);\n };\n\n $scope.loadGraphConfig = function (config) {\n $scope.configLoaded = config;\n if (config.startMode === 'search') {\n $scope.searchVisible = true;\n } else if (config.startMode === 'node' && config.startIRI) {\n $timeout(function () {\n $scope.openUri(config.startIRI, true);\n }, 0);\n } else if (config.startMode === 'query' && config.startGraphQuery) {\n $scope.loading = true;\n GraphConfigRestService.loadGraphForConfig(config, config.startQueryIncludeInferred, $scope.saveSettings['linksLimit'], config.startQuerySameAs)\n .then(function (response) {\n // Node drawing will turn off loader\n initGraphFromResponse(response);\n }, function (data) {\n $scope.loading = false;\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.load'));\n });\n }\n };\n\n $scope.deleteConfig = function (config) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.delete.graph', {configName: config.name}),\n warning: true\n }).result\n .then(function () {\n GraphConfigRestService.deleteGraphConfig(config)\n .success(function () {\n $scope.getGraphConfigs();\n $scope.refreshSavedGraphs();\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.cannot.delete.config'));\n });\n });\n };\n\n $scope.goToGraphConfig = function (config) {\n $scope.pushHistory({config: config.id}, {config: config});\n $scope.resetState();\n $scope.loadGraphConfig(config);\n };\n\n $window.onpopstate = function (event) {\n $scope.resetState();\n\n if (event.state) {\n if (event.state.config) {\n $scope.loadGraphConfig(event.state.config);\n if (event.state.uri) {\n $scope.openUri(event.state.uri, true);\n }\n } else if (event.state.savedGraph) {\n $scope.loadSavedGraph(event.state.savedGraph, true);\n }\n }\n };\n\n const initGraphFromQueryParam = function () {\n // view sparql\n if ($location.search().query) {\n $scope.searchVisible = false;\n $scope.queryResultsMode = true;\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else {\n // broadcasted event from view resource directive to take input value\n $scope.$on('onRootNodeChange', function (e, inputValue) {\n $scope.loading = true;\n if (angular.isDefined(inputValue)) {\n $scope.rootNodeIri = inputValue;\n $http({\n url: 'rest/explore-graph/node',\n method: 'GET',\n params: {\n iri: inputValue,\n config: $scope.configLoaded ? $scope.configLoaded.id : $scope.defaultGraphConfig.id,\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: $scope.saveSettings['includeInferred'],\n sameAsState: $scope.saveSettings['sameAsState']\n }\n }).then(function (response) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n const rootNode = graph.addNode(response.data, width / 2, height / 2);\n\n transformValues = \"translate(0, -70) scale(1)\";\n panAndZoom.translate([0, -70]);\n panAndZoom.scale(1);\n\n expandNode(rootNode, true);\n }).catch(function (err) {\n $scope.loading = false;\n toastr.error(getError(err), $translate.instant('graphexplore.error.could.not.load.graph'));\n });\n }\n });\n }\n\n if ($location.search().uri) {\n $scope.openUri($location.search().uri);\n }\n\n if ($location.search().saved) {\n SavedGraphsRestService.getSavedGraph($location.search().saved)\n .success(function (data) {\n $scope.loadSavedGraph(data);\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.could.not.open'));\n });\n }\n };\n\n const loadGraphFromQueryParam = function () {\n // view graph config\n if ($location.search().config) {\n $scope.loadConfigForId($location.search().config, initGraphFromQueryParam);\n } else if ($location.search().query || $location.search().uri) {\n $scope.loadGraphConfig($scope.defaultGraphConfig);\n initGraphFromQueryParam();\n } else {\n initGraphFromQueryParam();\n }\n };\n\n $scope.replaceIRIWithPrefix = function (iri) {\n const namespaces = $scope.namespaces;\n const namespacePrefix = _.findLast(namespaces, function (o) {\n return iri.indexOf(o.uri) === 0;\n });\n return namespacePrefix ? (namespacePrefix.prefix + \":\" + iri.substring(namespacePrefix.uri.length)) : iri;\n };\n\n function expandPrefix(str, namespaces) {\n const ABS_URI_REGEX = /^<?(http|urn).*>?/;\n if (!ABS_URI_REGEX.test(str)) {\n const uriParts = str.split(':');\n const uriPart = uriParts[0];\n const localName = uriParts[1];\n if (!angular.isUndefined(localName)) {\n const expandedUri = ClassInstanceDetailsService.getNamespaceUriForPrefix(namespaces, uriPart);\n if (expandedUri) {\n return expandedUri + localName;\n }\n }\n }\n return str;\n }\n\n $scope.addedTag = function (tag) {\n if (tag.text.indexOf(':') < 0) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'));\n return null;\n }\n tag.text = expandPrefix(tag.text, $scope.namespaces);\n $scope.pageslideExpanded = true;\n return tag;\n };\n\n $scope.validateTag = function (tag, category, wildcardOK) {\n if (tag.text.indexOf(':') < 0) {\n if (wildcardOK) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri.option'), category);\n } else {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'), category);\n }\n return false;\n }\n const wildcardPos = tag.text.indexOf('*');\n if (wildcardPos >= 0) {\n if (!wildcardOK) {\n toastr.warning($translate.instant('graphexplore.wildcards.not.allowed'), category);\n return false;\n } else if (wildcardPos < tag.text.length - 1) {\n toastr.warning($translate.instant('graphexplore.wildcards.last.char'), category);\n return false;\n }\n }\n return true;\n };\n\n $scope.getTagClass = function (tagText) {\n if (tagText.endsWith('*')) {\n return 'tag-item-wildcard';\n }\n return null;\n };\n\n $scope.getActiveRepository = function () {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLicenseValid = function() {\n return $licenseService.isLicenseValid();\n }\n\n // Flag to avoid calling repo init logic twice\n $scope.hasInitedRepository = false;\n\n // This method may be called twice - once by us explicitly and once by the repositoryInit event.\n // In some race conditions getActiveRepository() will be already set when we enter it the first\n // time but then we'll be called again by the event, so we need the above flag to avoid double\n // initialization and weirdness.\n function initForRepository(newRepo) {\n if (!$repositories.getActiveRepository() || $scope.hasInitedRepository && !newRepo) {\n return;\n }\n\n $scope.hasInitedRepository = true;\n\n if (!newRepo) {\n // Process params only if this isn't a repo that was just selected from the dropdown menu\n $scope.getGraphConfigs(loadGraphFromQueryParam);\n }\n\n // Inits namespaces for repo\n $scope.getNamespacesPromise = RDF4JRepositoriesRestService.getNamespaces($scope.getActiveRepository())\n .success(function (data) {\n const nss = _.map(data.results.bindings, function (o) {\n return {\"uri\": o.namespace.value, \"prefix\": o.prefix.value};\n });\n $scope.namespaces = _.sortBy(nss, function (n) {\n return n.uri.length;\n });\n\n checkAutocompleteStatus();\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.view.will.not.work'));\n });\n }\n\n function checkAutocompleteStatus() {\n if ($licenseService.isLicenseValid()) {\n $scope.getAutocompletePromise = AutocompleteRestService.checkAutocompleteStatus();\n }\n }\n\n $scope.$on('autocompleteStatus', function() {\n checkAutocompleteStatus();\n });\n\n $scope.$on('repositoryIsSet', function (event, args) {\n // New repo set from dropdown, clear init state\n if (args.newRepo) {\n $scope.hasInitedRepository = false;\n }\n\n initForRepository(args.newRepo);\n\n // New repo set from dropdown, clear state and go to home page\n if (args.newRepo) {\n $scope.resetState();\n // Quick-n-dirty way to get rid of the existing vis\n $('.graph-visualization svg').empty();\n\n // When we come from the sparql view and then change the repo though the dropdown,\n // should goToHome and reinit the view, for the search to view on the home page\n if ($location.search().query) {\n $scope.goToHome();\n initGraphFromQueryParam();\n }\n\n }\n });\n\n initForRepository();\n\n const multiClickDelay = 500; // max delay between clicks for multiple click events\n\n const nodeLabelRectScaleX = 1.75;\n\n const color1 = d3.scale.linear()\n .domain([0, 9])\n .range([\"hsl(0, 100%, 75%)\", \"hsl(360, 90%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n const color2 = d3.scale.linear()\n .domain([0, 9])\n .range([\"hsl(180, 50%, 75%)\", \"hsl(540, 40%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n $scope.getColor = function (type) {\n if (angular.isUndefined(type2color[type])) {\n type2color[type] = colorIndex;\n colorIndex++;\n }\n\n const index = type2color[type];\n if (index > 39) {\n return \"#c2c2c2\";\n } else if (index % 2 === 0) {\n return color1(index / 2);\n } else {\n return color2(index / 2);\n }\n };\n\n const force = d3.layout.force()\n .gravity(0.07)\n .size([width, height]);\n\n const svg = d3.select(\".main-container .graph-visualization\").append(\"svg\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\");\n\n let showNodeTipAndIconsTimer = 0;\n let removeIconsTimer = 0;\n\n const loader = new Loader();\n\n function draw(resetRootNode) {\n // remove all group elements and rec to rebuild the graph when the user clicks on it\n d3.selectAll(\"svg g\").remove();\n d3.selectAll(\"svg rect\").remove();\n d3.selectAll('.d3-tip').remove();\n d3.selectAll('.menu-events').remove();\n\n // zoom and drag event\n panAndZoom.on(\"zoom\", panAndZoomed);\n\n // building rectangular so we can bind zoom and drag effects\n svg.append(\"rect\")\n .attr(\"width\", width * 10)\n .attr(\"height\", height * 10)\n .attr(\"x\", -(width * 10 - width) / 2)\n .attr(\"y\", -(height * 10 - height) / 2)\n .style(\"fill\", \"none\")\n .style(\"pointer-events\", \"all\")\n .call(panAndZoom)\n .on(\"click\", function () {\n d3.event.stopPropagation();\n removeMenuIfVisible();\n // Clicking outside the graph stops the layout\n force.stop();\n });\n\n\n const container = svg.append(\"g\").attr(\"class\", \"nodes-container\")\n .attr(\"transform\", function () {\n if (angular.isDefined(transformValues) && !resetRootNode) {\n return transformValues;\n }\n return '';\n });\n\n const tip = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function () {\n const bbox = tipElement.getBoundingClientRect();\n return {\n top: (bbox.bottom + 10) + 'px',\n left: (bbox.left - 30) + 'px'\n };\n })\n .html(function (d) {\n let html = '';\n\n if (d.fixed) {\n // add pin icon if pinned down\n html += '<i class=\"icon-pin\"></i> ';\n }\n\n if (d.types.length > 0) {\n // mid-dot delimited types\n html += _.join(_.map(d.types, function (t) {\n return $scope.replaceIRIWithPrefix(t);\n }), ' \\u00B7 ');\n } else {\n html += '<i>No types</i>';\n }\n\n return html;\n });\n\n const numberOfPredLeft = function (d) {\n return d.predicates.length - 10;\n };\n\n // This will create text that will appear in d3tip\n const createTipText = function (d) {\n let html = '';\n html += _.join(_.map(d.predicates, function (p, index) {\n if (index === 0) {\n return getShortPredicate(p);\n // If we have less than or ten predicates should show them with middle dot separated\n } else if (index < 10) {\n return ' \\u00B7 ' + getShortPredicate(p);\n // On eleventh predicate just append how many more predicates left to show to the user\n } else if (index === 10) {\n const numOfPredLeft = numberOfPredLeft(d);\n // Show how many predicates left\n const textToShow = numOfPredLeft > 1 ? numOfPredLeft + ' predicates'\n : numOfPredLeft + ' predicate';\n return ' \\u00B7 ' + $translate.instant('graphexplore.tip.text', {textToShow: textToShow});\n }\n }), '');\n\n return html;\n };\n\n const calculateWidth = function (d) {\n const text = createTipText(d);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext(\"2d\");\n ctx.font = \"13px Arial\";\n\n if (d.predicates.length < 10) {\n return ctx.measureText(text).width;\n } else {\n return ctx.measureText(text).width / 2;\n }\n };\n\n let tipPredicateElement;\n let tipPredicateTimer;\n\n const tipPredicates = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function (d) {\n const bbox = tipPredicateElement.getBoundingClientRect();\n const textWidth = calculateWidth(d);\n return {\n top: (bbox.top - 30) + 'px',\n left: (bbox.left - 30) + 'px',\n width: textWidth + 'px'\n };\n })\n .html(function (d) {\n return createTipText(d);\n });\n\n let tipTimer;\n // Shows the tooltip for a node but with a slight delay\n const showTipForNode = function (d, event) {\n $timeout.cancel(tipTimer);\n const thisTipElement = tipElement = event.target;\n $timeout(function () {\n if (tipElement === thisTipElement) {\n tip.show(d, tipElement);\n }\n }, 300);\n };\n\n // Hides the tooltip for the node and resets some variables\n const hideTipForNode = function () {\n $timeout.cancel(tipTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n tipElement = null;\n tip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n };\n\n // Updates the text in the tooltip if already visible\n const updateTipForNode = function (d) {\n if (tipElement) {\n tip.show(d, tipElement);\n }\n };\n\n svg.call(tip);\n\n // Shows like tooltip list of predicates but with a slight delay\n const showPredicateToolTip = function (d) {\n $timeout.cancel(tipPredicateTimer);\n const thisPredicateTipElement = tipPredicateElement = d3.event.target;\n $timeout(function () {\n if (tipPredicateElement === thisPredicateTipElement && d.predicates.length > 1) {\n tipPredicates.show(d, tipPredicateElement);\n }\n }, 300);\n };\n\n // Hides the tooltip with predicates and resets some variables\n const hidePredicateToolTip = function () {\n $timeout.cancel(tipPredicateTimer);\n tipPredicateElement = null;\n tipPredicates.hide();\n };\n\n svg.call(tipPredicates);\n\n let link = svg.selectAll(\".link\");\n let node = svg.selectAll(\".node\");\n\n force.nodes(graph.nodes).charge(-3000);\n\n force.links(graph.links).linkDistance(function (l) {\n if (l.source.isTriple || l.target.isTriple) {\n return 0;\n }\n // link distance depends on length of text with an added bonus for strongly connected nodes,\n // i.e. they will be pushed further from each other so that their common nodes can cluster up\n return getPredicateTextLength(l) + 30 * l.connectedness;\n });\n\n // arrow markers\n container.append(\"defs\").selectAll(\"marker\")\n .data(force.links())\n .enter().append(\"marker\")\n .attr(\"class\", \"arrow-marker\")\n .attr(\"id\", function (d) {\n return createArrowMarkerUniqueID(d);\n })\n .attr(\"viewBox\", \"0 -5 10 10\")\n .attr(\"refX\", function (d) {\n // The positioning of the arrow for triple target nodes differ from normal ones\n return d.target.isTriple ? 11 : d.target.size + 11;\n })\n .attr(\"refY\", 0)\n .attr(\"markerWidth\", 10)\n .attr(\"markerHeight\", 10)\n .attr(\"orient\", \"auto\")\n .append(\"path\")\n .attr(\"d\", \"M0,-5L10,0L0,5 L10,0 L0, -5\");\n\n // add the links, nodes, predicates and node labels\n link = container.selectAll(\".link\")\n .data(graph.links)\n .enter().append(\"g\")\n .attr(\"class\", \"link-wrapper\")\n .attr(\"id\", function (d) {\n return removeSpecialChars(convertLinkDataToLinkId(d));\n })\n .append(\"line\")\n .attr(\"class\", \"link\")\n .style(\"stroke-width\", 1)\n .style(\"fill\", \"transparent\")\n .style(\"marker-end\", function (d) {\n let targetArrowId = createArrowMarkerUniqueID(d);\n return `url(#${targetArrowId})`;\n });\n\n const predicate = container.selectAll(\".link-wrapper\")\n .append(\"text\")\n .text(function (d) {\n return getPredicate(d);\n })\n .attr(\"class\", function (d) {\n if (d.predicates.length > 1 || graph.tripleNodes.has(convertLinkDataToLinkId(d))) {\n return \"predicates\";\n }\n return \"predicate\";\n })\n .attr(\"dy\", \"-0.5em\")\n .style(\"text-anchor\", \"middle\")\n .style(\"display\", $scope.saveSettings.showLinksText ? \"\" : \"none\")\n .on(\"mouseover\", function (d) {\n d3.event.stopPropagation();\n showPredicateToolTip(d);\n })\n .on('mouseout', hidePredicateToolTip)\n .on(\"click\", function (d) {\n d3.event.stopPropagation();\n linkActions(d);\n });\n\n // node events and variables\n let mouseEventTimer;\n let upEventLast = 0;\n let virtualClickEventTimer = 0;\n let moveEventCount = 0;\n\n // tracks mousedown and touchstart events in order to count single or double click\n // (checked in upEventHandler)\n const downEventHandler = function () {\n if (d3.event.button && d3.event.button !== 0) {\n return;\n }\n\n hideTipForNode();\n $timeout.cancel(mouseEventTimer);\n $scope.showPredicates = false;\n if (d3.event.timeStamp - upEventLast < multiClickDelay) {\n virtualClickEventTimer++;\n } else {\n virtualClickEventTimer = 1;\n }\n\n upEventLast = d3.event.timeStamp;\n\n d3.event.preventDefault();\n };\n\n // builds upon downEventHandler and adds additional functionality for touch devices\n const touchStartEventHandler = function (d) {\n downEventHandler();\n\n // for touch devices we track touch and hold for 1s in order to remove a node\n moveEventCount = 0;\n mouseEventTimer = $timeout(function () {\n if (moveEventCount < 5) {\n // remove the node only if not many move events were fired,\n // this avoids conflict with dragging nodes\n hideNode(d);\n }\n mouseEventTimer = null;\n virtualClickEventTimer = 0;\n }, 1000);\n };\n\n // tracks the number of move events (checked in the touchend event handler)\n const moveEventHandler = function () {\n moveEventCount++;\n };\n\n const showNodeTipAndIcons = function (d) {\n if (!d.isBeingDragged) {\n const event = d3.event;\n $timeout.cancel(removeIconsTimer);\n showNodeTipAndIconsTimer = $timeout(() => {\n if (expandNodeIcons(d, this)) {\n showTipForNode(d, event);\n }\n }, 400);\n }\n };\n\n const upEventHandler = function (d) {\n if (d3.event.button && d3.event.button !== 0) {\n return;\n }\n\n $timeout.cancel(mouseEventTimer);\n\n const event = d3.event;\n const element = this;\n if (d3.event.timeStamp - upEventLast < multiClickDelay) {\n if (virtualClickEventTimer === 1) {\n mouseEventTimer = $timeout(function () {\n clickedNode(d, element, event);\n }, 40 + multiClickDelay - (d3.event.timeStamp - upEventLast));\n } else if (virtualClickEventTimer === 2) {\n // expand node\n const shownLinks = graph.countLinks(d, graph.links);\n if (shownLinks <= $scope.saveSettings['linksLimit']) {\n expandNode(d, false, element.parentNode);\n } else {\n toastr.info($translate.instant('graphexplore.increase.limit'), $translate.instant('graphexplore.node.at.max'));\n }\n $scope.closeInfoPanel();\n }\n }\n\n d3.event.preventDefault();\n };\n\n // Shows growing or shrinking pin animation\n function showPinAnimation(d, type) {\n let startSize;\n let endSize;\n let startOpacity;\n let endOpacity;\n let animate = true;\n\n if (type === 'down') {\n startSize = d.size * 2;\n endSize = d.size / 3;\n startOpacity = 0.8;\n endOpacity = 0.3;\n } else if (type === 'down-fixed') {\n startSize = d.size * 2;\n endSize = d.size;\n startOpacity = 0.8;\n endOpacity = 0.66;\n } else if (type === 'up') {\n startSize = d.size / 3;\n endSize = d.size * 2;\n startOpacity = 0.3;\n endOpacity = 0.8;\n } else if (type === 'fixed') {\n startSize = d.size;\n startOpacity = 0.66;\n animate = false;\n } else {\n return; // unknown\n }\n\n let pin = container.selectAll('.node-wrapper')\n .filter(function (innerD) {\n return innerD === d;\n })\n .append('text')\n .text('\\ue90f') // pin icon\n .classed('icon-any pinned', true)\n .style('font-size', startSize + 'px')\n .attr('x', function (d) {\n return d.x;\n })\n .attr('y', function (d) {\n return d.y;\n })\n .attr('opacity', startOpacity);\n\n if (type === 'fixed' || type === 'down-fixed') {\n d.pin = pin;\n }\n\n if (animate) {\n pin = pin.transition()\n .duration(1000)\n .style('font-size', function () {\n return endSize + 'px';\n })\n .attr('opacity', endOpacity);\n\n if (type !== 'down-fixed') {\n pin.remove();\n }\n }\n }\n\n function removePin() {\n d3.select('.pinned').remove();\n }\n\n // Unfixes nodes that were dragged previously\n const rightClickHandler = function (d) {\n if (d3.event.shiftKey) {\n // Do nothing with shift key, use to access context menu\n return;\n }\n\n d3.event.preventDefault();\n\n removeMenuIfVisible();\n $scope.closeInfoPanel();\n\n if (d.fixed) {\n // unpin\n $scope.numberOfPinnedNodes--;\n d.fixed = false;\n showPinAnimation(d, 'up');\n force.resume();\n } else {\n // pin down\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down');\n }\n // update pin in tooltip\n updateTipForNode(d);\n };\n\n const drag = d3.behavior.drag()\n .origin(function (d) {\n return d;\n })\n .on(\"dragstart\", dragstarted)\n .on(\"drag\", dragged)\n .on(\"dragend\", dragended);\n\n\n function dragstarted(d) {\n if (d3.event.sourceEvent.button === 0) {\n d.fixedBeforeDrag = d.fixed;\n d.isBeingDragged = true;\n d.beginDragging = true;\n removeMenuIfVisible();\n d3.event.sourceEvent.stopPropagation();\n d3.select(this).classed(\"dragging\", true);\n }\n }\n\n function dragged(d) {\n if (d.isBeingDragged) {\n // reset click counter to avoid conflicts between clicks and drags\n virtualClickEventTimer = 0;\n\n d.px = d3.event.x;\n d.py = d3.event.y;\n if (!d.fixed) {\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down-fixed');\n } else if (d.beginDragging) {\n showPinAnimation(d, 'fixed');\n }\n d.pinWasFixed = true;\n d.beginDragging = null;\n\n force.resume();\n }\n }\n\n function dragended(d) {\n if (d.isBeingDragged) {\n if (d.pinWasFixed) {\n d.pinWasFixed = null;\n removePin();\n }\n d.isBeingDragged = false;\n d3.select(this).classed(\"dragging\", false);\n }\n }\n\n node = container.selectAll(\".node\")\n .data(graph.nodes)\n .enter().append(\"g\")\n .attr(\"class\", \"node-wrapper\")\n .attr(\"id\", function (d) {\n return d.iri;\n })\n .append(\"circle\")\n .attr(\"class\", \"node\")\n .attr(\"r\", function (d) {\n return d.size;\n })\n .style(\"fill\", function (d) {\n if (d.types === \"greyColor\") {\n return \"c2c2c2\";\n }\n return $scope.getColor(d.types[0]);\n })\n .call(drag)\n .on('mouseover', showNodeTipAndIcons)\n .on('mouseout', hideTipForNode)\n .on(\"mousedown\", downEventHandler)\n .on(\"touchstart\", touchStartEventHandler)\n // no need to track move for mouse\n .on(\"touchmove\", moveEventHandler)\n .on(\"mouseup\", upEventHandler)\n .on(\"touchend\", upEventHandler)\n .on(\"contextmenu\", rightClickHandler);\n\n const nodeLabels = container.selectAll(\".node-wrapper\").append(\"foreignObject\")\n .style(\"pointer-events\", \"none\")\n .attr(\"width\", function (d) {\n return d.size * 2 * nodeLabelRectScaleX;\n });\n // height will be computed by updateNodeLabels\n\n container.insert(\"g\").attr(\"class\", \"menu-events\");\n\n updateNodeLabels(nodeLabels);\n\n force.on(\"tick\", function () {\n // recalculate nodes positions and repel them if they collide\n let q = d3.geom.quadtree(graph.nodes);\n let i = 0;\n const n = graph.nodes.length;\n // FIXME while (++i < n) q.visit(collide(graph.nodes[i]));\n\n // recalculate links attributes\n link.attr(\"x1\", function (d) {\n return getNodeX(d.source);\n }).attr(\"y1\", function (d) {\n return getNodeY(d.source);\n }).attr(\"x2\", function (d) {\n return getNodeX(d.target);\n }).attr(\"y2\", function (d) {\n return getNodeY(d.target);\n });\n\n // recalculate predicates attributes\n predicate.attr(\"x\", function (d) {\n let sourceX = getNodeX(d.source);\n let targetX = getNodeX(d.target);\n return d.x = (sourceX + targetX) * 0.5;\n }).attr(\"y\", function (d) {\n let sourceY = getNodeY(d.source);\n let targetY = getNodeY(d.target);\n return d.y = (sourceY + targetY) * 0.5;\n }).attr(\"transform\", function (d) {\n const angle = findAngleBetweenNodes(d, d.direction);\n return \"rotate(\" + angle + \", \" + d.x + \", \" + d.y + \")\";\n });\n\n // recalculate nodes attributes\n node.attr(\"cx\", function (d) {\n return d.x;\n }).attr(\"cy\", function (d) {\n return d.y;\n });\n\n // update node loader position\n container.select(\".node-loader\").attr(\"x\", function (d) {\n return d.x - d.size + 3; //square svg is not perfectly centered and need +3 units on x ordinate to fit in circle\n }).attr(\"y\", function (d) {\n return d.y - d.size;\n });\n\n container.select(\".loader-container\").attr(\"cx\", function (d) {\n return d.x;\n }).attr(\"cy\", function (d) {\n return d.y;\n });\n\n nodeLabels.attr(\"x\", function (d) {\n return d.x - (d.size * nodeLabelRectScaleX);\n }).attr(\"y\", function (d) {\n // the height of the nodeLabel box is 3 times the fontSize computed by updateNodeLabels\n // and we want to offset it so that its middle matches the centre of the circle, hence divided by 2\n return d.y - 3 * d.fontSize / 2;\n });\n\n // Update position of shrinking pin animation (if any)\n d3.select('.pinned').attr(\"x\", function (d) {\n return d.x;\n }).attr(\"y\", function (d) {\n return d.y;\n });\n });\n\n function panAndZoomed() {\n transformValues = \"translate(\" + d3.event.translate + \") scale(\" + d3.event.scale + \")\";\n container.attr(\"transform\", transformValues);\n }\n\n if (angular.isDefined(loader)) {\n loader.setLoadingState(false);\n }\n\n if ($scope.loading) {\n $scope.loading = false;\n }\n\n d3.selectAll('.link-wrapper').each(function () {\n const source = $(this).attr(\"id\").split(\">\")[0];\n const target = $(this).attr(\"id\").split(\">\")[1];\n d3.selectAll('.link').each(function (link) {\n let sourceId = removeSpecialChars(link.source.iri);\n let targetId = removeSpecialChars(link.target.iri);\n if (sourceId === target && targetId === source) {\n let twoWayLinkID = sourceId;\n twoWayLinkID += \">\";\n twoWayLinkID += targetId;\n const textNode = document.createTextNode(' \\u27F6');\n document.getElementById(twoWayLinkID).lastChild.appendChild(textNode);\n link.direction = \"double\";\n }\n });\n });\n\n d3.selectAll('.d3-actions-tip').remove();\n\n force.start();\n }\n\n /* FIXME\n // check for collision of the nodes\n function collide(node, bigger) {\n return function (quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n var x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.size + quad.point.size;\n if (l < r) {\n l = (l - r) / l * .5;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n */\n\n draw();\n\n // find angle between pair of nodes so we can position predicates\n function findAngleBetweenNodes(linkedNodes, direction) {\n const p1 = {\n x: getNodeX(linkedNodes.source),\n y: getNodeY(linkedNodes.source)\n };\n\n const p2 = {\n x: getNodeX(linkedNodes.target),\n y: getNodeY(linkedNodes.target)\n };\n if (direction) {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n } else {\n const angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n if (angleDeg <= 90 && angleDeg >= -90) {\n return angleDeg;\n }\n return (angleDeg > 0 ? -1 : 1) * (180 - Math.abs(angleDeg));\n }\n }\n\n const menuEvents = new MenuEvents();\n\n // expanding and collapsing of the nodes\n function clickedNode(d, element, event) {\n $scope.showInfoPanel = false;\n $scope.showPredicates = false;\n $scope.showNodeInfo = false;\n\n // shift + ctrl/cmd + click focuses node\n if (event.shiftKey && (event.ctrlKey || event.metaKey)) {\n $rootScope.$broadcast(\"onRootNodeChange\", d.iri);\n return false;\n }\n\n // ctrl/cmd + click hides the node\n if (event.ctrlKey || event.metaKey) {\n hideNode(d);\n return false;\n }\n\n // If value of openedNodeInfoPanel is different than \"undefined\"\n // we evaluate if clicked node value is the same and close it\n if (typeof $scope.openedNodeInfoPanel !== \"undefined\" && $scope.openedNodeInfoPanel === d) {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n return false;\n }\n\n showNodeInfo(d);\n return true;\n }\n\n function expandNodeIcons(d, element) {\n if ($scope.showInfoPanel) {\n return false;\n }\n\n if (menuEvents.closeIcon || menuEvents.expandIcon || menuEvents.focusIcon || menuEvents.copyURIIcon) {\n menuEvents.removeIcons();\n }\n\n // If nodes are still rearranging result of force.alpha() is more than 0.05\n // and we don't want to show node's icons on mouse over and stop rearrangement\n if (force.alpha() < 0.05) {\n menuEvents.initIcons(d, element.parentNode);\n force.stop();\n\n return true;\n }\n\n return false;\n }\n\n function hideNode(d) {\n graph.removeNode(d);\n draw();\n }\n\n function collapseNode(d) {\n d.isExpanded = false;\n graph.removeNodeLeafLinks(d);\n draw();\n }\n\n function initGraph(response) {\n $scope.nodeSelected = true;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n transformValues = \"translate(0, -70) scale(1)\";\n panAndZoom.translate([0, -70]);\n panAndZoom.scale(1);\n }\n\n function initGraphFromResponse(response) {\n initGraph(response);\n renderGraphFromResponse(response);\n }\n\n function renderGraphFromResponse(response, d, isStartNode) {\n let linksFound = response.data;\n // filter existing links\n linksFound = _.filter(linksFound, function (newLink) {\n return _.findIndex(graph.links,\n function (existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n let linksCopy = [];\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n let linkCopy = tripleLinksIt.next().value;\n linkCopy.forEach(link => {\n linksCopy.push(link);\n });\n }\n // filter existing shadow links\n linksFound = _.filter(linksFound, function (newLink) {\n return _.findIndex(linksCopy,\n function (existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n // filter reflexive links until we find a way to render them GDB-1853\n linksFound = _.filter(linksFound, function (newLink) {\n return newLink.source !== newLink.target;\n });\n const nodesFromLinks = distinctBy('iri',_.union(_.flatten(_.map(response.data, function (link) {\n return [\n { iri: link.source,\n isTriple: link.isTripleSource },\n {\n iri: link.target,\n isTriple: link.isTripleTarget }];\n }))));\n const existingNodes = _.map(graph.nodes, function (n) {\n return {\n iri: n.iri,\n isTriple: Boolean(n.isTriple)\n };\n });\n const tripleNodesIt = graph.tripleNodes.values();\n for (let i = 0; i < graph.tripleNodes.size; i++) {\n let nodes = tripleNodesIt.next().value;\n nodes.forEach(node => {\n existingNodes.push({\n iri: node.iri,\n isTriple: node.isTriple\n });\n });\n }\n const newNodes = _.reject(nodesFromLinks, function (n) {\n return _.some(existingNodes, n);\n });\n\n if (newNodes.length === 0) {\n if (isStartNode) {\n toastr.info($translate.instant('graphexplore.error.node.connections'));\n } else if (linksFound.length === 0) {\n toastr.info($translate.instant('graphexplore.error.node.connections'));\n }\n\n graph.addAndMatchLinks(linksFound);\n draw();\n } else {\n const promises = [];\n const newNodesData = [];\n\n _.forEach(newNodes, function (newNode, index) {\n promises.push($http({\n url: 'rest/explore-graph/node',\n method: 'GET',\n params: {\n iri: newNode.isTriple ? createTriple(newNode.iri) : newNode.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: $scope.saveSettings['includeInferred'],\n sameAsState: $scope.saveSettings['sameAsState']\n }\n }).then(function (res) {\n // Save the data for later\n newNodesData[index] = res.data;\n }));\n });\n\n // Waits for all of the collected promises and then:\n // - adds each new node\n // - redraws the graph\n $q.all(promises).then(function () {\n _.forEach(newNodesData, function (newNodeData, index) {\n // Calculate initial positions for the new nodes based on spreading them evenly\n // on a circle around the node we came from.\n const theta = 2 * Math.PI * index / newNodesData.length;\n const x = (d ? d.x : 0) + Math.cos(theta) * height / 3;\n const y = (d ? d.y : 0) + Math.sin(theta) * height / 3;\n if (newNodeData.isTriple) {\n graph.addTriple(newNodeData, x, y);\n } else {\n graph.addNode(newNodeData, x, y);\n }\n });\n\n graph.addAndMatchLinks(linksFound);\n if (d) {\n d.isExpanded = true;\n }\n draw();\n });\n }\n }\n\n function expandNode(d, isStartNode, parentNode) {\n if (loader.getLoadingState()) {\n return;\n }\n loader.init(d, parentNode);\n\n const expandIri = d.iri;\n $http({\n url: 'rest/explore-graph/links',\n method: 'GET',\n params: {\n iri: expandIri, linksLimit: $scope.saveSettings['linksLimit'],\n includeInferred: $scope.saveSettings['includeInferred'],\n config: $scope.configLoaded.id,\n preferredTypes: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredTypes'],\n rejectedTypes: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['rejectedTypes'],\n preferredPredicates: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredPredicates'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['rejectedPredicates'],\n preferredTypesOnly: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredTypesOnly'],\n preferredPredicatesOnly: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredPredicatesOnly'],\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n sameAsState: $scope.saveSettings['sameAsState'],\n includeSchema: $scope.saveSettings['includeSchema']\n }\n }).then(function (response) {\n renderGraphFromResponse(response, d, isStartNode);\n }, function (response) {\n const msg = getError(response.data);\n toastr.error(msg, $translate.instant('graphexplore.error.exploring.node'));\n $scope.loading = false;\n loader.setLoadingState(false);\n });\n }\n\n function removeMenuIfVisible() {\n if (angular.isDefined(menuEvents) && menuEvents.expandedState) {\n menuEvents.removeIcons();\n }\n }\n\n function MenuEvents() {\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n this.actionsTip = undefined;\n\n this.removeIcons = function () {\n this.closeIcon.remove(\"g\");\n if (this.expandIcon) {\n this.expandIcon.remove(\"g\");\n }\n\n if (this.collapseIcon) {\n this.collapseIcon.remove(\"g\");\n }\n\n this.focusIcon.remove(\"g\");\n this.copyURIIcon.remove(\"g\");\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n\n this.expandedState = false;\n };\n\n this.expandedState = false;\n\n function getPositionAndAngle(angle, d) {\n const x = d.x - 14 + (d.size + 15) * Math.cos(angle * Math.PI / 180 - Math.PI / 2);\n const y = d.y - 14 + (d.size + 15) * Math.sin(angle * Math.PI / 180 - Math.PI / 2);\n return \"translate(\" + x + \",\" + y + \")\";\n }\n\n this.initIcons = function (node, parentNode) {\n // init action tips on hover of the icons\n const actionsTip = d3tip()\n .attr('class', 'd3-tip d3-actions-tip')\n .customPosition(function () {\n const bbox = d3.event.target.getBoundingClientRect();\n return {\n top: (bbox.top - 20) + 'px',\n left: (bbox.right + 10) + 'px'\n };\n })\n .html(function (name) {\n return name;\n });\n svg.call(actionsTip);\n const angle = 20;\n if (node.isExpanded) {\n this.collapseIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"collapse-icon\")\n .attr(\"name\", \"collapse\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.collapseIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.collapseIcon.append(\"path\")\n .attr(\"d\", \"M22.67,12a.59.59,0,0,1-.53.65l-6.88.72H15.2a.59.59,0,0,1-.59-.65l.72-6.88A.58.58,0,0,1,16,5.33a.59.59,0,0,1,.53.65L16,11.11,21.3,5.79a.64.64,0,0,1,.91.91L16.89,12,22,11.49A.59.59,0,0,1,22.67,12ZM12.59,14.75l-6.75.85a.59.59,0,0,0-.51.66.58.58,0,0,0,.66.51l4.95-.62-5.2,5.2a.64.64,0,1,0,.91.91l5.2-5.2L11.23,22a.59.59,0,0,0,.51.66h.07a.59.59,0,0,0,.59-.52l.85-6.75a.59.59,0,0,0-.17-.49A.58.58,0,0,0,12.59,14.75Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.collapseIcon.on(\"click\", function () {\n collapseNode(node);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(showNodeTipAndIconsTimer);\n $timeout.cancel(removeIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n } else {\n this.expandIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"expand-icon\")\n .attr(\"name\", \"expand\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.expandIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.expandIcon.append(\"path\")\n .attr(\"d\", \"M22.37,6.28l-.72,6.88a.59.59,0,0,1-.59.53H21a.59.59,0,0,1-.53-.65L21,7.9l-5.32,5.32a.64.64,0,0,1-.91-.91L20.1,7,15,7.53a.59.59,0,0,1-.12-1.18l6.88-.72a.59.59,0,0,1,.65.65ZM12.89,20.34,7.95,21l5.2-5.2a.64.64,0,0,0-.91-.91L7,20.05l.62-4.95A.59.59,0,0,0,6.48,15l-.85,6.75a.59.59,0,0,0,.59.67h.07L13,21.52a.59.59,0,1,0-.15-1.18Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.expandIcon.on(\"click\", function () {\n expandNode(node, false, parentNode);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n }\n\n\n this.focusIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"focus-icon\")\n .attr(\"name\", \"focus\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.focusIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.focusIcon.append(\"path\")\n .attr(\"d\", \"M14.2,23.81a9.8,9.8,0,1,1,6.93-2.87h0A9.74,9.74,0,0,1,14.2,23.81Zm0-18.17a8.37,8.37,0,1,0,5.92,14.29h0A8.37,8.37,0,0,0,14.2,5.64Zm1.42,6.95a2,2,0,1,0,0,2.85A2,2,0,0,0,15.62,12.59Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.focusIcon.on(\"click\", function () {\n $rootScope.$broadcast(\"onRootNodeChange\", node.iri);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.copyURIIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"icon-link\")\n .attr(\"name\", \"link\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.copyURIIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.copyURIIcon.append(\"path\")\n .attr(\"d\", \"M 13.457031 10.164062 C 13.648438 10.164062 13.820312 10.242188 13.941406 10.363281 L 15.492188 11.859375 C 15.984375 12.332031 16.292969 12.992188 16.292969 13.714844 C 16.292969 14.441406 15.984375 15.097656 15.492188 15.574219 L 10.394531 20.496094 C 9.902344 20.972656 9.222656 21.265625 8.472656 21.265625 C 7.71875 21.265625 7.039062 20.972656 6.546875 20.496094 L 4.996094 19 C 4.507812 18.523438 4.203125 17.867188 4.203125 17.144531 C 4.203125 16.421875 4.507812 15.765625 4.996094 15.289062 L 7.542969 12.824219 C 7.667969 12.707031 7.84375 12.628906 8.035156 12.628906 C 8.417969 12.628906 8.726562 12.929688 8.726562 13.300781 C 8.726562 13.484375 8.648438 13.652344 8.523438 13.773438 L 5.976562 16.234375 C 5.738281 16.46875 5.589844 16.792969 5.589844 17.148438 C 5.589844 17.503906 5.738281 17.824219 5.976562 18.058594 L 7.527344 19.566406 C 7.773438 19.792969 8.105469 19.929688 8.472656 19.929688 C 8.835938 19.929688 9.167969 19.792969 9.414062 19.566406 L 14.511719 14.644531 C 14.753906 14.410156 14.90625 14.089844 14.90625 13.730469 C 14.90625 13.375 14.753906 13.054688 14.511719 12.820312 L 12.964844 11.324219 C 12.839844 11.203125 12.761719 11.039062 12.761719 10.855469 C 12.761719 10.488281 13.070312 10.1875 13.449219 10.1875 Z M 17.082031 3.976562 C 17.082031 3.976562 17.085938 3.976562 17.085938 3.976562 C 17.824219 3.976562 18.492188 4.261719 18.980469 4.722656 L 20.535156 6.203125 C 21.042969 6.679688 21.355469 7.34375 21.355469 8.082031 C 21.355469 8.792969 21.058594 9.441406 20.582031 9.914062 L 18.0625 12.402344 C 17.9375 12.527344 17.761719 12.605469 17.566406 12.605469 C 17.183594 12.605469 16.875 12.304688 16.875 11.9375 C 16.875 11.753906 16.949219 11.589844 17.070312 11.46875 L 19.605469 8.984375 C 19.847656 8.75 19.996094 8.429688 19.996094 8.070312 C 19.996094 7.714844 19.847656 7.394531 19.605469 7.160156 L 18.019531 5.667969 C 17.773438 5.445312 17.4375 5.304688 17.070312 5.300781 C 16.703125 5.304688 16.367188 5.453125 16.128906 5.691406 L 11.085938 10.667969 C 10.84375 10.898438 10.695312 11.222656 10.695312 11.578125 C 10.695312 11.933594 10.84375 12.257812 11.085938 12.488281 L 12.675781 13.980469 C 12.804688 14.101562 12.882812 14.273438 12.882812 14.457031 C 12.882812 14.828125 12.574219 15.128906 12.191406 15.128906 C 12.003906 15.128906 11.832031 15.054688 11.707031 14.9375 L 10.140625 13.457031 C 9.636719 12.980469 9.324219 12.316406 9.324219 11.582031 C 9.324219 10.863281 9.621094 10.214844 10.101562 9.742188 L 15.140625 4.765625 C 15.625 4.285156 16.304688 3.980469 17.054688 3.976562 Z M 17.082031 3.976562\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.copyURIIcon.on(\"click\", function () {\n copyToClipboard(node.iri);\n removeMenuIfVisible();\n actionsTip.hide();\n }).on('mouseover', function () {\n actionsTip.show(\"<div style='text-align: center;'><b>Copy to ClipBoard</b><br>\" + node.iri + \"</div>\");\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.closeIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"close-icon\")\n .attr(\"name\", \"remove\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.closeIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.closeIcon.append(\"path\")\n .attr(\"d\", \"M14.94,14l5.87-5.87a.66.66,0,1,0-.94-.94L14,13.06,8.13,7.19a.66.66,0,0,0-.94.94L13.06,14,7.19,19.87a.66.66,0,1,0,.94.94L14,14.94l5.87,5.87a.66.66,0,1,0,.94-.94Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.closeIcon.on(\"click\", function () {\n hideNode(node);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.animateMenu(node);\n };\n\n this.animateMenu = function (node) {\n const animationDuration = 100;\n const easeEffects = [\"linear\", \"quad\", \"cubic\", \"sin\", \"exp\", \"circle\", \"elastic\", \"back\", \"bounce\"]; // https://github.com/d3/d3-3.x-api-reference/blob/master/Transitions.md#easing\n const easeEffect = easeEffects[3];\n let delay = 0;\n const dellayAddition = 35;\n let angle = 20; // angle of the first icon 0 is at 12 o'clock\n\n if (this.expandIcon) {\n this.expandIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n if (this.collapseIcon) {\n this.collapseIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n this.copyURIIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.focusIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n\n this.closeIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.expandedState = true;\n };\n }\n\n function Loader() {\n this.state = false;\n\n this.setLoadingState = function (state) {\n this.state = state;\n };\n\n this.getLoadingState = function () {\n return this.state;\n };\n\n this.init = function (node, parentNode) {\n d3.select(parentNode).append(\"circle\")\n .attr(\"cx\", function () {\n return node.x;\n })\n .attr(\"cy\", function () {\n return node.y;\n })\n .attr(\"class\", \"loader-container\")\n .attr(\"r\", function () {\n return node.size;\n })\n .style(\"fill\", \"fff\")\n .style(\"opacity\", \"0.7\");\n\n d3.select(parentNode).append(\"image\")\n .attr(\"xlink:href\", \"js/angular/templates/loader/ot-loader.svg?v=10.0.0-M2-1\")\n .attr(\"x\", function () {\n return node.x - node.size + 5;\n })\n .attr(\"y\", function () {\n return node.y - node.size;\n })\n .attr(\"width\", function () {\n return node.size * 2;\n })\n .attr(\"height\", function () {\n return node.size * 2;\n })\n .attr(\"class\", \"node-loader\");\n };\n }\n\n function showNodeInfo(d) {\n force.stop();\n // Assign value of node, which info panel has been opened\n $scope.openedNodeInfoPanel = d;\n $scope.showNodeInfo = true;\n $scope.showFilter = false;\n $scope.showPredicates = false;\n $scope.nodeLabels = d.labels;\n $scope.nodeTypes = d.types;\n $scope.rdfRank = d.rdfRank;\n $scope.nodeIri = d.iri;\n $scope.resourceType = d.isTriple ? 'triple' : 'uri';\n $scope.encodedIri = d.isTriple ? encodeURI(createTriple(d.iri)) : encodeURI(d.iri);\n $scope.showInfoPanel = true;\n\n $scope.rdfsLabel = d.labels[0].label;\n $scope.rdfsComment = d.comment;\n $scope.expanded = false;\n\n $scope.propertiesQueryObj.query = '';\n $scope.dataNodeKeysQuery = '';\n $http.get('rest/explore-graph/properties', {\n params: {\n iri: d.isTriple ? createTriple(d.iri) : d.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: $scope.saveSettings['includeInferred'],\n sameAsState: $scope.saveSettings['sameAsState'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['rejectedPredicates']\n }\n }).then(function (response) {\n $scope.data = _.mapKeys(response.data, function (value, key) {\n return $scope.replaceIRIWithPrefix(key);\n });\n $scope.propertiesObj.items = [];\n\n _.forEach($scope.data, function (value, key) {\n $scope.propertiesObj.items.push({key: key, value: value});\n });\n $scope.nodeImage = undefined;\n\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n\n const imageVal = _.find($scope.propertiesObj.items, function (o) {\n return o.key === 'image';\n });\n if (imageVal) {\n $scope.nodeImage = imageVal['value'][0].v;\n }\n $scope.propertiesObj.items = _.reject($scope.propertiesObj.items, function (o) {\n return o.key === 'image';\n });\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n }, function (response) {\n toastr.warning(getError(response.data), \"Error\");\n });\n }\n\n $scope.toggleSidePanel = function () {\n $scope.pageslideExpanded = !$scope.pageslideExpanded;\n };\n\n $scope.closeInfoPanel = function () {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n $scope.predicates = [];\n openedLink = null;\n // o, angular, o, miracle\n $timeout(function () {\n $scope.showInfoPanel = false;\n });\n };\n\n function applyElementsStyleChanges(tripleNode) {\n updatePredicatesColor('predicate', '#d54a33', tripleNode);\n updatePredicatesColor('predicates', '#d54a33', tripleNode);\n\n let links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function (link) {\n let linkLink = link.__data__;\n if (linkLink.source.iri.indexOf(tripleNode.iri) >= 0 || linkLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n link.style.stroke = '#d54a33';\n link.style.strokeWidth = 4;\n }\n })\n }\n\n let markers = document.getElementsByClassName('arrow-marker');\n if (markers) {\n _.each(markers, function (marker) {\n let markerLink = marker.__data__;\n if (markerLink.source.iri.indexOf(tripleNode.iri) >= 0 || markerLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n marker.style.stroke = '#d54a33';\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"23\");\n }\n }\n });\n }\n }\n\n $scope.clickLink = function (predData) {\n if (graph.tripleNodes.has(predData.linkId)) {\n revertElementsStyleToDefault();\n let tripleNode = graph.tripleNodes.get(predData.linkId)[predData.nodeIndex];\n // Shows selected triple and its properties\n showNodeInfo(tripleNode);\n $scope.showPredicates = true;\n\n let clickedEl = document.getElementById(predData.linkId + predData.nodeIndex);\n if (clickedEl) {\n clickedEl.style.fontWeight = \"bold\";\n }\n\n let nodeCopy = {};\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n let links = tripleLinksIt.next().value;\n if (links.length > 1) {\n links.every(link => {\n if (link.source.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].source.iri;\n if (link.target.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.target.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.target.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n if (link.target.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].target.iri;\n if (link.source.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.source.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.source.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n return true;\n });\n }\n }\n\n if (!nodeCopy.iri) {\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n }\n\n applyElementsStyleChanges(nodeCopy);\n }\n }\n\n function updatePredicatesColor(className, color, tripleNode) {\n let preds = document.getElementsByClassName(className);\n\n if (preds) {\n _.each(preds, function (pred) {\n let predLink = pred.__data__;\n if (tripleNode) {\n if (predLink.source.iri.indexOf(tripleNode.iri) >= 0 || predLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n pred.style.fill = color;\n }\n if (convertTripleToLinkId(tripleNode.iri) === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.pred;\n pred.style.fill = color;\n }\n if (tripleNode.oppLinkIRI && tripleNode.oppLinkIRI === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.oppTriplePred;\n pred.style.fill = color;\n }\n } else {\n pred.style.fill = color;\n pred.textContent = getPredicate(predLink);\n }\n })\n }\n }\n\n function revertElementsStyleToDefault() {\n _.each($scope.predicates, function (pred) {\n let currEl = document.getElementById(pred.linkId + pred.nodeIndex);\n if (currEl) {\n currEl.style.fontWeight = \"normal\";\n }\n });\n let links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function (link) {\n link.style.stroke = '#999';\n link.style.strokeWidth = 1;\n })\n }\n updatePredicatesColor('predicate', '');\n updatePredicatesColor('predicates', '');\n\n let markers = document.getElementsByClassName('arrow-marker');\n\n if (markers) {\n _.each(markers, function (marker) {\n marker.style.stroke = '#999';\n // RefX for triple targets isn't changed, because they are not affected by increasing of stroke-width\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"59\");\n }\n });\n }\n }\n\n function linkActions(d) {\n revertElementsStyleToDefault();\n let linkId = convertLinkDataToLinkId(d);\n if (d.predicates.length === 1 && graph.tripleNodes.has(linkId)) {\n openedLink = null;\n let tripleNode = graph.tripleNodes.get(linkId)[0];\n // If there is a triple in this link, show its properties\n if (clickedNode(tripleNode, this, d3.event.button)) {\n let nodeCopy = {};\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n applyElementsStyleChanges(nodeCopy);\n }\n return;\n }\n openPredicates(d);\n }\n\n function openPredicates(d) {\n $scope.showNodeInfo = false;\n // open predicates sidebar if they are more than one\n $scope.showPredicates = d.predicates.length > 1;\n $scope.showFilter = false;\n $scope.showInfoPanel = false;\n\n if (openedLink === d) {\n $scope.showNodeInfo = false;\n $scope.showInfoPanel = false;\n openedLink = null;\n return;\n }\n\n openedLink = d;\n\n if ($scope.showPredicates) {\n $scope.predicates = _.map(d.predicates, function (p) {\n let foundNodeIndex = getTripleNodeIndex(p, d);\n let isPartOfTriple = foundNodeIndex > -1;\n return {\n value: getShortPredicate(p),\n partOfTriple: isPartOfTriple,\n linkId: isPartOfTriple ? convertLinkDataToLinkId(d) : '',\n nodeIndex: foundNodeIndex\n };\n });\n $scope.showInfoPanel = true;\n }\n }\n\n function getTripleNode(triple) {\n let linkId = convertTripleToLinkId(triple);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).find(el => el.iri === triple);\n }\n }\n\n function getTripleNodeIndex(pred, d) {\n let linkId = convertLinkDataToLinkId(d);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).findIndex(el => el.iri.indexOf(pred) >= 0);\n } else {\n return -1;\n }\n }\n\n // get each predicate and check if there are more than one for same source and target\n function getPredicate(d) {\n if (d.predicates.length > 1) {\n return d.predicates.length + \" predicates\";\n }\n return getShortPredicate(d.predicates[0]);\n }\n\n function getShortPredicate(p) {\n const shortIRI = $scope.replaceIRIWithPrefix(p);\n if (shortIRI.length === p.length) {\n return p.split('/')[p.split('/').length - 1];\n } else {\n return shortIRI;\n }\n }\n\n // calculate predicate text length so we can have dynamic link lengths\n function getPredicateTextLength(link) {\n const span = $('<span></span>');\n const splitedLink = link.predicates[0].split('/');\n const predicateText = splitedLink[splitedLink.length - 1];\n span.addClass('predicate-text').text(predicateText);\n $('body').append(span);\n const textLength = span.width() + link.source.size * 2 + link.target.size * 2 + 50;\n span.remove();\n return textLength * 0.75;\n }\n\n $scope.splitPredicate = function (predicate) {\n return predicate.split('/')[predicate.split('/').length - 1];\n };\n\n $scope.getActiveRepository = function () {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLoadingLocation = function () {\n return $repositories.isLoadingLocation();\n };\n\n $scope.hasActiveLocation = function () {\n return $repositories.hasActiveLocation();\n };\n\n $scope.rotate = function (isLeft) {\n removeMenuIfVisible();\n\n // compute common rotation math such as the angle, its sine and cosine and the pivot point\n const theta = (isLeft ? 1 : -1) * 2 * Math.PI / 180; // + rotates left, - rotates right\n const cos = Math.cos(theta);\n const sin = Math.sin(theta);\n const pivotX = width / 2; // i.e. centre of viewport\n const pivotY = height / 2;\n\n // rotates each node around the pivot\n d3.selectAll(\".node-wrapper\")\n .each(function (d) {\n d.x = pivotX + (cos * (d.x - pivotX) + sin * (d.y - pivotY));\n d.y = pivotY + (-sin * (d.x - pivotX) + cos * (d.y - pivotY));\n if (d.fixed) {\n // Fixed nodes need their px and py updated too\n d.px = d.x;\n d.py = d.y;\n }\n });\n\n force.resume();\n };\n\n $scope.openUri = function (uri, noHistory) {\n if (!noHistory) {\n const searchParams = {};\n if ($scope.configLoaded.id !== $scope.defaultGraphConfig.id) {\n searchParams.config = $scope.configLoaded.id;\n }\n searchParams.uri = uri;\n $scope.pushHistory(searchParams, {uri: uri, config: $scope.configLoaded});\n }\n $scope.$broadcast(\"onRootNodeChange\", uri);\n };\n\n function saveGraphHttp(graph) {\n if ($scope.configLoaded) {\n graph.config = $scope.configLoaded.id;\n }\n SavedGraphsRestService.addNewSavedGraph(graph)\n .success(function (data, status, headers) {\n $scope.lastSavedGraphName = graph.name;\n $scope.lastSavedGraphId = headers()['x-saved-graph-id'];\n $scope.shared = graph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph', {name: graph.name}));\n })\n .error(function (data, status) {\n if (status === 422) {\n $scope.saveGraphModal('new', graph, true);\n } else {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.create.graph'));\n }\n });\n }\n\n $scope.saveOrUpdateGraph = function () {\n const data = JSON.stringify(graph.copyState());\n const graphToSave = {id: $scope.lastSavedGraphId, name: $scope.lastSavedGraphName, data: data, shared: $scope.shared};\n\n if (graphToSave.id) {\n $scope.saveGraphModal('update', graphToSave);\n } else {\n $scope.saveGraphModal('new', graphToSave);\n }\n };\n\n $scope.renameSavedGraph = function (graphToRename) {\n // By not sending the 'data' part of a graph we only change the name\n $scope.saveGraphModal('rename', {id: graphToRename.id, name: graphToRename.name, config: graphToRename.config, shared: graphToRename.shared});\n };\n\n const editSavedGraphHttp = function (savedGraph) {\n SavedGraphsRestService.editSavedGraph(savedGraph)\n .success(function () {\n $scope.lastSavedGraphName = savedGraph.name;\n $scope.shared = savedGraph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.edited', {name: savedGraph.name}));\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.edit'));\n });\n };\n\n $scope.saveGraphModal = function (mode, graphToSave, graphExists) {\n const modalInstance = $modal.open({\n templateUrl: 'js/angular/graphexplore/templates/modal/save-graph.html',\n controller: 'SaveGraphModalCtrl',\n resolve: {\n data: function () {\n return {\n mode: mode,\n graph: graphToSave,\n graphExists: graphExists,\n shared: graphToSave.shared\n };\n }\n }\n });\n\n modalInstance.result.then(function (data) {\n if (data.restart) {\n $scope.saveGraphModal(data.mode, data.graph, false);\n return;\n }\n switch (data.mode) {\n case 'new':\n saveGraphHttp(data.graph);\n break;\n case 'update':\n editSavedGraphHttp(data.graph);\n break;\n case 'rename':\n editSavedGraphHttp(data.graph);\n break;\n }\n });\n };\n\n $scope.refreshSavedGraphs = function () {\n SavedGraphsRestService.getSavedGraphs()\n .success(function (data) {\n $scope.savedGraphs = data;\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.getting.saved.graphs'));\n });\n };\n\n\n $scope.loadSavedGraph = function (graphToLoad, noHistory) {\n if (graphToLoad.owner) {\n // Own saved graph\n $scope.lastSavedGraphName = graphToLoad.name;\n $scope.lastSavedGraphId = graphToLoad.id;\n $scope.shared = graphToLoad.shared;\n $scope.configLoaded = $scope.findConfigById(graphToLoad.config);\n } else {\n // Someone else's saved graph\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = graphToLoad.shared;\n }\n\n if (!$scope.configLoaded) {\n // Fallback to default config, either because config is gone or because graph isn't owned\n $scope.configLoaded = $scope.defaultGraphConfig;\n }\n\n $location.url(\"?saved=\" + graphToLoad.id);\n graph.restoreState(JSON.parse(graphToLoad.data));\n if (!noHistory) {\n $scope.pushHistory({saved: graphToLoad.id}, {savedGraph: graphToLoad});\n }\n };\n\n $scope.copyToClipboardSavedGraph = function (savedGraph) {\n const url = [location.protocol, '//', location.host, location.pathname, '?saved=', savedGraph.id].join('');\n copyToClipboard(url);\n };\n\n function deleteSavedGraphHttp(savedGraph) {\n SavedGraphsRestService.deleteSavedGraph(savedGraph)\n .success(function () {\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.deleted', {name: savedGraph.name}));\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.delete'));\n });\n }\n\n $scope.deleteSavedGraph = function (savedGraph) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.confirm.delete.graph', {graphName: savedGraph.name}),\n warning: true\n }).result\n .then(function () {\n deleteSavedGraphHttp(savedGraph);\n });\n };\n\n $scope.openIRI = function (link, event) {\n if (event.shiftKey) {\n $scope.$broadcast(\"onRootNodeChange\", link);\n } else {\n window.open(link, '_blank');\n }\n return false;\n };\n\n $scope.togglePinAllNodes = function () {\n removeMenuIfVisible();\n\n const value = $scope.numberOfPinnedNodes <= 0;\n\n $scope.numberOfPinnedNodes = 0;\n d3.selectAll('.node').each(function (d) {\n d.fixed = value;\n if (value) {\n $scope.numberOfPinnedNodes++;\n }\n });\n\n force.resume();\n };\n\n // event for capturing left and right arrows used for rotation\n $('body').on(\"keydown\", function (event) {\n if (event.target.nodeName === 'input' || !$scope.nodeSelected) {\n // don't do anything when the target is an input field or no node is selected\n } else if (event.keyCode === 37) {\n // left arrow rotates left\n $scope.rotate(true);\n } else if (event.keyCode === 39) {\n // right arrow rotates right\n $scope.rotate(false);\n }\n });\n\n $scope.getLiteralFromPropValue = function (value) {\n return value.substring(value.indexOf(':') + 1);\n }\n}\n\nSaveGraphModalCtrl.$inject = ['$scope', '$modalInstance', 'data', '$translate'];\n\nfunction SaveGraphModalCtrl($scope, $modalInstance, data, $translate) {\n $scope.mode = data.mode;\n $scope.graph = angular.copy(data.graph);\n $scope.graphExists = data.graphExists;\n\n switch ($scope.mode) {\n case 'new':\n $scope.title = $translate.instant('graphexplore.create.new.graph');\n $scope.okButtonText = $translate.instant('common.create.btn');\n break;\n case 'update':\n $scope.title = $translate.instant('graphexplore.update');\n $scope.okButtonText = $translate.instant('common.save.btn');\n break;\n case 'rename':\n $scope.title = $translate.instant('graphexplore.rename');\n $scope.okButtonText = $translate.instant('common.save.btn');\n }\n\n $scope.ok = function () {\n if ($scope.form.$valid) {\n $modalInstance.close({graph: $scope.graph, mode: $scope.mode});\n }\n };\n\n $scope.saveNew = function () {\n $scope.graph.name = $scope.graph.name + ' (new)';\n $modalInstance.close({graph: $scope.graph, mode: 'new', restart: true});\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n}\n","import 'angular/utils/notifications';\nimport 'angular/utils/local-storage-adapter';\n\nangular\n .module('graphdb.framework.graphexplore.controllers.graphviz.config', [\n 'graphdb.framework.utils.notifications',\n 'graphdb.framework.utils.localstorageadapter'\n ])\n .controller('GraphConfigCtrl', GraphConfigCtrl);\n\nGraphConfigCtrl.$inject = ['$scope', '$timeout', '$location', 'toastr', '$repositories', '$modal', 'ModalService', 'SparqlRestService', '$filter', 'GraphConfigRestService', 'AutocompleteRestService', '$routeParams', 'Notifications', 'RDF4JRepositoriesRestService', 'LocalStorageAdapter', 'LSKeys', '$translate'];\n\nfunction GraphConfigCtrl($scope, $timeout, $location, toastr, $repositories, $modal, ModalService, SparqlRestService, $filter, GraphConfigRestService, AutocompleteRestService, $routeParams, Notifications, RDF4JRepositoriesRestService, LocalStorageAdapter, LSKeys, $translate) {\n\n $scope.page = 1;\n $scope.totalPages = 5;\n\n $scope.helpHidden = LocalStorageAdapter.get(LSKeys.HIDE_GRAPH_CONFIG_HELP) === 1;\n\n $scope.toggleHelp = function (value) {\n if (value === undefined) {\n value = LocalStorageAdapter.get(LSKeys.HIDE_GRAPH_CONFIG_HELP);\n }\n if (value !== 1) {\n LocalStorageAdapter.set(LSKeys.HIDE_GRAPH_CONFIG_HELP, 1);\n $scope.helpHidden = true;\n } else {\n LocalStorageAdapter.set(LSKeys.HIDE_GRAPH_CONFIG_HELP, 0);\n $scope.helpHidden = false;\n }\n };\n\n var selectedFixedNodeChanged;\n $scope.fixedVisualCallback = function (uri, label) {\n $scope.newConfig.startIRI = uri;\n $scope.newConfig.startIRILabel = label;\n selectedFixedNodeChanged = true;\n };\n\n $scope.isDefaultGraph = function (sample) {\n return (sample.name === 'Minimal' || sample.name === 'Advanced');\n };\n\n $scope.isUserGraph = function (sample) {\n return !$scope.isDefaultGraph(sample);\n };\n\n $scope.getSampleName = function (sample, property) {\n const extra = sample[property + 'Description'];\n if (extra) {\n // Sample has description, use it\n return extra;\n } else {\n // Sample is a copy of existing config, prepend Copy of to name\n return sample.id ? 'Copy of ' + sample.name : sample.name;\n }\n };\n\n const getGraphConfigSamples = function () {\n GraphConfigRestService.getGraphConfigSamples()\n .success(function (data) {\n $scope.samples = _.filter(data, function (s) {\n // Skip the currently edited config from samples and store it into a revert variable\n if (!s.id || $scope.newConfig.id !== s.id) {\n return true;\n } else {\n $scope.revertConfig = s;\n return false;\n }\n });\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.configs'));\n });\n };\n\n const configName = $routeParams.configName;\n $scope.newConfig = {startQueryIncludeInferred: true, startQuerySameAs: true};\n $scope.newConfig.startMode = 'search';\n $scope.isUpdate = false;\n $scope.shared = false;\n\n $scope.encodeQuery = function (query) {\n return encodeURIComponent(query);\n };\n\n function showInvalidMsg(message) {\n toastr.warning(message);\n }\n\n if (configName) {\n $scope.isUpdate = true;\n GraphConfigRestService.getConfig(configName)\n .success(function (data) {\n $scope.newConfig = data;\n initForConfig();\n })\n .error(function (data) {\n toastr.error(getError(data), $translate.instant('created.connector', {name: configName}));\n });\n } else {\n $scope.isUpdate = false;\n initForConfig();\n }\n\n function getQueryForCurrentPage(config) {\n let query;\n\n if (config.startMode === 'query' && $scope.page === 1) {\n query = config.startGraphQuery;\n } else if ($scope.page === 2) {\n query = config.expandQuery;\n } else if ($scope.page === 3) {\n query = config.resourceQuery;\n } else if ($scope.page === 4) {\n query = config.predicateLabelQuery;\n } else if ($scope.page === 5) {\n query = config.resourcePropertiesQuery;\n }\n\n return angular.isDefined(query) ? query : '';\n }\n\n function initForConfig() {\n getGraphConfigSamples();\n $scope.createGraphConfig = function () {\n GraphConfigRestService.createGraphConfig($scope.newConfig)\n .success(async function () {\n await Notifications.showToastMessageWithDelay('graphexplore.saved.new.config');\n $location.url('graphs-visualizations');\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.could.not.create'));\n });\n };\n\n $scope.updateGraphConfig = function () {\n GraphConfigRestService.updateGraphConfig($scope.newConfig)\n .success(async function () {\n await Notifications.showToastMessageWithDelay('graphexplore.saved.config');\n $location.url('graphs-visualizations');\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.could.not.save'));\n });\n };\n\n function checkAutocompleteStatus() {\n $scope.getAutocompletePromise = AutocompleteRestService.checkAutocompleteStatus();\n }\n\n $scope.$on('autocompleteStatus', function() {\n checkAutocompleteStatus();\n });\n\n checkAutocompleteStatus();\n $scope.getNamespacesPromise = RDF4JRepositoriesRestService.getNamespaces($scope.getActiveRepository());\n\n const validateQueryWithCallback = function (successCallback, query, queryType, params, all, oneOf) {\n if (!query) {\n successCallback();\n } else {\n GraphConfigRestService.validateQuery(query, queryType, params, all, oneOf)\n .success(function () {\n successCallback();\n }).error(function (data) {\n showInvalidMsg(getError(data));\n });\n }\n };\n\n $scope.validateCurrentPage = function (successCallback) {\n $scope.updateModel();\n\n if ($scope.page === 1) {\n if ($scope.newConfig.startMode === 'node' && !$scope.newConfig.startIRI) {\n showInvalidMsg($translate.instant('graphexplore.select.start.node'));\n } else if ($scope.newConfig.startMode === 'query' && !$scope.newConfig.startGraphQuery) {\n showInvalidMsg($translate.instant('graphexplore.provide.query'));\n } else if ($scope.newConfig.startMode === 'query') {\n validateQueryWithCallback(successCallback, $scope.newConfig.startGraphQuery, 'graph')\n } else {\n successCallback();\n }\n } else if ($scope.page === 2) {\n validateQueryWithCallback(successCallback, $scope.newConfig.expandQuery, 'construct', ['node'])\n } else if ($scope.page === 3) {\n validateQueryWithCallback(successCallback, $scope.newConfig.resourceQuery, 'tuple', ['node'], [], ['type', 'label', 'comment', 'rank']);\n } else if ($scope.page === 4) {\n validateQueryWithCallback(successCallback, $scope.newConfig.predicateLabelQuery, 'tuple', ['edge'], ['label']);\n } else if ($scope.page === 5) {\n validateQueryWithCallback(successCallback, $scope.newConfig.resourcePropertiesQuery, 'tuple', ['node'], ['property', 'value']);\n }\n };\n\n $scope.goToPage = function (nextPage) {\n if ($scope.page === nextPage) {\n // already there\n return;\n }\n\n $scope.validateCurrentPage(function () {\n $scope.showEditor();\n $scope.page = nextPage;\n $scope.notoolbar = $scope.page !== 1;\n });\n };\n\n $scope.goToPreviousPage = function () {\n if ($scope.page > 1) {\n $scope.goToPage($scope.page - 1);\n }\n\n if (checkPageAndMode()) {\n selectedFixedNodeChanged = false;\n }\n };\n\n $scope.goToNextPage = function () {\n broadcastAddStartFixedNodeEvent();\n if (selectedFixedNodeChanged) {\n $scope.goToPage($scope.page + 1);\n }\n };\n\n function broadcastAddStartFixedNodeEvent() {\n if (checkPageAndMode()) {\n $scope.$broadcast('addStartFixedNodeAutomatically', {startIRI: $scope.newConfig.startIRI});\n }\n }\n\n function checkPageAndMode() {\n return $scope.page === 1 && $scope.newConfig.startMode === 'node';\n }\n\n $scope.saveGraphConfig = function () {\n broadcastAddStartFixedNodeEvent();\n\n if (checkPageAndMode() && !selectedFixedNodeChanged) {\n return;\n }\n\n $scope.newConfig.startQueryIncludeInferred = $scope.currentQuery.inference;\n $scope.newConfig.startQuerySameAs = $scope.currentQuery.sameAs;\n\n $scope.validateCurrentPage(function () {\n if (!$scope.newConfig.name) {\n showInvalidMsg($translate.instant('graphexplore.provide.config.name'));\n return;\n }\n $scope.isUpdate ? $scope.updateGraphConfig($scope.newConfig) : $scope.createGraphConfig($scope.newConfig);\n });\n };\n\n $scope.updateModel = function () {\n const query = window.editor.getValue().trim();\n if ($scope.newConfig.startMode === 'query' && $scope.page === 1) {\n $scope.newConfig.startGraphQuery = query;\n } else if ($scope.page === 2) {\n $scope.newConfig.expandQuery = query;\n } else if ($scope.page === 3) {\n $scope.newConfig.resourceQuery = query;\n } else if ($scope.page === 4) {\n $scope.newConfig.predicateLabelQuery = query;\n } else if ($scope.page === 5) {\n $scope.newConfig.resourcePropertiesQuery = query;\n }\n };\n\n // Called when user clicks on a sample query\n $scope.setQuery = function (query) {\n // Hack for YASQE bug\n window.editor.setValue(query ? query : ' ');\n };\n\n $scope.updateDirty = function () {\n if ($scope.revertConfig) {\n const q1 = getQueryForCurrentPage($scope.revertConfig);\n const q2 = window.editor.getValue().trim();\n $scope.queryEditorIsDirty = q1 !== q2;\n }\n };\n\n // Updates the position of the query editor to match the current div placeholder\n // and sets the editor's query to the relevant query from the model.\n $scope.updateEditor = function () {\n $timeout(function () {\n $scope.currentQuery.query = getQueryForCurrentPage($scope.newConfig);\n // // Check for ontop repository and override nocount property (it's default value is false)\n if ($repositories.isActiveRepoOntopType()) {\n $scope.nocount = true;\n }\n $scope.currentQuery.inference = $scope.newConfig.startQueryIncludeInferred;\n $scope.currentQuery.sameAs = $scope.newConfig.startQuerySameAs;\n loadTab($scope.currentQuery.id);\n selectTab($scope.currentQuery.id);\n }, 100);\n\n };\n\n $scope.showEditor = function () {\n if (window.editor && window.editor.xhr) {\n window.editor.xhr.abort();\n }\n $scope.viewMode = 'yasr';\n };\n\n $scope.showPreview = function () {\n // For some reason YASR gets confused and sets this to rawResponse\n // if we execute a CONSTRUCT and then a SELECT. This makes sure it's always table.\n $scope.currentQuery.outputType = 'table';\n $scope.runQuery();\n };\n\n $scope.revertEditor = function () {\n $scope.setQuery(getQueryForCurrentPage($scope.revertConfig));\n };\n\n // Trigger for showing the editor and moving it to the right position\n $scope.$watch('newConfig.startMode', function (value) {\n if (value === 'query') {\n $timeout(function () {\n $scope.updateEditor();\n }, 0);\n }\n });\n\n // Trigger for showing the editor and moving it to the right position\n $scope.$watch('page', function (value) {\n if ($scope.newConfig.startMode === 'query' || value > 1) {\n $timeout(function () {\n $scope.showEditor();\n $scope.updateEditor();\n }, 0);\n }\n });\n }\n\n // DOWN HERE WE KEEP EVERYTHING PURELY QUERY EDITOR (MOSTLY BORROWED FROM query-editor.controller.js)\n // But Why? Can't we reuse it instead of borrow?\n\n const defaultTabConfig = {\n id: '1',\n name: '',\n query: 'select * where { \\n' +\n '\\t?s ?p ?o .\\n' +\n '} limit 100 \\n',\n inference: $scope.newConfig.startQueryIncludeInferred,\n sameAs: $scope.newConfig.startQuerySameAs\n };\n\n $scope.resetCurrentTabConfig = function () {\n $scope.currentTabConfig = {\n pageSize: 100, // page limit 100 as this is only used for preview\n page: 1,\n allResultsCount: 0,\n resultsCount: 0\n };\n };\n\n $scope.queryExists = false;\n\n $scope.resetCurrentTabConfig();\n\n $scope.tabsData = $scope.tabs = [defaultTabConfig];\n\n // query tab operations\n $scope.saveTab = saveTab;\n $scope.loadTab = loadTab;\n $scope.addNewTab = addNewTab;\n\n // query operations\n $scope.runQuery = runQuery;\n $scope.getNamespaces = getNamespaces;\n $scope.changePagination = changePagination;\n $scope.toggleSampleQueries = toggleSampleQueries;\n $scope.addKnownPrefixes = addKnownPrefixes;\n $scope.getExistingTabId = getExistingTabId;\n $scope.querySelected = querySelected;\n $scope.saveQueryToLocal = saveQueryToLocal;\n\n $scope.setLoader = setLoader;\n $scope.getLoaderMessage = getLoaderMessage;\n\n // query editor and results orientation\n $scope.fixSizesOnHorizontalViewModeSwitch = fixSizesOnHorizontalViewModeSwitch;\n $scope.changeViewMode = changeViewMode;\n $scope.showHideEditor = showHideEditor;\n $scope.focusQueryEditor = focusQueryEditor;\n $scope.orientationViewMode = true;\n\n // start of repository actions\n let backendRepositoryID = $scope.getActiveRepository();\n\n function saveQueryToLocal(currentQueryTab) {\n }\n\n function setLoader(isRunning, progressMessage, extraMessage) {\n const yasrInnerContainer = angular.element(document.getElementById('yasr-inner'));\n $scope.queryIsRunning = isRunning;\n if (isRunning) {\n $scope.queryStartTime = Date.now();\n $scope.countTimeouted = false;\n $scope.progressMessage = progressMessage;\n $scope.extraMessage = extraMessage;\n yasrInnerContainer.addClass('hide');\n } else {\n $scope.progressMessage = '';\n $scope.extraMessage = '';\n yasrInnerContainer.removeClass('hide');\n }\n // We might call this from angular or outside angular so take care of applying the scope.\n if ($scope.$$phase === null) {\n $scope.$apply();\n }\n }\n\n function getLoaderMessage() {\n const timeSeconds = (Date.now() - $scope.queryStartTime) / 1000;\n const timeHuman = $scope.getHumanReadableSeconds(timeSeconds);\n let message = '';\n\n if ($scope.progressMessage) {\n message = $scope.progressMessage + '... ' + timeHuman;\n } else {\n message = $translate.instant('common.running.operation', {timeHuman: timeHuman});\n }\n if ($scope.extraMessage && timeSeconds > 10) {\n message += '\\n' + $scope.extraMessage;\n }\n\n return message;\n }\n\n\n // start of query editor results orientation operations\n function fixSizesOnHorizontalViewModeSwitch(verticalViewParam) {\n function visibleWindowHeight() {\n return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0;\n }\n\n const codemirrorWrapperSelector = '.CodeMirror-wrap';\n const verticalView = verticalViewParam;\n if (!$scope.orientationViewMode) {\n $scope.noPadding = {paddingRight: 15, paddingLeft: 0};\n\n // window.editor is undefined if no repo is selected\n if (window.editor && document.querySelector(codemirrorWrapperSelector)) {\n let newHeight = visibleWindowHeight() - (document.querySelector(codemirrorWrapperSelector).getBoundingClientRect().top);\n newHeight -= 40;\n document.querySelector(codemirrorWrapperSelector).style.height = newHeight + 'px';\n document.getElementById('yasr').style.minHeight = newHeight + 'px';\n } else {\n let timer;\n if (verticalView) {\n timer = $timeout(function () {\n $scope.fixSizesOnHorizontalViewModeSwitch(verticalView)\n }, 100);\n } else {\n timer = $timeout($scope.fixSizesOnHorizontalViewModeSwitch, 100);\n }\n\n $scope.$on('$destroy', function () {\n $timeout.cancel(timer);\n });\n }\n } else {\n if ($scope.viewMode === 'yasr') {\n let newHeight = visibleWindowHeight() - (document.querySelector(codemirrorWrapperSelector).getBoundingClientRect().top);\n newHeight -= 40;\n document.querySelector(codemirrorWrapperSelector).style.height = newHeight + 'px';\n } else {\n $scope.noPadding = {};\n document.querySelector(codemirrorWrapperSelector).style.height = '';\n }\n document.getElementById('yasr').style.minHeight = '';\n }\n if (window.yasr && window.yasr.container) {\n $timeout(function () {\n window.yasr.container.resize();\n }, 100);\n }\n }\n\n if (!$scope.orientationViewMode) {\n showHideEditor();\n }\n\n function changeViewMode(tabID) {\n $scope.viewMode = 'none';\n $scope.orientationViewMode = !$scope.orientationViewMode;\n fixSizesOnHorizontalViewModeSwitch();\n $('.dataTables_filter').remove();\n $('.resultsTable').remove();\n $timeout(function () {\n loadTab(tabID);\n selectTab(tabID);\n }, 100);\n }\n\n function showHideEditor() {\n fixSizesOnHorizontalViewModeSwitch(true);\n }\n\n function focusQueryEditor() {\n if (!angular.element(document).find('.editable-input').is(':focus')) {\n angular.element(document).find('.CodeMirror textarea:first-child').focus();\n }\n }\n\n // end of query editor results orientation operations\n\n function deleteCachedSparqlResults() {\n }\n\n function selectTab(id) {\n $timeout(function () {\n $('a[data-id = \"' + id + '\"]').tab('show');\n }, 0);\n }\n\n // start of query operations\n function runQuery(changePage, explain) {\n $scope.executedQueryTab = $scope.currentQuery;\n if (explain && !(window.editor.getQueryType() === 'SELECT' || window.editor.getQueryType() === 'CONSTRUCT')) {\n toastr.warning($translate.instant('query.editor.warning.msg'));\n return;\n }\n\n if (window.editor.getQueryMode() === 'update') {\n toastr.warning($translate.instant('cannot.execute.update.error'));\n return;\n }\n\n $scope.explainRequested = explain;\n if (!$scope.queryIsRunning) {\n if (changePage) {\n $scope.currentTabConfig.resultsCount = 0;\n } else {\n $scope.resetCurrentTabConfig();\n }\n\n // Hides the editor and shows the yasr results\n $scope.viewMode = 'editor';\n if ($scope.orientationViewMode) {\n $scope.fixSizesOnHorizontalViewModeSwitch()\n }\n\n setLoader(true, $translate.instant('evaluating.query.msg'));\n window.editor.query();\n }\n }\n\n function getNamespaces() {\n // Signals the namespaces are to be fetched => loader will be shown\n setLoader(true, $translate.instant('common.refreshing.namespaces'), $translate.instant('common.extra.message'));\n RDF4JRepositoriesRestService.getRepositoryNamespaces()\n .success(function (data) {\n const usedPrefixes = {};\n data.results.bindings.forEach(function (e) {\n usedPrefixes[e.prefix.value] = e.namespace.value;\n });\n $scope.namespaces = usedPrefixes;\n })\n .error(function (data) {\n $scope.repositoryError = getError(data);\n })\n .finally(function () {\n // Signals namespaces were fetched => loader will be hidden\n setLoader(false);\n });\n }\n\n function changePagination() {\n runQuery(true, $scope.explainRequested);\n }\n\n if ($scope.getActiveRepository()) {\n getNamespaces();\n }\n\n $scope.$on('$destroy', function () {\n window.editor = null;\n window.yasr = null;\n });\n\n function toggleSampleQueries() {\n }\n\n // Add known prefixes\n function addKnownPrefixes() {\n SparqlRestService.addKnownPrefixes(JSON.stringify(window.editor.getValue()))\n .success(function (data) {\n if (angular.isDefined(window.editor) && angular.isDefined(data) && data !== window.editor.getValue()) {\n window.editor.setValue(data);\n }\n })\n .error(function (data) {\n let msg = getError(data);\n toastr.error(msg, $translate.instant('common.add.known.prefixes.error'));\n return true;\n });\n }\n\n $('textarea').on('paste', function () {\n $timeout(function () {\n addKnownPrefixes();\n }, 0);\n });\n\n function querySelected(query) {\n const tabId = getExistingTabId(query);\n $scope.toggleSampleQueries();\n if (!angular.isDefined(tabId)) {\n $scope.addNewTab(null, query.name, query.body);\n } else {\n selectTab(tabId);\n }\n }\n\n function getExistingTabId(query) {\n let existingTabId = undefined;\n angular.forEach($scope.tabsData, function (item) {\n if (item.name === query.name && item.query === query.body) {\n existingTabId = item.id;\n return item;\n }\n });\n\n return existingTabId;\n }\n\n // end of query operations\n\n // start of query tab operations\n function findTabIndexByID(id) {\n for (let i = 0; i < $scope.tabsData.length; i++) {\n const tab = $scope.tabsData[i];\n if (tab.id === id) {\n return i;\n }\n }\n }\n\n $scope.$watchCollection('[currentQuery.inference, currentQuery.sameAs]', function () {\n saveQueryToLocal($scope.currentQuery);\n });\n\n function saveTab(id) {\n const idx = findTabIndexByID(id);\n // Tab was deleted, don't try to save it's state\n if (idx === undefined) {\n return {};\n }\n const tab = $scope.tabsData[idx];\n $scope.saveQueryToLocal(tab);\n return tab;\n }\n\n let maxID = 1;\n\n function addNewTab(callback, tabName, savedQuery) {\n }\n\n function loadTab(id) {\n $scope.tabsData = [$scope.currentQuery];\n\n let tab = $scope.currentQuery;\n\n if ($scope.currentQuery.query == null || $scope.currentQuery.query === '') {\n // hack for YASQE bug\n window.editor.setValue(' ');\n } else {\n window.editor.setValue($scope.currentQuery.query);\n }\n\n $timeout(function () {\n $scope.currentTabConfig = {};\n $scope.currentTabConfig.queryType = tab.queryType;\n $scope.currentTabConfig.resultsCount = tab.resultsCount;\n\n $scope.currentTabConfig.offset = tab.offset;\n $scope.currentTabConfig.allResultsCount = tab.allResultsCount;\n $scope.currentTabConfig.page = tab.page;\n $scope.currentTabConfig.pageSize = tab.pageSize;\n\n $scope.currentTabConfig.timeFinished = tab.timeFinished;\n $scope.currentTabConfig.timeTook = tab.timeTook;\n $scope.currentTabConfig.sizeDelta = tab.sizeDelta;\n $scope.$apply();\n }, 0);\n\n //Remove padding of yasr so it will be aligned with sparql editor\n $('#yasr').css('padding', '0');\n }\n\n function getQueryID(element) {\n return $(element).attr('data-id');\n }\n\n $scope.$on('tabAction', function (e, tabEvent) {\n if (tabEvent.relatedTarget) {\n $scope.saveTab(getQueryID(tabEvent.relatedTarget));\n }\n $scope.loadTab(getQueryID(tabEvent.target));\n });\n\n $scope.$on('deleteAllexeptSelected', function (e, tabs) {\n $scope.tabsData = tabs;\n $scope.tabs = tabs;\n });\n // end of query tab operations\n\n $scope.currentQuery = angular.copy(defaultTabConfig);\n // $scope.state = {};\n $scope.showSampleQueries = false;\n $scope.savedQuery = {};\n $scope.sampleQueries = {};\n\n $scope.getResultsDescription = function () {\n };\n\n $scope.getUpdateDescription = function () {\n };\n\n $scope.getStaleWarningMessage = function () {\n }\n\n}\n","import d3tip from 'lib/d3-tip/d3-tip-patch';\nimport CirclePacking from 'lib/common/circle-packing';\nimport D3 from 'lib/common/d3-utils';\nimport SVG from 'lib/common/svg-export';\nimport 'angular/utils/local-storage-adapter';\n\nangular\n .module('graphdb.framework.graphexplore.directives.class', [\n 'graphdb.framework.graphexplore.controllers.class',\n 'graphdb.framework.utils.localstorageadapter'\n ])\n .constant(\"ZOOM_DURATION\", 500)\n .constant(\"ROOT_OBJ_NAME\", \"RDF Class Hierarchy\")\n .directive('rdfClassHierarchy', classHierarchyDirective);\n\nclassHierarchyDirective.$inject = ['$rootScope', '$location', 'GraphDataRestService', '$window', '$timeout', '$repositories', '$licenseService', 'toastr', 'ZOOM_DURATION', 'ROOT_OBJ_NAME', 'LocalStorageAdapter', 'LSKeys', '$translate'];\n\nfunction classHierarchyDirective($rootScope, $location, GraphDataRestService, $window, $timeout, $repositories, $licenseService, toastr, ZOOM_DURATION, ROOT_OBJ_NAME, LocalStorageAdapter, LSKeys, $translate) {\n return {\n restrict: 'AE',\n template: '<div id=\"classChart\"></div>',\n scope: {\n classHierarchyData: '=',\n flattenedClassNames: '=',\n selectedClass: '=',\n currentSliderValue: '=',\n showClassInfoPanel: '=',\n showExternalElements: '=',\n hidePrefixes: '=',\n currentBrowserLimit: '='\n },\n link: linkFunc\n };\n\n function linkFunc(scope, element, attrs) {\n renderCirclePacking(scope, element);\n }\n\n function renderCirclePacking(scope, element) {\n\n var width = 800,\n height = 800,\n diameter = height,\n margin = 20,\n node,\n root;\n\n var pack = d3.layout.pack()\n .size([diameter - margin, diameter - margin])\n .value(function (d) {\n return d.size;\n });\n\n var colors = [\n \"hsl(33, 75%, 75%)\",\n \"hsl(213, 75%, 75%)\",\n \"hsl(333, 75%, 75%)\",\n \"hsl(153, 75%, 75%)\",\n \"hsl(273, 75%, 75%)\",\n \"hsl(93, 75%, 75%)\"\n ];\n\n var color = d3.scale.linear()\n .domain([0, 4])\n .range([\"hsl(19, 70%, 90%)\", \"hsl(19, 70%, 50%)\"])\n .interpolate(d3.interpolateHcl);\n\n var svg = d3.select(\"#classChart\")\n .insert(\"svg:svg\", \"h2\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\n .on(\"dblclick.zoom\", null);\n\n function appendMainGroup() {\n return svg.append(\"svg:g\")\n .attr({\n id: \"main-group\",\n transform: \"translate(\" + width / 2 + \",\" + height / 2 + \")\"\n });\n }\n\n function savePrefixesState(hidePrefixes) {\n if (!angular.isUndefined(hidePrefixes)) {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES, hidePrefixes);\n }\n }\n\n function getPrefixesState() {\n return LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_HIDE_PREFIXES) === \"true\";\n }\n\n /*\n * Prepares SVG document image export by adding xml namespaces and\n * additional style information\n */\n function prepareForSVGImageExport() {\n // get css rules for the diagram\n var cssRules = SVG.Export.getCSSRules(\"css/rdf-class-hierarchy-labels.css?v=10.0.0-M2-1\");\n // inline css rules in a defs tag\n d3.selectAll(\"#main-group\")\n .append(\"defs\");\n $(\"defs\").append('<style type=\"text/css\"><![CDATA[' + cssRules + ']]></style>');\n\n // switch opacity to visible\n d3.selectAll(\"g\")\n .style(\"opacity\", 1);\n\n // convert selected html to base64\n var imgSrc = SVG.Export.generateBase64ImageSource();\n\n // set the binary image and a name for the downloadable file on the export button\n d3.select(this).attr({\n href: imgSrc,\n download: \"class-hierarchy-\" + $repositories.getActiveRepository() + \".svg\"\n });\n }\n\n scope.hidePrefixes = getPrefixesState();\n\n var g = appendMainGroup();\n\n if (!scope.classHierarchyData.classCount && $repositories.getActiveRepository() && !$repositories.isSystemRepository()) {\n $rootScope.loader = true;\n $rootScope.hierarchyError = false;\n const selGraphFromCache = LocalStorageAdapter.get(`classHierarchy-selectedGraph-${$repositories.getActiveRepository()}`);\n GraphDataRestService.getClassHierarchyData(selGraphFromCache !== null ? selGraphFromCache.contextID.uri : \"\")\n .success(function (response, status, headers) {\n $rootScope.loader = false;\n if (status === 207) {\n toastr.warning($translate.instant('graphexplore.update.diagram'), $translate.instant('graphexplore.repository.data.changed'));\n }\n scope.classHierarchyData = response;\n\n d3.select(\"#download-svg\")\n .on(\"mouseover\", prepareForSVGImageExport);\n\n }).error(function (response) {\n $rootScope.loader = false;\n $rootScope.hierarchyError = getError(response);\n toastr.error($translate.instant('graphexplore.error.request.failed', {name: ROOT_OBJ_NAME, error: getError(response)}));\n });\n }\n\n\n var autoZoomToPreviousState,\n doFocus;\n\n var oldRoot,\n focus,\n rootFocusEvent,\n classSearchEvent,\n flattenedClassData = {};\n\n function drawDiagram(root, config, newFocus, switchPrefixes) {\n if (rootFocusEvent) rootFocusEvent();\n if (classSearchEvent) classSearchEvent();\n // remove old group tag containing the diagram\n d3.selectAll(\"#main-group\").remove();\n\n // append new empty group tag in order to rerender new diagram\n g = appendMainGroup();\n\n // fix for single child classes\n CirclePacking.SingleChild.addPlaceholders(root, true);\n focus = newFocus ? newFocus : root;\n\n var nodes = pack.nodes(root),\n view;\n\n focus.isInFocusTransitive = true;\n\n // fixes for single child classes\n CirclePacking.SingleChild.removePlaceholders(nodes);\n CirclePacking.SingleChild.centerNodes(nodes);\n CirclePacking.SingleChild.makePositionsRelativeToZero(nodes);\n\n var tip = d3tip()\n .attr('class', 'd3-tip')\n //.offset([-10, 0])\n .customPosition(function (d) {\n return {\n top: 'inherit',\n bottom: ($window.innerHeight - d3.event.clientY) + 'px',\n right: ($window.innerWidth - d3.event.clientX) + 'px'\n };\n })\n .html(function (d) {\n return d.name;\n });\n\n svg.call(tip);\n\n var circleGroup = g.selectAll(\"circle\")\n .data(nodes)\n .enter().append(\"g\");\n\n if (config.doFade) {\n circleGroup.each(function (d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n var flattenedClassNames = [];\n\n var circle = circleGroup\n .append(\"circle\")\n .attr(\"class\", function (d) {\n return d.role;\n })\n .style(\"fill\", function (d) {\n //return colors[d.depth % 6];\n return d.children ? color(d.depth) : \"#E0D0D0\";\n })\n .each(function (d) {\n d.circle = d3.select(this);\n if (d.name !== ROOT_OBJ_NAME) {\n var key = d.name;\n flattenedClassNames.push({name: key});\n flattenedClassData[[key]] = d;\n\n d.circle.classed(\"rdf-class\", true);\n d.circle.on('mouseover', function () {\n if (config.noPrefixes) {\n tip.show(d);\n } else if (!d.textHidden) {\n tip.hide(d);\n } else {\n tip.show(d);\n }\n });\n d.circle.on('mouseout', tip.hide);\n }\n });\n\n if (flattenedClassNames) {\n flattenedClassNames = _.uniqBy(flattenedClassNames, 'name');\n scope.flattenedClassNames = flattenedClassNames;\n }\n\n var selectedClass;\n\n function getCurrentClassDataAndMarkSelected(obj) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n obj.circle.classed(\"selected\", obj.selected = true);\n selectedClass = obj;\n }\n\n function showClassInfoPanel() {\n scope.selectedClass = selectedClass;\n scope.showClassInfoPanel = true;\n }\n\n function closeClassInfoPanel() {\n scope.showClassInfoPanel = false;\n }\n\n function goToDomainRangeGraphView() {\n $rootScope.$broadcast('goToDomainRangeGraphView', selectedClass, focus);\n }\n\n var clickCancel = D3.Click.delayDblClick();\n var parentCircles = d3.selectAll(\".parent, .topLevelParent, .child, .root\")\n .call(clickCancel);\n\n doFocus = function (obj) {\n zoom(obj);\n\n if (obj.name === ROOT_OBJ_NAME) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n } else {\n getCurrentClassDataAndMarkSelected(obj);\n showClassInfoPanel();\n\n // FIXME: is it ok to bind this event handler every time and not just once?\n scope.$on('sidePanelClosed', function (event) {\n d3.selectAll(\".selected\").classed(\"selected\", obj.selected = false);\n });\n }\n\n\n //do not stop event propagation here\n };\n\n clickCancel.on(\"click\", function (obj) {\n // add clicked class to browser history\n if (obj.id) {\n $window.history.pushState({id: obj.id}, \"classHierarchyPage\" + obj.id, \"hierarchy#\" + obj.id);\n }\n\n //hide current d3-tip tooltip\n tip.hide();\n\n doFocus(obj);\n });\n\n clickCancel.on(\"dblclick\", function (obj) {\n if (obj === root) {\n return;\n }\n // hide current d3-tip tooltip in order not to appear in the next view\n tip.hide();\n getCurrentClassDataAndMarkSelected(obj);\n goToDomainRangeGraphView();\n\n d3.event.stopPropagation();\n });\n\n var lastTimeWheel = 0;\n svg.on('wheel', function () {\n // hide current d3-tip tooltip\n tip.hide();\n\n var e = d3.event;\n e.preventDefault();\n e.stopPropagation();\n\n // at least 100ms must have passed since last time we updated\n var now = new Date().getTime();\n if (now - lastTimeWheel > 100) {\n lastTimeWheel = now;\n } else {\n return;\n }\n\n var direction = '';\n if (e.deltaY <= -1) {\n direction = 'in';\n } else if (e.deltaY >= 1) {\n direction = 'out';\n }\n\n var obj = e.target.__data__;\n\n if (!obj) {\n // scroll outside the big circle\n obj = focus;\n }\n\n if (direction === 'in') {\n // determine object to zoom to\n\n if (obj !== focus) {\n // consider the object on which the scroll event occurred\n // and find the furthest parent that has no focused children\n while (obj.parent && !obj.parent.isInFocusTransitive) {\n obj = obj.parent;\n }\n if (obj.depth < focus.depth) {\n // however if that parent is of lower depth than the focus we ignore it\n obj = focus;\n }\n }\n\n if (obj === focus && obj.children) {\n // if object is in focus and it has children we zoom to its biggest child\n // TODO: sort children on backend\n var newobj = obj.children[0];\n for (var i = 1; i < obj.children.length; i++) {\n if (obj.children[i].sortingRank > newobj.sortingRank) {\n newobj = obj.children[i];\n }\n }\n obj = newobj;\n }\n\n zoom(obj, true);\n } else if (direction === 'out') {\n // zooming out simply goes one parent up\n obj = focus.parent;\n if (obj) {\n zoom(obj, true);\n }\n }\n\n if (focus.name === ROOT_OBJ_NAME) {\n $window.history.replaceState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n }\n\n // redraw slider on zoom out\n sendSliderData();\n });\n\n var text = g.selectAll(\"text\")\n .data(nodes)\n .enter().append(\"text\")\n .attr(\"class\", function (d) {\n return d.children && d.children.length ? \"label\" : \"label child-label\";\n })\n .each(function (d) {\n d.textSel = d3.select(this);\n });\n\n function trimPrefixes(d) {\n var idx = d.name.indexOf(\":\");\n var absUriIdx = d.name.indexOf(\"http://\");\n if (absUriIdx > -1) {\n // if we have no prefix available ignore\n d.noPrefixName = d.name;\n } else if (idx > -1) {\n d.noPrefixName = d.name.substring(idx + 1);\n }\n }\n\n if (config.noPrefixes) {\n if (oldRoot !== root) {\n text.each(trimPrefixes);\n oldRoot = root;\n }\n\n text\n .style(\"font-size\", function (d) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r);\n })\n .text(function (d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r / 3);\n });\n } else {\n text\n .style(\"font-size\", function (d) {\n return D3.Text.calcFontSize(d.name, d.r);\n })\n .text(function (d) {\n return D3.Text.getTextWithElipsisIfNeeded(d.name, d.r / 3);\n })\n }\n\n // TODO: make this use the full version (same as zoom)\n text.style(\"display\", function (d) {\n if (d.parent === root) {\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n return null;\n } else {\n d.textHidden = true;\n return \"none\";\n }\n });\n\n if (config.doFade && !config.keepPrevState) {\n text.each(function (d) {\n D3.Transition.fadeIn(d3.select(this), 550);\n });\n }\n\n autoZoomToPreviousState = function () {\n function focusOnCurrentClass(focusHistoryId) {\n if (focusHistoryId) {\n circle.each(function (d) {\n if (focusHistoryId == d.id) {\n doFocus(d);\n }\n });\n }\n }\n\n var focusHistoryId = $location.hash();\n\n $window.onpopstate = function (event) {\n if (event.state) {\n var focusHistoryId = event.state.id;\n focusOnCurrentClass(focusHistoryId);\n }\n };\n\n focusOnCurrentClass(focusHistoryId);\n };\n\n var node = g.selectAll(\"circle, text\");\n\n function zoomTo(v, switchPrefixes) {\n var k = diameter / v[2];\n view = v;\n\n node.attr(\"transform\", function (d) {\n return \"translate(\" + (d.x - v[0]) * k + \",\" + (d.y - v[1]) * k + \")\";\n });\n\n circle.attr(\"r\", function (d) {\n return d.r * k;\n });\n\n function switchPrefixesInPlace(d) {\n // if uris match with the topLevelParentUri of the focused element\n // or your focus is a top level parent hide its label and if it is not\n // a child element show all of its child labels. If it is a child element\n // only show its label.\n if (d.fullName === focus.topLevelParentUri || focus.topLevelParentUri === ROOT_OBJ_NAME) {\n d.textSel.style(\"display\", \"none\");\n if (focus.children && focus.children.length) {\n _.each(focus.children, function (c) {\n c.textSel.style(\"display\", \"inline\");\n });\n } else {\n focus.textSel.style(\"display\", \"inline\");\n }\n\n // in order to show prefixes of siblings check if the focused\n // element has a parent and show all of its children except\n // for the name of the focused element because you need to see\n // its children\n if (focus.parent) {\n _.each(focus.parent.children, function (c) {\n if (c.name !== focus.name) {\n c.textSel.style(\"display\", \"inline\");\n }\n });\n }\n }\n }\n\n if (switchPrefixes) {\n text.each(switchPrefixesInPlace);\n }\n\n text\n .style(\"font-size\", function (d) {\n if (config.noPrefixes) {\n return D3.Text.calcFontSize(d.noPrefixName, d.r * k);\n }\n return D3.Text.calcFontSize(d.name, d.r * k);\n })\n .text(function (d) {\n if (config.noPrefixes) {\n return D3.Text.getTextWithElipsisIfNeeded(d.noPrefixName, d.r * k / 3);\n }\n return D3.Text.getTextWithElipsisIfNeeded(d.name, d.r * k / 3);\n });\n }\n\n\n function adjustRadius(r) {\n var newr = r * 2 + margin;\n if (r * 2 / newr < 0.3) {\n // for very small circles we need to adjust\n newr = r * 2 + 2;\n }\n return newr;\n }\n\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)], switchPrefixes);\n\n function textUpdateStart(d) {\n if (d.isInFocusTransitive || !(d.parent && d.parent.isInFocusTransitive)) {\n // hide labels of classes that are in focus (including children) OR whose parents aren't in focus\n d.textHidden = true;\n this.style.display = \"none\";\n }\n }\n\n function textUpdateEnd(d) {\n if (d.isInFocusTransitive || !(d.parent && d.parent.isInFocusTransitive)) {\n // hide labels of classes that are in focus (including children) OR whose parents aren't in focus\n // this.style.display = \"none\";\n } else {\n // show all other labels\n d.textHidden = this.textContent.indexOf(\"...\") + 3 === this.textContent.length;\n this.style.display = \"\";\n }\n }\n\n function zoom(d, shouldClosePanel) {\n // use empty timeout to force the following code to be executed on the next $digest cycle\n // in order to avoid '$digest in progress' error\n $timeout(function () {\n scope.showExternalElements = (d.name === ROOT_OBJ_NAME);\n });\n\n if (d.id) {\n $window.history.replaceState({id: d.id}, \"classHierarchyPage\" + d.id, \"hierarchy#\" + d.id);\n }\n\n if (focus === d) {\n return;\n }\n\n if (shouldClosePanel) {\n closeClassInfoPanel();\n d3.selectAll(\".selected\").classed(\"selected\", false);\n }\n\n if (focus.parent) {\n var p = focus;\n while (p) {\n p.isInFocusTransitive = false;\n p = p.parent;\n }\n }\n\n var p = d;\n while (p) {\n p.isInFocusTransitive = p.children;\n p = p.parent;\n }\n\n focus = d;\n\n var isVerySmallCircle = focus.r * 2 / (focus.r * 2 + margin) < 0.3;\n\n if (isVerySmallCircle || scope.currentSliderValue > scope.currentBrowserLimit) {\n // no fancy animation for slower browsers if above the limit or if zooming to a very small circle\n zoomTo([focus.x, focus.y, adjustRadius(focus.r)]);\n\n text.each(function (d) {\n textUpdateStart.call(this, d);\n textUpdateEnd.call(this, d);\n });\n } else {\n // the fancy version for faster browsers\n var transition = d3.transition()\n .duration(ZOOM_DURATION)\n .tween(\"zoom\", function (d) {\n var i = d3.interpolateZoom(view, [focus.x, focus.y, adjustRadius(focus.r)]);\n return function (t) {\n zoomTo(i(t));\n };\n });\n\n transition.selectAll(\"text\")\n // Experimental: hide texts to be hidden on \"start\", show texts to be shown on \"end\"\n .each(\"start\", textUpdateStart)\n .each(\"end\", textUpdateEnd);\n }\n }\n\n rootFocusEvent = scope.$on('rootFocus', function () {\n $window.history.pushState({id: 1}, \"classHierarchyPage1\", \"hierarchy#1\");\n doFocus(root);\n });\n\n classSearchEvent = scope.$on('classSearch', function (selectedClass) {\n doFocus(selectedClass);\n });\n }\n\n function sendSliderData() {\n var currentClassCount = scope.classHierarchyData.classCount;\n let currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n\n if (!currentSliderValue || currentSliderValue > currentClassCount) {\n currentSliderValue = currentClassCount;\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n }\n\n $rootScope.$broadcast(\"classCount\", currentClassCount, currentSliderValue);\n }\n\n window.addEventListener('resize', sendSliderData);\n\n window.addEventListener('beforeunload', removeResizeListener);\n\n function removeResizeListener() {\n window.removeEventListener('resize', sendSliderData);\n window.removeEventListener('beforeunload', removeResizeListener);\n }\n\n var prefixesWatch,\n currentClassCountWatch,\n searchedClassBroadcast,\n onEnterClassSearchBroadcast;\n\n scope.$watch('classHierarchyData', function () {\n // when data changes unregister watchers by calling them\n if (prefixesWatch) prefixesWatch();\n if (currentClassCountWatch) currentClassCountWatch();\n if (searchedClassBroadcast) searchedClassBroadcast();\n if (onEnterClassSearchBroadcast) onEnterClassSearchBroadcast();\n\n // get initial state of prefixes (hidden or not) when changing repositories\n // in order to avoid triggering an unwanted prefixes watch\n var initialPrefixesState = getPrefixesState();\n\n if (scope.classHierarchyData.classCount) {\n sendSliderData();\n\n var root = angular.copy(scope.classHierarchyData);\n\n function sortRoot(root) {\n // add all classes to a flat array, add parent information\n // and sort according to instancesCount DESC, depth ASC\n return pack\n .nodes(root)\n .sort(function (a, b) {\n if (a.sortingRank > b.sortingRank) {\n return -1;\n } else if (a.sortingRank < b.sortingRank) {\n return 1;\n } else if (a.depth > b.depth) {\n return 1;\n } else if (a.depth < b.depth) {\n return -1;\n } else {\n return 0;\n }\n });\n }\n\n var sorted = sortRoot(root);\n\n // we start with an empty new root\n var newRoot;\n var noPrefixesGlobal;\n\n\n function restoreDiagramState(currentRoot, switchPrefixes) {\n var prefixesConfig = {\n keepPrevState: true,\n noPrefixes: getPrefixesState()\n };\n\n // get noPrefixes flag from drawDiagram configuration params\n noPrefixesGlobal = prefixesConfig.noPrefixes;\n\n if (newRoot) {\n drawDiagram(newRoot, prefixesConfig, focus, true);\n } else {\n drawDiagram(currentRoot, prefixesConfig, focus, true);\n }\n\n $timeout(function () {\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_SWITCH_PREFIXES, switchPrefixes);\n autoZoomToPreviousState();\n }, 70);\n }\n\n function redrawFilteredDiagram(currentSliderValue, sortedRoot, useSlider) {\n if (!currentSliderValue) {\n return;\n }\n\n LocalStorageAdapter.set(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE, currentSliderValue);\n\n newRoot = {\n name: ROOT_OBJ_NAME,\n children: []\n };\n\n // walk through the given count of (sorted) classes\n // - record the id of each class we've seen\n // - add the root level classes to the new root\n var addedIds = new Set();\n for (var k = 1; k <= currentSliderValue; k++) {\n addedIds.add(sortedRoot[k].id);\n if (sortedRoot[k].parent === sortedRoot[0]) { // i.e. the parent is the \"class hierarchy\"\n newRoot.children.push(sortedRoot[k]);\n }\n }\n\n // walk through all the classes in the new root and only keep those that have an \"added id\"\n // we create separate copies of the arrays in order not to contaminate the original data\n // we also copy each class's object ($.extend ...) for the same reason\n function fixChildren(node) {\n if (!node.children) {\n return;\n }\n var newChildren = [];\n for (var i = 0; i < node.children.length; i++) {\n if (addedIds.has(node.children[i].id)) {\n newChildren.push($.extend({}, node.children[i]));\n }\n }\n node.children = newChildren;\n for (var i = 0; i < node.children.length; i++) {\n fixChildren(node.children[i]);\n }\n }\n\n fixChildren(newRoot);\n\n if (useSlider) {\n // redraw diagram when slider value changes and persist current state\n // in local storage\n noPrefixesGlobal = angular.isUndefined(noPrefixesGlobal) ? getPrefixesState() : noPrefixesGlobal;\n var redrawConfig = {\n noPrefixes: noPrefixesGlobal\n };\n drawDiagram(newRoot, redrawConfig);\n } else {\n // if the user returns to the diagram with back browser button\n // read the saved state (show/hide prefixes, current slider value)\n // from local storage and render the diagram according to the saved metrics\n restoreDiagramState(root);\n }\n }\n\n var currentSliderValue = LocalStorageAdapter.get(LSKeys.CLASS_HIERARCHY_CURRENT_SLIDER_VALUE);\n if (currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sorted);\n } else {\n var basicConfig = {\n doFade: true,\n keepPrevState: true,\n noPrefixes: getPrefixesState()\n };\n drawDiagram(root, basicConfig);\n autoZoomToPreviousState();\n }\n\n prefixesWatch = scope.$watch('hidePrefixes', function (hidePrefixes) {\n if (angular.isUndefined(hidePrefixes) || initialPrefixesState) {\n initialPrefixesState = undefined;\n return;\n }\n // if digest overflows a possible fix might be wrapping this in $timeout\n $timeout(function () {\n savePrefixesState(hidePrefixes);\n restoreDiagramState(root, true);\n }, 50);\n }, true);\n\n currentClassCountWatch = scope.$watch('currentSliderValue', function (currentSliderValue) {\n redrawFilteredDiagram(currentSliderValue, sorted, true);\n }, true);\n\n // we handle this event for the cases where we already have searched for a given class and\n // hit enter again on the already selected class in order again react and zoom to it again\n // if we are not at the moment\n var currentSearchedClass;\n onEnterClassSearchBroadcast = scope.$on('onEnterKeypressSearchAction', function (event) {\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n\n searchedClassBroadcast = scope.$on('searchedClass', function (event, searchedClass) {\n currentSearchedClass = flattenedClassData[searchedClass.name];\n if (currentSearchedClass) {\n doFocus(currentSearchedClass);\n }\n });\n }\n }, true);\n }\n}\n","import SVG from 'lib/common/svg-export';\nimport D3 from 'lib/common/d3-utils';\nimport 'angular/utils/local-storage-adapter';\n\nangular\n .module('graphdb.framework.graphexplore.directives.domainrange', [\n 'graphdb.framework.graphexplore.controllers.domainrange',\n 'graphdb.framework.utils.localstorageadapter'\n ])\n .constant('ONTO_RED', '#F04E23')\n .constant('ONTO_GREEN', '#0CB0A0')\n .constant('ONTO_BLUE', '#003663')\n .constant('NON_COLLAPSED_REFLEXIVE_LINK_LIMIT', 6)\n .directive('domainRangeGraph', domainRangeGraphDirective);\n\ndomainRangeGraphDirective.$inject = ['$rootScope', '$window', '$repositories', 'GraphDataRestService', '$location', 'LocalStorageAdapter', 'LSKeys', '$timeout', 'toastr', 'ONTO_RED', 'ONTO_GREEN', 'ONTO_BLUE', 'NON_COLLAPSED_REFLEXIVE_LINK_LIMIT'];\n\nfunction domainRangeGraphDirective($rootScope, $window, $repositories, GraphDataRestService, $location, LocalStorageAdapter, LSKeys, $timeout, toastr, ONTO_RED, ONTO_GREEN, ONTO_BLUE, NON_COLLAPSED_REFLEXIVE_LINK_LIMIT) {\n return {\n restrict: 'AE',\n template: '<div id=\"domain-range\"></div>',\n scope: {\n showPredicatesInfoPanel: '=',\n selectedPredicate: '=',\n collapseEdges: '='\n },\n link: linkFunc\n };\n\n function linkFunc(scope) {\n const timer = $timeout(function () {\n renderDomainRangeGraph(scope);\n }, 50);\n\n scope.$on(\"$destroy\", function () {\n $timeout.cancel(timer);\n });\n }\n\n function renderDomainRangeGraph(scope) {\n d3.selection.prototype.moveToFront = function () {\n return this.each(function () {\n d3.select(this.parentNode.appendChild(this));\n });\n };\n\n d3.selection.prototype.moveToBack = function () {\n return this.each(function () {\n const firstChild = this.parentNode.firstChild;\n if (firstChild) {\n this.parentNode.insertBefore(this, firstChild);\n }\n });\n };\n\n var width = 1200,\n height = 600;\n\n var mainClassSize = width / 18,\n otherClassSize = width / 110,\n datatypeSize = otherClassSize / 2,\n labelFontSize = width / 90,\n basicArrowStrokeWidth = width / 1000,\n collapsedArrowStrokeWidth = width / 600;\n\n\n var force = d3.layout.force()\n .size([width, height])\n .charge(-900);\n\n var drag = force.drag()\n .on(\"dragstart\", dragstart);\n\n var svg = d3.select(\"#domain-range\")\n .append(\"svg\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\n .on(\"dblclick.zoom\", null);\n\n var defs = svg.append(\"defs\");\n\n defs.append(\"marker\")\n .attr({\n id: \"arrow\",\n viewBox: \"0 -5 10 10\",\n refX: 10,\n refY: 0,\n markerUnits: \"strokeWidth\",\n markerWidth: 5,\n markerHeight: 5,\n orient: \"auto\",\n fill: ONTO_BLUE\n })\n .append(\"path\")\n .attr({\n d: \"M0,-5L10,0L0,5\",\n class: \"arrowHead\"\n });\n\n defs.append(\"marker\")\n .attr({\n id: \"collapsed-arrow\",\n viewBox: \"0 -5 10 10\",\n refX: 9,\n refY: 0,\n markerUnits: \"strokeWidth\",\n markerWidth: 4,\n markerHeight: 4,\n orient: \"auto\",\n fill: ONTO_BLUE\n })\n .append(\"path\")\n .attr({\n d: \"M0,-5L10,0L0,5\",\n class: \"arrowHead\"\n });\n\n defs.append(\"marker\")\n .attr({\n id: \"arrow-loop\",\n viewBox: \"0 -5 10 10\",\n refX: 7,\n refY: 0,\n markerUnits: \"strokeWidth\",\n markerWidth: 5,\n markerHeight: 5,\n orient: \"auto\",\n fill: ONTO_BLUE\n })\n .append(\"path\")\n .attr({\n d: \"M0,-5L10,0L0,5\",\n class: \"arrowHead\"\n });\n\n /*\n * Prepares SVG document image export by adding xml namespaces and\n * additional style information\n */\n function prepareForSVGImageExport() {\n // get css rules for the diagram\n var cssRules = SVG.Export.getCSSRules(\"css/domain-range-graph.css?v=10.0.0-M2-1\");\n\n // inline css rules in a defs tag\n $(\"defs\").append('<style type=\"text/css\"><![CDATA[' + cssRules + ']]></style>');\n\n // convert selected html to base64\n var imgSrc = SVG.Export.generateBase64ImageSource();\n\n // set the binary image and a name for the downloadable file on the export button\n d3.select(this).attr({\n href: imgSrc,\n download: \"domain-range-graph-\" + $repositories.getActiveRepository() + \".svg\"\n });\n }\n\n d3.select(\"#download-svg\")\n .on(\"mouseover\", prepareForSVGImageExport);\n\n // start of code for legend\n var legendBackgroundWidth = width / 7;\n var legendBackgroundHeight = legendBackgroundWidth * 1.2;\n\n var svgLegend = d3.select(\".legend-container\")\n .append(\"svg\")\n .attr(\"viewBox\", \"0 0 \" + legendBackgroundWidth + \" \" + legendBackgroundHeight)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\");\n\n var legendCellGroup = svgLegend;\n\n legendCellGroup.append(\"rect\")\n .attr({\n width: legendBackgroundWidth,\n height: legendBackgroundHeight\n })\n .style(\"fill\", \"rgba(235, 235, 235, 0.9)\");\n\n var sourceX = width / 75;\n var sourceY = width / 40;\n var targetX = sourceX + mainClassSize / 2.5;\n var targetY = sourceY;\n\n var legendTextX = targetX + width / 90;\n var legendLabelFontSize = labelFontSize / 1.1;\n\n var classNodeY = sourceY;\n var legendClassNode = legendCellGroup\n .append(\"circle\")\n .attr({\n class: \"legend-class-node\",\n cx: (sourceX + targetX) / 2,\n cy: classNodeY,\n r: mainClassSize / 4.5\n });\n\n var classNodeTextY = targetY + width / 370;\n legendCellGroup\n .append(\"text\")\n .attr({\n x: legendTextX,\n y: classNodeTextY\n })\n .style('font-size', legendLabelFontSize + 'px')\n .text(\"main class node\");\n\n var objectNodeY = classNodeY + width / 30;\n legendCellGroup\n .append(\"circle\")\n .attr({\n class: \"legend-object-node\",\n cx: (sourceX + targetX) / 2,\n cy: objectNodeY,\n r: otherClassSize / 1.25\n });\n\n var objectNodeTextY = classNodeTextY + width / 30;\n legendCellGroup\n .append(\"text\")\n .attr({\n x: legendTextX,\n y: objectNodeTextY\n })\n .style('font-size', legendLabelFontSize + 'px')\n .text(\"class node\");\n\n var datatypeNodeY = objectNodeY + width / 45;\n legendCellGroup\n .append(\"circle\")\n .attr({\n class: \"legend-datatype-node\",\n cx: (sourceX + targetX) / 2,\n cy: datatypeNodeY,\n r: datatypeSize\n });\n\n var datatypeNodeTextY = objectNodeTextY + width / 45;\n legendCellGroup\n .append(\"text\")\n .attr({\n x: legendTextX,\n y: datatypeNodeTextY\n })\n .style('font-size', legendLabelFontSize + 'px')\n .text(\"datatype node\");\n\n var basicPropertyArrowY = datatypeNodeY + width / 45;\n var classNodeSel = d3.select('.legend-class-node');\n legendCellGroup\n .append(\"line\")\n .attr({\n class: \"property-arrow\",\n x1: sourceX,\n y1: basicPropertyArrowY,\n x2: targetX,\n y2: basicPropertyArrowY\n })\n .style(\"stroke-width\", basicArrowStrokeWidth)\n .attr(\"marker-end\", \"url(\" + $location.absUrl() + \"#arrow)\");\n\n legendCellGroup\n .append(\"text\")\n .attr({\n x: legendTextX,\n y: basicPropertyArrowY + (width / 370)\n })\n .style('font-size', legendLabelFontSize + 'px')\n .text(\"explicit property\");\n\n var implicitPropArrowY = basicPropertyArrowY + width / 45;\n legendCellGroup\n .append(\"line\")\n .attr({\n class: \"implicit-property-arrow\",\n x1: sourceX,\n y1: implicitPropArrowY,\n x2: targetX,\n y2: implicitPropArrowY\n })\n .style(\"stroke-width\", basicArrowStrokeWidth)\n .attr(\"marker-end\", \"url(\" + $location.absUrl() + \"#arrow)\");\n\n legendCellGroup\n .append(\"text\")\n .attr({\n x: legendTextX,\n y: implicitPropArrowY + (width / 370)\n })\n .style('font-size', legendLabelFontSize + 'px')\n .text(\"implicit property\");\n\n var collapsedPropArrowY = implicitPropArrowY + width / 45;\n legendCellGroup\n .append(\"line\")\n .attr({\n class: \"collapsed-property-arrow\",\n x1: sourceX,\n y1: collapsedPropArrowY,\n x2: targetX,\n y2: collapsedPropArrowY\n })\n .style(\"stroke-width\", collapsedArrowStrokeWidth)\n .attr(\"marker-end\", \"url(\" + $location.absUrl() + \"#collapsed-arrow)\");\n\n legendCellGroup\n .append(\"text\")\n .attr({\n x: legendTextX,\n y: collapsedPropArrowY + (width / 370)\n })\n .style('font-size', legendLabelFontSize + 'px')\n .text(\"collapsed property\");\n // end of code for legend\n\n // there doesn't seem to be a need for a separate group\n var g = svg; //svg.append(\"g\");\n\n var selectedRdfUri = $location.search().uri;\n var classNodeLabel = $location.search().name;\n var collapsed = $location.search().collapsed;\n\n GraphDataRestService.getDomainRangeData(selectedRdfUri, collapsed)\n .success(function (response, status, headers) {\n scope.domainRangeGraphData = response;\n }).error(function (response) {\n toastr.error(\"Request for \" + classNodeLabel + \" failed!\");\n });\n\n function switchEdgeMode(collapsed) {\n $rootScope.$broadcast('switchEdgeMode', {\n uri: selectedRdfUri,\n name: classNodeLabel,\n collapsed: collapsed\n });\n }\n\n // intercept back button press and set action to local storage\n $(window).on('popstate', function () {\n LocalStorageAdapter.set(LSKeys.DOMAIN_RANGE_WENT_BACK, true);\n });\n\n $window.onpopstate = function (event) {\n if (event.state) {\n $rootScope.$broadcast(\"changeCollapsedEdgesState\", event.state.collapsed);\n }\n };\n\n scope.$watch('collapseEdges', function () {\n if (!angular.isUndefined(scope.collapseEdges)) {\n LocalStorageAdapter.set(LSKeys.DOMAIN_RANGE_COLLAPSE_EDGES, scope.collapseEdges);\n\n // if the back button has not been pressed, then switch to collapsed or non collapsed mode\n // otherwise skip, because back button will not function properly and will not pop the entire\n // history stack\n if (LocalStorageAdapter.get(LSKeys.DOMAIN_RANGE_WENT_BACK) !== \"true\") {\n switchEdgeMode(scope.collapseEdges);\n }\n\n // after back button status has been checked, remove the action from local storage in order\n // to be clean for next check\n LocalStorageAdapter.remove(LSKeys.DOMAIN_RANGE_WENT_BACK);\n }\n });\n\n scope.$watch('domainRangeGraphData', function () {\n if (scope.domainRangeGraphData) {\n var graph = angular.copy(scope.domainRangeGraphData);\n\n force\n .nodes(graph.nodes)\n .links(graph.links);\n\n var linkGroup = g.selectAll(\".link\")\n .data(graph.links)\n .enter()\n .append(\"g\");\n\n function styleArrowsInCollapsedMode(sel) {\n sel.style(\"stroke\", ONTO_BLUE);\n sel.style(\"stroke-width\", collapsedArrowStrokeWidth);\n sel.attr(\"marker-end\", \"url(\" + $location.absUrl() + \"#collapsed-arrow)\");\n }\n\n var link,\n loopLink,\n loopLinkEdgeCount = 0;\n\n\n linkGroup\n .each(function (d) {\n if (d.objectPropNodeClassUri !== selectedRdfUri) {\n link = linkGroup\n .append(\"line\")\n .attr({\n class: \"link\",\n // absolute url needed because angular inserts a <base> tag\n \"marker-end\": \"url(\" + $location.absUrl() + \"#arrow)\"\n })\n .style(\"stroke-width\", basicArrowStrokeWidth)\n .each(function (d) {\n switch (d.propertyType) {\n case \"objectLeft\":\n d.targetRadius = mainClassSize;\n break;\n case \"objectRight\":\n d.targetRadius = otherClassSize;\n break;\n case \"datatype\":\n d.targetRadius = datatypeSize;\n break;\n default:\n d.targetRadius = 0;\n }\n var sel = d3.select(this);\n if (d.targetNodeEdgeCount > 1) {\n styleArrowsInCollapsedMode(sel);\n } else if (d.implicit) {\n sel.style(\"stroke-dasharray\", \"3, 3\");\n }\n });\n } else {\n if (angular.isUndefined(loopLink)) {\n var loopLinkSize = mainClassSize / 2;\n loopLink = d3.select(this)\n .append(\"path\")\n .attr({\n d: \"M 0 0 A \" + loopLinkSize + \" \" + loopLinkSize + \" 0 1 1 0 \" + loopLinkSize,\n class: \"loop-link\",\n fill: \"none\",\n \"marker-end\": \"url(\" + $location.absUrl() + \"#arrow-loop)\"\n })\n .style(\"stroke-width\", basicArrowStrokeWidth);\n }\n\n loopLinkEdgeCount += d.targetNodeEdgeCount;\n if (loopLinkEdgeCount > 1) {\n styleArrowsInCollapsedMode(d3.select(\".loop-link\"));\n }\n }\n });\n\n var previousPropertyNameSelection = {};\n\n function disableCollapsedPredicateLabelHightlighting() {\n if (!$.isEmptyObject(previousPropertyNameSelection)) {\n previousPropertyNameSelection.text.style(\"fill\", \"black\");\n previousPropertyNameSelection.background.style(\"fill\", \"#f0f0f0\");\n }\n }\n\n // when clicking anywhere else but the collapsed labels disable highlighting\n // of the currently selected one\n $(\"document\").ready(function () {\n $(\"#domain-range\").bind(\"click\", disableCollapsedPredicateLabelHightlighting);\n });\n\n function onCollapsedPropertyNameClick(d) {\n disableCollapsedPredicateLabelHightlighting();\n previousPropertyNameSelection.text = d3.select(this);\n\n previousPropertyNameSelection.background = d3.select(this.previousSibling);\n previousPropertyNameSelection.text.style(\"fill\", \"white\");\n\n previousPropertyNameSelection.background.style(\"fill\", ONTO_BLUE);\n $timeout(function () {\n scope.showPredicatesInfoPanel = true;\n scope.selectedPredicate = d;\n });\n d3.event.stopPropagation();\n }\n\n\n var propertyNames = linkGroup\n .append(\"text\")\n .attr(\"class\", function (d) {\n return d.objectPropNodeClassUri === selectedRdfUri ? \"loop-link-property-name\" : \"property-name\";\n })\n .attr(\"dx\", function (d) {\n // offset text more towards the main class\n return mainClassSize / 2 * (d.propertyType === \"objectLeft\" ? 1 : -1);\n })\n .style(\"text-anchor\", function (d) {\n return d.propertyType === \"objectLeft\" ? \"end\" : \"start\";\n })\n .style(\"font-size\", labelFontSize)\n .text(function (d) {\n return d.targetNodeEdgeCount > 1 ? d.targetNodeEdgeCount + \" predicates\" : d.name;\n });\n\n\n propertyNames\n .each(function (d) {\n var sel = d3.select(this);\n var isCompoundEdge = /\\d\\spredicates/.test(sel.text());\n\n // handle collapsed predicates by making their font bold, make them highlight when clicked\n // and make them trigger the side panel to display the collapsed edges\n if (isCompoundEdge) {\n sel\n .style(\"font-weight\", \"bold\")\n .on(\"click\", onCollapsedPropertyNameClick);\n } else {\n // for regular predicate labels just attach a link to the \"Resources\" view\n // for more helpful information regarding them\n sel.on(\"click\", function (d) {\n $window.open(\"resource?uri=\" + encodeURIComponent(d.uri), \"_blank\");\n });\n }\n });\n var textPadding = width / 600;\n\n\n var linkRect = linkGroup\n .append(\"rect\")\n .attr(\"class\", function (d) {\n return d.objectPropNodeClassUri !== selectedRdfUri ? \"link-background\" : \"loop-link-background\"\n })\n .attr(\"width\", function (d) {\n d.calculatedWidth = this.previousSibling.getBBox().width;\n return d.calculatedWidth + textPadding * 2;\n })\n .attr(\"height\", function (d) {\n d.calculatedHeight = this.previousSibling.getBBox().height;\n return d.calculatedHeight + textPadding;\n })\n .attr(\"transform\", function (d) {\n // offset rect by the same amount as text (besides the padding)\n var translateX = textPadding - mainClassSize / 2 * (d.propertyType === \"objectLeft\" ? 1 : -1);\n if (d.propertyType === \"objectLeft\") {\n translateX += d.calculatedWidth;\n }\n return \"translate(-\" + translateX + \",-\" + (textPadding + d.calculatedHeight / 2) + \")\";\n })\n .on(\"click\", function (d) {\n d3.event.stopPropagation();\n });\n\n\n var nodeGroup = g.selectAll(\".node\")\n .data(graph.nodes)\n .enter()\n .append(\"g\");\n\n var node = nodeGroup\n .filter(function (d) {\n return d.objectPropClassUri !== selectedRdfUri;\n })\n .append(\"circle\")\n .each(function (d) {\n var sel = d3.select(this);\n if (d.classPosition === \"main\") {\n sel.attr({\n class: \"class-node\",\n r: mainClassSize\n })\n .attr(\"marker-end\", \"url(\" + $location.absUrl() + \"#loop-link)\");\n } else if (d.objectPropClassName === null) {\n sel.attr({\n class: \"datatype-node\",\n r: datatypeSize\n });\n } else {\n sel.attr({\n class: \"object-prop-node\",\n r: otherClassSize\n });\n }\n })\n .call(drag);\n\n\n function reloadDomainRangeGraphView(d, collapsed) {\n scope.$apply(function () {\n $rootScope.$broadcast('reloadDomainRangeGraphView', d, collapsed);\n });\n }\n\n d3.selectAll(\".object-prop-node\")\n .on(\"dblclick\", reloadDomainRangeGraphView);\n\n\n nodeGroup\n .filter(function (d) {\n return d.objectPropClassName && d.objectPropClassUri !== selectedRdfUri;\n })\n .append(\"text\")\n .attr(\"class\", function (d) {\n return d.classPosition + \"-class-label\";\n })\n .style(\"font-size\", labelFontSize)\n .text(function (d) {\n return d.objectPropClassName;\n })\n .on(\"click\", function (d) {\n $window.open(\"resource?uri=\" + encodeURIComponent(d.objectPropClassUri), \"_blank\");\n });\n\n var objectPropClassName = nodeGroup.select(\"text\");\n\n g.select(\".class-node\")\n .each(function () {\n d3.select(this.parentNode)\n .append(\"text\")\n .attr(\"class\", \"rdf-class-label\")\n .style(\"font-size\", function (d) {\n return D3.Text.calcFontSize(classNodeLabel, mainClassSize)\n })\n .text(classNodeLabel)\n .on(\"click\", function (d) {\n $window.open(\"resource?uri=\" + encodeURIComponent(selectedRdfUri), \"_blank\");\n });\n });\n\n\n var rdfClassName = g.select(\".class-node + text\"),\n classNode = d3.select(\".class-node\"),\n loopLinkBackgroundSel = d3.selectAll(\".loop-link-background\"),\n loopLinkPropertyName = d3.selectAll(\".loop-link-property-name\");\n\n propertyNames = d3.selectAll(\".property-name\");\n\n if (!angular.isUndefined(loopLink)) {\n var loopLinkBackgroundProps = [];\n\n loopLinkBackgroundSel.each(function (d, i) {\n var sel = d3.select(this);\n loopLinkBackgroundProps.push({\n idx: i,\n width: d.calculatedWidth,\n height: d.calculatedHeight\n });\n });\n }\n\n function tick(e) {\n var k = 8 * e.alpha;\n\n function pushEdgesToLeftAndRight(d) {\n if (d.propertyType === \"objectLeft\") {\n d.source.x -= 8 * k;\n d.source.y -= k / 9;\n } else {\n d.target.x += 8 * k;\n d.target.y -= k / 9;\n }\n }\n\n link\n .filter(function (d) {\n return d.objectPropNodeClassUri !== selectedRdfUri;\n })\n .attr(\"x1\", function (d) {\n return d.source.x;\n })\n .attr(\"y1\", function (d) {\n return d.source.y;\n })\n .attr(\"x2\", function (d) {\n return d.targetX;\n })\n .attr(\"y2\", function (d) {\n return d.targetY;\n })\n .each(function (d) {\n pushEdgesToLeftAndRight(d);\n\n // shortens the line to compensate for the circle at the target\n var angle = Math.atan2(d.target.y - d.source.y, d.target.x - d.source.x);\n d.targetX = d.target.x - Math.cos(angle) * d.targetRadius;\n d.targetY = d.target.y - Math.sin(angle) * d.targetRadius;\n });\n\n function positionLoopLink(d) {\n var loopTranslateX = d.x + mainClassSize * 0.96,\n loopTranslateY = d.y - mainClassSize / 5.7 - 5;\n loopLink.attr(\"transform\", \"rotate(270, \" + d.x + \",\" + d.y + \") translate(\" + loopTranslateX + \",\" + loopTranslateY + \")\");\n }\n\n function positionLoopLinkLabels(d) {\n function reposition(sel, i) {\n var foundLoopLinkBackgroundProps =\n $.grep(loopLinkBackgroundProps, function (obj) {\n return obj.idx == i;\n });\n var currentBackgroundHeight = 0;\n if (i > 0) {\n currentBackgroundHeight = parseFloat(2 * i * (foundLoopLinkBackgroundProps[0].height / 1.4));\n }\n\n var loopLinkLabelX = d.x,\n loopLinkLabelY = d.y - mainClassSize * 2.1 - currentBackgroundHeight;\n\n sel\n .attr({\n x: loopLinkLabelX,\n y: loopLinkLabelY\n })\n .moveToFront();\n }\n\n /**\n * Create a \"View more\" label to depict that the are more reflexive link labels\n * left that could be seen in the side panel when clicking this label.\n *\n * @param labelSel\n * d3 selection of the text label\n * @param backgroundSel\n * d3 selection of the rectangle element background\n * @param predicatesLeft\n * number of predicates left that are collapsed\n */\n function createViewMorePredicatesLabel(labelSel, backgroundSel, predicatesLeft) {\n labelSel\n .classed(\"view-more-preds-label\", true)\n .text(predicatesLeft + \" predicates more ...\");\n if (this.nextSibling !== null) {\n backgroundSel\n .classed(\"view-more-preds-rect\", true);\n }\n }\n\n loopLinkPropertyName.each(function (dd, i) {\n var sel = d3.select(this);\n\n var predicatesLeft = loopLinkPropertyName.size() - NON_COLLAPSED_REFLEXIVE_LINK_LIMIT;\n if (predicatesLeft < 0) {\n reposition(sel, i);\n } else {\n if (i == 0 && !scope.collapseEdges && predicatesLeft > 1) {\n createViewMorePredicatesLabel(sel, d3.select(this.nextSibling), predicatesLeft);\n reposition(sel, i);\n }\n\n if (i < NON_COLLAPSED_REFLEXIVE_LINK_LIMIT) {\n reposition(sel, i);\n } else {\n sel.remove();\n }\n }\n });\n // loopLinkPropertyName.each(function (dd, i) {\n // var sel = d3.select(this);\n // if (i < NON_COLLAPSED_REFLEXIVE_LINK_LIMIT) {\n // reposition(sel, i);\n // } else if (i == NON_COLLAPSED_REFLEXIVE_LINK_LIMIT) {\n // createViewMorePredicatesLabel(sel, d3.select(this.nextSibling));\n // reposition(sel, i);\n // } else {\n // sel.remove();\n // }\n // });\n }\n\n function positionLoopLinkBackgrounds(d) {\n var loopLinkBackgroundY = d.x + mainClassSize * 2,\n loopLinkBackgroundX = d.y - mainClassSize / 1.9;\n\n function reposition(sel, i) {\n var foundLoopLinkBackgroundProps =\n $.grep(loopLinkBackgroundProps, function (obj) {\n return obj.idx == i;\n });\n if (i > 0) {\n loopLinkBackgroundY += parseFloat(i * (foundLoopLinkBackgroundProps[0].height / (i / 1.4)));\n }\n\n sel\n .attr({\n transform: \"rotate(270, \" + d.x + \",\" + d.y + \") translate(\" + loopLinkBackgroundY + \",\" + loopLinkBackgroundX + \")\",\n width: foundLoopLinkBackgroundProps[0].height,\n height: foundLoopLinkBackgroundProps[0].width\n });\n }\n\n /**\n * Adjust new width of \"View more\" label background and add all reflexive link metadata the this\n * label in order to render them in the side panel.\n *\n * @param allLoopLinkEdges\n * all reflexive links to the current class\n */\n function adjustViewMorePredicatesLabel(allLoopLinkEdges) {\n var viewMoreTextWidth;\n d3.select(\".view-more-preds-label\")\n // make label bold to resemble a collapsed label\n .style(\"font-weight\", \"bold\")\n .each(function (d) {\n // attach all reflexive links to the \"view more\" collapsed predicate\n // because in non collapsed mode the backend does not provide them\n d.target.allEdges = allLoopLinkEdges;\n\n // calculate text width in pixels in order to adjust background width accordingly\n viewMoreTextWidth = this.getComputedTextLength();\n })\n .on(\"click\", onCollapsedPropertyNameClick);\n\n d3.select(\".view-more-preds-rect\")\n // we modify height property instead of width because they are reversed\n // when we repositioned loop link labels\n .attr(\"height\", viewMoreTextWidth + 2 * textPadding);\n }\n\n var allLoopLinkEdges = [];\n loopLinkBackgroundSel.each(function (dd, i) {\n allLoopLinkEdges.push(dd);\n if (i < NON_COLLAPSED_REFLEXIVE_LINK_LIMIT) {\n reposition(d3.select(this), i);\n } else {\n d3.select(this).remove();\n }\n });\n\n adjustViewMorePredicatesLabel(allLoopLinkEdges);\n }\n\n\n function centerClassNode(d) {\n if (!(window.ActiveXObject) && \"ActiveXObject\" in window) {\n Math.log10 = function (x) {\n return Math.log(x) / Math.LN10;\n };\n }\n var absDiff = classNode.attr(\"cx\") - width / 2,\n logOffset = Math.log10(Math.abs(absDiff)) * 0.5;\n d.x += absDiff > 0 ? -logOffset : logOffset;\n return d.x;\n }\n\n node\n .each(function (d) {\n if (d.classPosition === \"main\" && !angular.isUndefined(loopLink)) {\n positionLoopLink(d);\n positionLoopLinkLabels(d);\n positionLoopLinkBackgrounds(d);\n }\n\n if (d.objectPropClassUri !== selectedRdfUri) {\n d3.select(this)\n .attr(\"cx\", function (d) {\n // pushes the main class circle to the centre\n if (d.classPosition === \"main\") {\n return centerClassNode(d);\n }\n return d.x;\n })\n .attr(\"cy\", function (d) {\n return d.y;\n });\n }\n });\n\n\n rdfClassName\n .attr(\"x\", function (d) {\n return d.x;\n })\n .attr(\"y\", function (d) {\n return d.y;\n })\n .moveToFront();\n\n\n linkRect\n .filter(function (d) {\n return d.objectPropNodeClassUri !== selectedRdfUri;\n })\n .attr(\"x\", function (d) {\n if (d.target.x > d.source.x) {\n return (d.source.x + (d.target.x - d.source.x) / 2);\n } else {\n return (d.target.x + (d.source.x - d.target.x) / 2);\n }\n })\n .attr(\"y\", function (d) {\n if (d.target.y > d.source.y) {\n return (d.source.y + (d.target.y - d.source.y) / 2);\n } else {\n return (d.target.y + (d.source.y - d.target.y) / 2);\n }\n })\n .moveToFront();\n\n\n propertyNames\n .attr(\"x\", function (d) {\n if (d.target.x > d.source.x) {\n return (d.source.x + (d.target.x - d.source.x) / 2);\n } else {\n return (d.target.x + (d.source.x - d.target.x) / 2);\n }\n })\n .attr(\"y\", function (d) {\n if (d.target.y > d.source.y) {\n return (d.source.y + (d.target.y - d.source.y) / 2);\n } else {\n return (d.target.y + (d.source.y - d.target.y) / 2);\n }\n })\n .moveToFront();\n\n\n objectPropClassName\n .attr(\"x\", function (d) {\n if (d.classPosition === \"right\") {\n return d.x + otherClassSize * 1.2;\n } else {\n return d.x - otherClassSize * 1.2;\n }\n })\n .attr(\"y\", function (d) {\n return d.y;\n })\n .moveToFront();\n }\n\n\n force\n .on(\"tick\", tick)\n .linkDistance(width / 3.5)\n .start();\n\n }\n });\n\n function dragstart(d) {\n d3.select(this)\n .classed(\"selected\", d.selected = true);\n }\n }\n}\n","angular\n .module('graphdb.framework.graphexplore.directives.sysrepo', ['graphdb.framework.graphexplore.controllers.class'])\n .directive('systemRepoWarning', systemRepoWarningDirective);\n\nsystemRepoWarningDirective.$inject = ['$repositories', '$rootScope'];\n\nfunction systemRepoWarningDirective($repositories, $rootScope) {\n return {\n restrict: 'A',\n scope: {},\n templateUrl: 'js/angular/graphexplore/templates/systemRepoWarningTemplate.html',\n link: function (scope) {\n scope.isSystemRepository = function () {\n return $repositories.getActiveRepository() === 'SYSTEM';\n };\n\n scope.hasPermission = function () {\n return $rootScope.hasPermission();\n };\n }\n };\n}\n","angular\n .module('graphdb.framework.graphexplore.directives.rdfsdetails', [])\n .directive('rdfsCommentLabel', rdfsCommentLabelDirective)\n .constant('SHORT_COMMENT_LENGTH', 100);\n\nrdfsCommentLabelDirective.$inject = ['SHORT_COMMENT_LENGTH'];\n\nfunction rdfsCommentLabelDirective(SHORT_COMMENT_LENGTH) {\n return {\n restrict: 'AE',\n scope: {\n rdfsLabel: '=',\n rdfsComment: '=',\n expanded: '=',\n alwaysExpanded: '='\n },\n templateUrl: 'js/angular/graphexplore/templates/rdfsCommentLabelTemplate.html',\n link: function (scope, element) {\n scope.stringLimit = SHORT_COMMENT_LENGTH;\n scope.scrollToTop = function () {\n element[0].getElementsByClassName('rdfs-comment')[0].scrollTop = 0;\n };\n\n scope.checkCommentLength = function () {\n const commentLength = element[0].getElementsByClassName('rdfs-comment-text')[0].innerText.length;\n return commentLength < SHORT_COMMENT_LENGTH;\n };\n\n scope.equalHeights = function () {\n const commentHeight = element[0].getElementsByClassName('rdfs-comment-text')[0].innerHeight;\n if (commentHeight < 250 && scope.expanded) {\n element[0].getElementsByClassName('rdfs-comment')[0].innerHeight = commentHeight;\n }\n };\n\n scope.toggleFullComment = function () {\n scope.expanded = !scope.expanded;\n };\n\n scope.$watch('expanded || alwaysExpanded', function (value) {\n if (value) {\n scope.stringLimit = scope.rdfsComment.length;\n } else {\n scope.stringLimit = SHORT_COMMENT_LENGTH;\n }\n });\n }\n };\n}\n","import SVG from 'lib/common/svg-export';\nimport 'angular/rest/graph-data.rest.service';\n\nangular\n .module('graphdb.framework.graphexplore.directives.dependencies', [\n 'graphdb.framework.graphexplore.controllers.dependencies',\n 'graphdb.framework.rest.graphexplore.data.service'\n ])\n .directive('dependenciesChord', dependenciesChordDirective);\n\ndependenciesChordDirective.$inject = ['$repositories', 'GraphDataRestService'];\n\nfunction dependenciesChordDirective($repositories, GraphDataRestService) {\n return {\n restrict: 'A',\n template: '<div id=\"dependencies-chord\"></div>',\n scope: {\n dependenciesData: '='\n },\n link: linkFunc\n };\n\n function linkFunc(scope) {\n // Used http://bost.ocks.org/mike/uberdata/\n\n const drawChord = function (matrix, nodes) {\n\n // Don't try to draw chord for zero matrix\n if (isZeroMatrix()) {\n return;\n }\n\n const fill = d3.scale.category20();\n\n const tooltip = d3.select(\"body\").append(\"div\")\n .attr(\"class\", \"tooltip\")\n .style(\"opacity\", 0);\n d3.select(\"body\").on(\"click\", function () {\n tooltip.style(\"opacity\", 0);\n });\n\n const width = 800;\n const height = 800;\n const outerRadius = Math.min(width, height) / 2.8;\n const innerRadius = outerRadius - 24;\n\n const arc = d3.svg.arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius);\n\n const layout = d3.layout.chord()\n .padding(.04)\n .sortSubgroups(d3.descending)\n .sortChords(d3.ascending);\n\n const path = d3.svg.chord()\n .radius(innerRadius);\n\n const svg = d3.select(\"#dependencies-chord\").append(\"svg\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\n .style(\"font\", \"10px sans-serif\")\n .append(\"g\")\n .attr(\"id\", \"circle\")\n .attr(\"transform\", \"translate(\" + width / 2 + \",\" + height / 2 + \")\");\n\n svg.append(\"circle\")\n .attr(\"r\", outerRadius)\n .style(\"fill\", \"none\");\n\n // Compute the chord layout.\n layout.matrix(matrix);\n\n // Add a group per neighborhood.\n const group = svg.selectAll(\".group\")\n .data(layout.groups)\n .enter().append(\"g\")\n .attr(\"class\", \"group\")\n .on(\"mouseover\", mouseover);\n\n // Add a mouseover title.\n group.append(\"title\").text(function (d, i) {\n return nodes[i];\n });\n\n // Add the group arc.\n group.append(\"path\")\n .attr(\"id\", function (d, i) {\n return \"group\" + i;\n })\n .attr(\"d\", arc)\n .style(\"fill\", function (d, i) {\n return fill(i);\n });\n\n group.append(\"text\")\n .each(function (d) {\n d.angle = (d.startAngle + d.endAngle) / 2;\n })\n .attr(\"dy\", \".35em\")\n .attr(\"transform\", function (d) {\n return \"rotate(\" + (d.angle * 180 / Math.PI - 90) + \")\"\n + \"translate(\" + (innerRadius + 26) + \")\"\n + (d.angle > Math.PI ? \"rotate(180)\" : \"\");\n })\n .style(\"text-anchor\", function (d) {\n return d.angle > Math.PI ? \"end\" : null;\n })\n .text(function (d) {\n return nodes[d.index];\n });\n\n // Add the chords.\n const chord = svg.selectAll(\".chord\")\n .data(layout.chords)\n .enter().append(\"path\")\n .attr(\"class\", \"chord\")\n .style(\"fill\", function (d) {\n return fill(d.target.index);\n })\n .style(\"fill-opacity\", \".67\")\n .style(\"stroke\", \"#000\")\n .style(\"stroke-width\", \".25px\")\n .style(\"cursor\", \"pointer\")\n .attr(\"d\", path);\n\n chord.on(\"mouseover\", function () {\n d3.select(this).style({\"fill-opacity\": \"1\"});\n });\n\n chord.on(\"mouseout\", function () {\n d3.select(this).style({\"fill-opacity\": \".67\"});\n });\n\n chord.on(\"click\", function (d) {\n const sourceClass = nodes[d.source.index];\n const destinationClass = nodes[d.target.index];\n const px = d3.event.pageX;\n const py = d3.event.pageY;\n\n GraphDataRestService.getPredicates(sourceClass, destinationClass, scope.selectedGraph && scope.selectedGraph.contextID.uri)\n .success(function (predicatesData) {\n const directionIcon = \" <i class='fa fa-exchange'></i> \";\n const header = \"<div class='row'>\" + sourceClass + directionIcon + destinationClass + \"</div>\";\n const predicatesList = _.map(predicatesData.slice(0, 10), function (p) {\n const icon = \" <i class='fa fa-long-arrow-\" + (p.direction === \"out\" ? \"right\" : \"left\") + \"'></i>\";\n return \"<div class='row'>\" + p.predicate + \" : \" + p.weight + icon + \" </div>\";\n }).join(\"\");\n\n let tooltipContent = \"<div class='dependencies-tooltip'>\" + header + predicatesList;\n if (predicatesData.length > 10) {\n tooltipContent = tooltipContent + \"<div class='pull-right'>And \" + (predicatesData.length - 10).toString() + \" more...</div></div>\";\n } else {\n tooltipContent = tooltipContent + \"</div>\";\n }\n tooltip.html(tooltipContent)\n .style(\"left\", (px) + \"px\").style(\"top\", (py) + \"px\");\n });\n\n tooltip.transition()\n .duration(200)\n .style(\"opacity\", 1);\n });\n\n function mouseover(d, i) {\n chord.classed(\"fade\", function (p) {\n return p.source.index !== i\n && p.target.index !== i;\n });\n }\n\n /**\n * Checks if all values of the returned matrix are zero\n * @returns false if non zero value is found, true otherwise\n */\n function isZeroMatrix() {\n let zeroMatrix = true;\n\n for (const arr of matrix) {\n const nonZeroFound = arr.some(item => item !== 0);\n if (nonZeroFound) {\n zeroMatrix = false;\n break;\n }\n }\n\n return zeroMatrix;\n }\n\n d3.select(\"#circle\").on(\"mouseleave\", function () {\n svg.selectAll(\".chord\").classed(\"fade\", false);\n });\n\n /*\n * Prepares SVG document image export by adding xml namespaces and\n * additional style information\n */\n function prepareForSVGImageExport() {\n // convert selected html to base64\n const imgSrc = SVG.Export.generateBase64ImageSource();\n\n // set the binary image and a name for the downloadable file on the export button\n d3.select(this).attr({\n href: imgSrc,\n download: \"dependencies-\" + $repositories.getActiveRepository() + \".svg\"\n });\n }\n\n d3.select(\"#download-svg\")\n .on(\"mouseover\", prepareForSVGImageExport);\n };\n\n scope.$watch('dependenciesData', function () {\n if (scope.dependenciesData) {\n const data = scope.dependenciesData;\n drawChord(data.matrix, data.nodes, data.direction);\n }\n });\n }\n\n}\n","angular\n .module('graphdb.framework.graphexplore.directives.searchfilter', [])\n .directive('listItemsSearchFilter', listItemsSearchFilterDirective);\n\nlistItemsSearchFilterDirective.$inject = [];\n\nfunction listItemsSearchFilterDirective() {\n return {\n restrict: 'AE',\n scope: {\n filterQueryObj: '=',\n filterFunction: '&',\n listItemsObj: '=',\n listItemsNotFiltered: '=',\n searchPlaceholder: '@'\n },\n templateUrl: 'js/angular/graphexplore/templates/listItemsSearchFilterTemplate.html',\n link: function (scope) {\n\n function filter(searchQuery, data, nonFilteredData, customFilter) {\n if (searchQuery.length > 0) {\n return _.filter(nonFilteredData, customFilter);\n } else if (data.length !== nonFilteredData.length) {\n return nonFilteredData;\n }\n return data;\n }\n\n // unwrap callback filter function\n scope.filterFunction = scope.filterFunction();\n\n scope.$watch('filterQueryObj.query', function () {\n scope.listItemsObj.items = filter(\n scope.filterQueryObj.query,\n scope.listItemsObj.items,\n scope.listItemsNotFiltered,\n scope.filterFunction);\n });\n }\n };\n}\n","angular\n .module('graphdb.framework.graphexplore.directives.searchcontrols', [])\n .directive('searchIconInput', searchIconInputDirective);\n\nsearchIconInputDirective.$inject = ['$rootScope', '$timeout'];\n\nfunction searchIconInputDirective($rootScope, $timeout) {\n return {\n restrict: 'AE',\n scope: {\n searchData: '=',\n searchFields: '@',\n titleField: '@',\n searchPlaceholder: '@',\n initialValue: '=',\n searchedObjCallback: '&'\n },\n templateUrl: 'js/angular/graphexplore/templates/searchIconInputTemplate.html',\n link: function (scope, element) {\n scope.searchedObjCallback = scope.searchedObjCallback();\n\n scope.performSearchActionOnEnter = function () {\n $rootScope.$broadcast('onEnterKeypressSearchAction');\n };\n\n scope.showInput = function () {\n $('#selectGraphDropdown').hide();\n element.find('#search_input #search_input_value')[0].value = '';\n element.find('.search-icon')\n .addClass('animated bounceOut')\n .css('z-index', '-1');\n element.find('#search_input .angucomplete-holder')\n .css('display', 'block');\n $timeout(function () {\n element.find('#search_input .angucomplete-holder')\n .css('width', '250px')\n .css('left', '-215px');\n $timeout(function () {\n element.find('.close-icon')\n .css('display', 'block')\n .addClass('animated bounceIn')\n .css('z-index', '3');\n element.find('#search_input #search_input_value')\n .focus();\n }, 200);\n }, 1);\n };\n\n scope.hideInput = function () {\n element.find('#search_input #search_input_value')[0].value = '';\n element.find('#search_input .angucomplete-holder')\n .css('width', '0px')\n .css('left', '35px');\n $timeout(function () {\n element.find('#search_input .angucomplete-holder')\n .css('display', 'none');\n $('#selectGraphDropdown').show();\n }, 250);\n element.find('.close-icon')\n .addClass('animated bounceOut')\n .removeClass('bounceOut')\n .css('z-index', '-1')\n .css('display', 'none')\n // Hack needed to force close close-button tooltip in order not be\n // visible after icon is switched\n .click(function () {\n $('.tooltip').hide();\n });\n $timeout(function () {\n element.find('.search-icon')\n .css('display', 'inline-block')\n .removeClass('bounceOut')\n .addClass('bounceIn')\n .css('z-index', '3');\n }, 200);\n };\n }\n };\n}\n"],"sourceRoot":""}
|